一种Release版本崩溃/闪退调试方法
Debug模式调试断点、步进追溯源码都很方便。但是当多个模块发布Release版本,集成应用过程中偶发性闪退或者崩溃。而此时又无法用Debug相关调试信息...这就比较棘手了。
本文采用Windbg.exe来定位相关问题所在源码位置,便于更正。
1、源码中添加dmp文件输出
#include <windows.h>
#include <DbgHelp.h>
#pragma comment( lib, "Dbghelp.lib" )
//程式异常捕获
LONG WINAPI ApplicationCrashHandler(EXCEPTION_POINTERS* pException)
{
//创建 Dump 文件
HANDLE hDumpFile = CreateFile(TEXT("crash.dmp"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); // crash.dmp 崩溃生成文件名
if (hDumpFile != INVALID_HANDLE_VALUE)
{
//Dump信息
MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
dumpInfo.ExceptionPointers = pException;
dumpInfo.ThreadId = GetCurrentThreadId();
dumpInfo.ClientPointers = TRUE;
//写入Dump文件内容
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
}
//这里弹出一个错误对话框并退出程序
//QMessageBox::critical(NULL, "程序崩溃", "抱歉,请联系JCXY解决!");
return EXCEPTION_EXECUTE_HANDLER;
}
# main函数或DllMain中添加如下语句
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);//注册异常捕获函数
完整示例如下:------------示例 start-----------------
#include <iostream>
#include <windows.h>
#include <DbgHelp.h>
#pragma comment( lib, "Dbghelp.lib" )
//程式异常捕获
LONG WINAPI ApplicationCrashHandler(EXCEPTION_POINTERS* pException)
{
//创建 Dump 文件
HANDLE hDumpFile = CreateFile(TEXT("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 = TRUE;
//写入Dump文件内容
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
}
//这里弹出一个错误对话框并退出程序
//QMessageBox::critical(NULL, "程序崩溃", "抱歉,请联系JCXY解决!");
return EXCEPTION_EXECUTE_HANDLER;
}
int main()
{
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);//注册异常捕获函数
int a = 1;
int b = 0;
printf("%d\n", a / b);
}
------------------------------示例 end-----------------------------------------------
2、编译生成release版本。
(此处项目名为MyProject)
3、双击exe运行。
(生成crash.dmp)
4、打开Windbg
按exe是X64/X86选择是WinDbg对应应用。
5、File -> Open Crash Dump... 选取crash.dmp文件。
6、在下图命令行输入.sympath srv*C:\Symbols*https://msdl.microsoft.com/download/symbols
绿色字体为symbols路径,按实际需求更改
#语法格式srv*{cache path}*{symbol server}
7、分析崩溃的位置
同样位置输入
!analyze -v
然后从相关信息中就可以找到问题所在啦!
总结:
一、生成dmp文件
二、windbg分析dmp文件
1、打开crash dump 文件
2、设置symbol路径:.sympath srv*C:\Symbols*https://msdl.microsoft.com/download/symbols
(C:\Symbols按实际要求更改)
3、分析崩溃位置:!analyze -v