在我们的程序崩溃的时候,往往是不容易查找运行到哪一步出错了,或者是不容易查找崩溃的原因,这时候我们可以引进windows的api 来进行系统级别的崩溃日志收集,当应用程序崩溃时候自动生成.dump崩溃日志文件。
需要头文件
#include <Dbghelp.h>
定义一个方法
static LONG WINAPI exceptionCallback(struct _EXCEPTION_POINTERS* exceptionInfo)
{
Application *app = Application::app();
QString savePath = app->binPath() + "dump/";
QDir dir(savePath);
if (!dir.exists() && !dir.mkpath(savePath)) {
app->exit(E_UNEXPECTED);
return EXCEPTION_EXECUTE_HANDLER;
}
savePath.append("assit_");
savePath.append(QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz"));
savePath.append(".dmp");
HANDLE dump = CreateFileW(savePath.toStdWString().c_str(), GENERIC_WRITE,
0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (INVALID_HANDLE_VALUE == dump) {
app->exit(E_UNEXPECTED);
return EXCEPTION_EXECUTE_HANDLER;
}
MINIDUMP_EXCEPTION_INFORMATION miniDumpExceptionInfo;
miniDumpExceptionInfo.ExceptionPointers = exceptionInfo;
miniDumpExceptionInfo.ThreadId = GetCurrentThreadId();
miniDumpExceptionInfo.ClientPointers = TRUE;
DWORD idProcess = GetCurrentProcessId();
MiniDumpWriteDump(GetCurrentProcess(), idProcess, dump,
MiniDumpNormal, &miniDumpExceptionInfo, NULL, NULL);
CloseHandle(dump);
app->exit(E_UNEXPECTED);
return EXCEPTION_EXECUTE_HANDLER;
}
在main函数,或者初始化之后,进行调用:
SetUnhandledExceptionFilter(exceptionCallback);
这样在软件崩溃之后,就会自动生成崩溃日志.
特别需要记住的一点 ,就是dmp文件必须与.pdb文件联合使用,才能定位问题,所以,每个版本的exe,必须保存与之对应的.pdb文件。
QT 对于debug版本,会自动生成.pdb文件。
对于release版本,自动默认不会生成.pdb文件。
那么下一个问题就是QT项目中,怎样让release版本怎样生成pdb文件?
解决方案:
在pro配置文件中,添加:
QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO