仿佛是忽然间产生的问题,每次程序退出时候,必然崩溃,花了整整一天才找到原因,就是对数据库的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. SSRS和SSAS是支持VB的

    SSRS和SSAS是支持VB的,而且自定义Code其实也是只支持VB,或者其他语言可以编码成DLL再用咯.下面是官方VB函数库,基本上都能用,保存起来妥妥的. https://msdn.microso ...

  2. 11_Servlet的一些细节知识点

    [Servlet的细节知识点1-----一个Servlet映射到多个URL] 同一个Servlet可以被映射到多个URL上,即多个<servlet-mapping>元素的<servl ...

  3. Pascal Language: Recommended Materials

    Recommended materials: http://www.marcocantu.com/epascal/

  4. [Guava官方文档翻译] 6. 用Guava辅助Throwable异常处理 (Throwables Explained)

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3537508.html ,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体 ...

  5. OpenJudge/Poj 1458 Common Subsequence

    1.链接地址: http://poj.org/problem?id=1458 http://bailian.openjudge.cn/practice/1458/ 2.题目: Common Subse ...

  6. C++学习 (转)

    1.把C++当成一门新的语言学习: 2.看<Thinking In C++>: 3.看<The C++ Programming Language>和<Inside The ...

  7. PXE安装linux系统

    利用网络安装系统流程:1.配置dhcp,让客户端能够自动获取ip,在dhcp配置中添加pxelinux.0配置,使客户端连接tftp文件2.复制光盘镜像的isolinux文件夹下面的所有文件到tftp ...

  8. Javascript中的迭代、归并方法

    迭代方法 在Javascript中迭代方法个人觉得尤为重要,在很多时候都会有实际上的需求,javascript提供了5个迭代方法来供我们操作,它们分别为: every() 对数组中的每一个项运用给定的 ...

  9. Ubuntu 14.04为浏览器添加Flash插件

    在刚安装好到Ubuntu操作系统中默认是没有flash支持到,因此,当我们使用浏览器查看很多视频网页到时候,会导致网页上到视频无法播放.然而,这个问题我们也不能够通过“软件中心”来解决,这时候需要我们 ...

  10. npm:Node.js的软件包管理器

    npm https://www.npmjs.com/ 2016-08-03