Qt 利用 dmp 文件进行调试

一,环境

windows+msvc2015+Qt 5.10

 

二,release 生成 pdb 文件

(1),D:\Qt\Qt5.10.1\5.10.1\msvc2015\mkspecs\common 

QMAKE_CFLAGS_RELEASE     = -O2 -MD -Zi
QMAKE_LFLAGS_RELEASE     = /INCREMENTAL:NO /DEBUG

(2) Qt pro文件

QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO

三, main 函数

#include <DbgHelp.h>
#pragma comment(lib,"Dbghelp.lib")

long  __stdcall CrashInfocallback(_EXCEPTION_POINTERS *pexcp)
{
    //创建 Dump 文件
    HANDLE hDumpFile = ::CreateFile(
                L"MEMORY.DMP",
                GENERIC_WRITE,
                0,
                NULL,
                CREATE_ALWAYS,
                FILE_ATTRIBUTE_NORMAL,
                NULL
                );
    if (hDumpFile != INVALID_HANDLE_VALUE)
    {
        //Dump信息
        MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
        dumpInfo.ExceptionPointers = pexcp;
        dumpInfo.ThreadId = GetCurrentThreadId();
        dumpInfo.ClientPointers = TRUE;
        //写入Dump文件内容
        ::MiniDumpWriteDump(
                    GetCurrentProcess(),
                    GetCurrentProcessId(),
                    hDumpFile,
                    MiniDumpNormal,
                    &dumpInfo,
                    NULL,
                    NULL
                    );
    }
    return 0;
}



int main(int argc, char *argv[])
{
    GlobalApplication app(argc, argv);
    ::SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)CrashInfocallback);

    //测试用
     int *p=nullptr;
     *p=100;
}

三,加载 dmp  和pdb 文件,定位问题

(1), 双击 dmp 文件,用vs 打开

(2),

(3), 点击  仅限本机 进行调试

(4),

备注:如果工程同时加载了 easyloggin++ 日志,则pro配置中需要 取消错误打印选项 ,否则不会生成dmp 文件,因为错误被这个库 捕获了 但是它还记录不了太多有用的信息

四,利用工具生成 dump文件

(1),Procdump64.exe

  • 下载procdump:

     https://docs.microsoft.com/en-us/sysinternals/downloads/procdump

或者下p载sysinternal suites

https://docs.microsoft.com/zh-cn/sysinternals/downloads/sysinternals-suite

  • 把里面的procdump64.exe拷贝到用户的机器上(procdump.exe是32bit,估计现在一般都是64位的)
  • 打开命令行cmd,切换目录到procdump所在的目录。比如:D:\sysinternals

     cd D:\sysinternals  ->  D:

  • 在任务管理器里找到运行成的进程id(Pid),比如:

  • 然后在命令行输入:

procdump64.exe -ma -t 19104。程序挂了的时候会在procdump所在的目录下生成一个dump文件。

(2),直接在任务管理器获取dump

在任务管理器里面找到对应的进程,右键-> 创建转储文件(create dump file)。弹一个对话框会显示保存文件的位置:

(3),使用windbg

如果客户没有实现加代码的方式保存dump,并且这个crash必现或者复现概率比较高,可以直接使用windbg:

  1. 安装好windbg 打开windbg
  2. Windbg -> File -> Open Executable
  3. 找到运行程序的exe文件
  4. 在命令行输入命令 .dump /f 全路径(建议文件后缀名.dmp)

第(2)(3)可以使用其他方式

  。Windbg -> File -> Attahc to Process

  。选择正在运行的进程,选中,点击OK。

 

这时就会在指定路径生成full dump,比较大,Dmp文件压缩一下。

 

 

管理员权限启动控制台,进入到下面debugging Tools安装目录下,

32位进程进到x86(C:\Program Files (x86)\Windows Kits\10\Debuggers\x86),

64位进程进到x64(C:\Program Files (x86)\Windows Kits\10\Debuggers\x64),

输入 "gflags /i xxx.exe +ust",xxx.exe是目标进程名。

五,利用windbg 分析dump文件

下载地址:https://docs.microsoft.com/zh-cn/windows-hardware/drivers/debugger/debugger-download-tools

(1)下载微软符号文件,先创建一个本地文件夹,比如:D:\jira\mysymbols

(2)File -> Symbol File Path。在弹框中输入:

SRV*D:\jira\mysymbol*http://msdl.microsoft.com/download/symbols;D:\jira\mysymbol;

这时候会把用到的微软符号文件,下载到本地路径。;分号后面代表如果需要会加载这个路径下的pdb文件。

(3)打开dump文件,可以直接拖进来。也可以 File -> Open Crash dump File

(4)可以直接在下面的编辑框输入!analyze -v指令。或者直接点击这个指令

 

 

 

(5)如果挂在agora_rtc_sdk,MODULE_NAME就是这个名字,直接点击会出现一个日期。

  然后到服务器去找对应版本比较接近的日期的pdb文件。一般压缩包的日期会比这个时间稍微的晚一点。Pdb下载地址:

https://release.agoralab.co/disk/或者内部可以去149下载

 

(6)File -> Symbol File Path。在弹框中附加上放sdk的符号文件的路径,用;区分开。选中Reload,确定。再次输入!analyze -v指令。

 

 

 

参考:https://www.pianshen.com/article/469258720/

https://blog.csdn.net/u014552102/article/details/82026592

https://www.cnblogs.com/FKdelphi/p/10731775.html

 

 

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

土拨鼠不是老鼠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值