Windows下release版程序崩溃如何定位到代码段?



  • 代码:
    void Dialog::on_btnTestCrash_clicked()
    {
    QWidget * w;
    w->show();
    }

    程序崩溃后,我生成了崩溃日志,显示的异常地址是在Qt5Widgets.dll中的61E088AB

    Windows: 6.1.7601, SP 1.0, Product Type 1
    Process: E:\build-TestCrash-Qt_5_4_2_MinGW491-Release\release\TestCrash.exe
    Exception Addr: 61E088AB Module: C:\Qt\Qt5.4.2\5.4\mingw491_32\bin\Qt5Widgets.dll
    Exception Code: C0000005
    Read Address: 00000014
    Instruction: 8B 53 14 8B 08 8B 52 08 8B 01 89 14 24 FF 50 4C
    Registers:
    EAX: 00EAC33C EBX: 00000000 ECX: 00000000 EDX: 0028FE14
    ESI: 0028FE14 EDI: 0028D408 ESP: 0028D2E0 EBP: 0028D3D8
    EIP: 61E088AB EFlags: 00010202
    Call Stack:
    61E088AB C:\Qt\Qt5.4.2\5.4\mingw491_32\bin\Qt5Widgets.dll
    6212F57C C:\Qt\Qt5.4.2\5.4\mingw491_32\bin\Qt5Widgets.dll

    这个是我生成的asm文件
    00401ea0 <__ZN6Dialog23on_btnTestCrash_clickedEv>:

    void Dialog::on_btnTestCrash_clicked()
    {
    int *p = NULL;
    *p = 4;
    401ea0: c7 05 00 00 00 00 00 movl $0x0,0x0
    401ea7: 00 00 00
    401eaa: 0f 0b ud2
    401eac: 90 nop
    401ead: 90 nop
    401eae: 90 nop
    401eaf: 90 nop



  • @调味料 如果不能定位到调试版的话,那么需要使用分段注释的方法。也就是将你认为最有可能出现问题的代码注释掉。分段确定问题。还有一个办法就是对class的构造函数和析构函数使用一个类多继承之,提供钩子方法,然后在钩子方法中使用类似操作系统延时的方法或者程序暂停,这样可以让快速崩溃的效果看上去慢一点,动作分解一下。


Log in to reply
 

走马观花

最近的回复

  • 如果对操作不是很熟悉或者是操作不便的话,也可以在Windows的命令行执行NDK的安装。参数是一样的:
    Windows命令行安装NDK

    read more
  • 忘记补充图片了。这里需要点击更新安装才行。😆
    点击更新安装

    read more
  • 问:
    如何在Qt Creator安装NDK呢?
    除了那个🔽 按钮外,还有别的办法吗?
    答:
    Qt Creaator 4.11中更加整合了Android SDK Manager。其实大家都可以不运行默认的Android SDK Manager,直接在Qt Creator中选项->设备->Android,就可以进行操作了。

    通过````高级选项……,启动一些Android SDK Manager,只需要带上参数ndk-bundle```。原来没有NDK的你,也可以通过Android SDK Manager安装了。很简单吧。
    Android SDK Manager安装NDK

    read more
  • 挺好的分享,谢谢。1515759557.jpg

    read more

关注我们

微博
QQ群