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的构造函数和析构函数使用一个类多继承之,提供钩子方法,然后在钩子方法中使用类似操作系统延时的方法或者程序暂停,这样可以让快速崩溃的效果看上去慢一点,动作分解一下。


登录后回复
 

与 萌梦社区 的连接断开,我们正在尝试重连,请耐心等待