一个庞大的工程往往代码量很大,放在不同电脑上运行,有崩溃的现象发生,但查找起来很麻烦,所以利用windows的dmp文件定位程序崩溃的地方,能快速解决问题。本人用qt开发伺服驱动器上位机,别人用着崩溃了,但又是多人合作开发,谁都不知道是谁的代码错了,唯有定位错误才能解决了,所以亲身经历,总结一下。
一、首先qt dmp文件的生成
1、在pro文件里添加
QMAKE_CFLAGS_RELEASE = -O2 -MD -Zi
QMAKE_LFLAGS_RELEASE = /INCREMENTAL:NO /DEBUG
QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO
2、在main.c文件里添加一个函数
//程式异常捕获
LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException)
{
//创建 Dump 文件,可选路径
HANDLE hDumpFile = CreateFile(L"crash.dmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hDumpFile != INVALID_HANDLE_VALUE)
{
//Dump信息
MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
dumpInfo.ExceptionPointers = pException;
dumpInfo.ThreadId = GetCurrentThreadId();
dumpInfo.ClientPointers = FALSE;
//写入Dump文件内容
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
}
return EXCEPTION_EXECUTE_HANDLER;
}
然后在主函数里注册下。
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);//注冊异常捕获函数
那么这个程序崩溃就能生成dmp文件了。
可以以下代码测试下。
QLabel* lb;
lb->setText("hello world");
二、dmp文件的分析
一种是用WinDbg软件,一种是Vs软件,个人觉得vs软件分析简便写,所以这里我就只分析vs软件如何解析dmp文件了。
1、首先用VS软件打开dmp文件。
2、点击右上角的设置符号路径。
主要是配置pdb文件的路径。
这里需要3类的符号路径。
1是系统的pdb文件。如果第一次使用,勾选符号服务器,然后设定在此目录下缓存符号。第一次下载比较漫长,要等待很久。第二次及以后使用的话,就取消勾选符号路径,把缓存符号的路径加上去就可以了。这样就不用下载了。
2是qt工程生成的pdb文件。编译器会生成一个pdb文件,一般跟exe文件同目录下,如果你把这个exe发给别人,记得保存好这个pdb文件,不然没办法准确定位出代码。
3是qt源代码的pdb文件。这个需要去官网下载自己对应的qt版本的pdb文件。
3、设置好pdb文件路径,点击使用仅限本机进行调试,你会发现一片新天地。