仿佛是忽然间产生的问题,每次程序退出时候,必然崩溃,花了整整一天才找到原因,就是对数据库的IO读写错误。主要是因为析构函数调用了Disconnect函数,内容如下:

void SFTPTool::Disconnect()
{
    if (!m_valided)
        IsCompteValide();
    if (!m_valided) {
        return;
    }
    QString strModule = "soft";
    if (!m_taskname.isEmpty()) strModule = m_taskname;
    m_sftp->Disconnect();
    // super exp 使用登录框时,没有初始化m_lite实例,此时插入日志,程序必然崩溃!
    if (SystemGlobal::m_lite) // hang exp 这样可以解决登录框的问题,但无法解决正常退出的问题(估计是全局远程连接造成的问题)
        SystemGlobal::m_lite->InsertLog("task", strModule, "disconnect", tr("disconnect by soft"));
}

崩溃的原因有两种情况:

1. 使用登录框的时候,因为System::m_lite在主界面MainWidget的构造函数中实例化,所以必然失败。这个问题通过加上if (SystemGlobal::m_lite)可以解决。

2. 软件主界面退出时,仍然出错,还是因为红色的句子。我想可能是因为有个g_sftp实例晚于主界面被析构(因为是静态实例),此时主界面都没有了,因此数据库实例也被析构了,然后在内存中把全局实例析构,就发生了错误。

综合以前的经验,教训总结:碰到IO错误,程序必然崩溃。碰到内存错误,有时候崩溃有时候不崩溃,有可能会产生误用数据而不一定崩溃。除非读写OS保护区域的内存,才会必然崩溃。使用野指针都不一定崩溃。

MainWidget::~MainWidget()
{
    SystemGlobal::m_lite->InsertLog("app", "soft", "exit");
    // exp 使用全局锁居然会出错 fixme 各对象的析构顺序是怎样的?
    if (SystemGlobal::m_lite) {
        delete SystemGlobal::m_lite; // OO 删除内存对象,不是删除日志数据库文件。这样万无一失,可随时停止日志
        SystemGlobal::m_lite = NULL; // Archi 即使在主界面中析构,也仍然要把指针赋予空值,因为全局内存对象析构比主界面还晚,因此仍会出错
    }
    if (SystemGlobal::m_index) {
        delete SystemGlobal::m_index;
        SystemGlobal::m_index = NULL;
    }
}

经试验,在主界面中把指针赋予空值也可解决问题。

综合经验:IO读写错误必然导致程序崩溃的更多相关文章

  1. WPF 线程中异常导致程序崩溃

    一般我们WPF中都加全局捕获,避免出现异常导致崩溃. Application.Current.DispatcherUnhandledException += Current_DispatcherUnh ...

  2. 头疼3-4次的问题,数据从DB导出到EXCEL,再从EXCEL导入到DB,数据格式发生错误 ,导致 程序出错。

    反思: 1 解决 问题的思路 绕远了: 在这个问题出现前,程序是运行正确 的 问题出现前,我误删了DB 的 testcase表的所有 case ,然后 再把邮件 中的excel数据导入到 DB 然后 ...

  3. 防止Form中嵌入WebBrowser出错导致程序崩溃

     siow(1253366)  10:11:13两种方法你用的自带的webbrowser还是embeded那个毛小毛(3335076)  10:12:15或者有什么办法拦截到是webbrowser,如 ...

  4. 解决Qt中QTableWidget类方法setItem 时导致程序崩溃问题

    在为一个音乐播放器增加功能时莫明奇妙的出现程序崩溃,定位到是由于QTableWidget 的setItem方法导致的,最终在此处找到了解决方式. 大致是说不能在setItem之前连接cellChang ...

  5. setSupportActionBar(toolbar)导致程序崩溃闪退

    最近在做一个项目,使用了第三方的开源项目,主要是想实现android5.0之后推出的MaterialDesign的风格,但是代码已经写好了,发现一运行就闪退,所以就开始debug,发现问题出现在 To ...

  6. c# Linq Where 抛出异常 导致 程序崩溃

    Collection was modified; enumeration operation may not execute" 这次项目中遇到一个问题, 就是C#程序随机崩溃, 抛出上面的异 ...

  7. Visual Studio 调试系列8 查找导致程序崩溃的 DLL(使用模块窗口)

    系列目录     [已更新最新开发文章,点击查看详细] 如果应用程序在调用系统 DLL 或他人的代码时崩溃,则需要找出在崩溃发生时处于活动状态的 DLL. 如果在自己的程序之外的 DLL 中遇到崩溃, ...

  8. Android While 循环导致的资源占用过高进而导致程序崩溃问题

    Timeline: Activity_launch_request time:6562004-14 15:31:25.347: I/dalvikvm(3483): Total arena pages ...

  9. 安装glibc错误链接导致系统崩溃,u盘启动紧急救援模式下修复系统。

    Sln 命令  创建动态符号链接 用法 sln source  dest 故障案例:一个误操作 导致了一个不小的故障,输入所有命令都无效,直接系统无法启动. 故障描述 sln /usr/lib64/l ...

随机推荐

  1. 如何在Windows系统上用抓包软件Wireshark截获iPhone等网络通讯数据

    http://www.jb51.net/os/windows/189090.html 今天给大家介绍一种如何在Windows操作系统上使用著名的抓包工具软件Wireshark来截获iPhone.iPa ...

  2. 使用netbeans 搭建 JSF+SPRING 框架

    spring版本使用4,jsf版本2.2 jsf的配置文件faces-config.xml <?xml version='1.0' encoding='UTF-8'?> <faces ...

  3. 命令行创建Android应用,生成签名,对APK包签名并编译运行

    一.命令行创建Android应用 android create project -n HelloWorld -t android-22 -p HelloWorld1 -k org.crazyit.he ...

  4. myeclipse的新建severlet不见解决方法

    点击myeclipse中的window菜单里面选择myeclipse java Enterprise 选项就可以恢复到默认.

  5. C# Generic(转载)

    型(generic)是C#语言2.0和通用语言运行时(CLR)的一个新特性.泛型为.NET框架引入了类型参数(type parameters)的概念.类型参数使得设计类和方法时,不必确定一个或多个具体 ...

  6. 九度OJ 1351 数组中只出现一次的数字

    题目地址:http://ac.jobdu.com/problem.php?pid=1351 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 输 ...

  7. win7上帝模式

    在win7 系统桌面或任意磁盘下新建文件夹,将文件夹改名为 GodModel.{ED7BA470-8E54-465E-825C-99712043E01C}

  8. HDOJ(1001) Sum Problem

    这一套题做错了几次,按理说直接用等差数列求和公式就行了,主要是要考虑一些运算符的结核性问题: 四则运算符(+.-.*./)和求余运算符(%)结合性都是从左到右. 于是,我自己写了一个版本,主要是考虑( ...

  9. Ajax跨域请求——PHP服务端处理

    header('Access-Control-Allow-Origin:*'); // 响应类型 header('Access-Control-Allow-Methods:POST'); // 响应头 ...

  10. javascripct数组

    定义数组 数组对象用来在单独的变量名中存储一系列的值. 我们使用关键词 new 来创建数组对象.下面的代码定义了一个名为 myArray 的数组对象: var myArray=new Array() ...