说明
客户现场的软件偶发崩溃是程序开发者,比较头疼的事情。如何更快速的定位到问题点和解决掉,是开发应该具备的基本能力。
Windows提供了一系列的API,可以记录软件崩溃前的堆栈信息。下面就实现一个生成Dump文件的程序实例。
主要代码
回调AppExceptionCallback
#ifdef Q_OS_WIN
#include <windows.h>
#include <dbgHelp.h>
#endif
#ifdef Q_OS_WIN
#pragma comment(lib, "dbghelp.lib")
LONG WINAPI AppExceptionCallback(struct _EXCEPTION_POINTERS* ExceptionInfo)
{
QString logFile = QApplication::applicationDirPath() + "/Log";
if (!QDir(logFile).exists())
{
QDir().mkdir(logFile);
}
QString dumpName = QString("%1/%2.dmp").arg(logFile).arg(QDateTime::currentDateTime().toString("yyyy_MM_dd hh_mm_ss"));
HANDLE hDumpFile = CreateFileW(dumpName.toStdWString().c_str(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);
if (hDumpFile != INVALID_HANDLE_VALUE)
{
MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
dumpInfo.ThreadId = GetCurrentThreadId();
dumpInfo.ExceptionPointers = ExceptionInfo;
dumpInfo.ClientPointers = TRUE;
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpWithDataSegs, ExceptionInfo ? &dumpInfo : nullptr, nullptr, nullptr);
CloseHandle(hDumpFile);
}
QMessageBox::critical(nullptr, QString("Application Error"), QString("Application is Crash!"), QMessageBox::Ok);
return EXCEPTION_EXECUTE_HANDLER;
}
#endif
main函数调用SetUnhandledExceptionFilter
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
#ifdef Q_OS_WIN
SetUnhandledExceptionFilter(AppExceptionCallback);
#endif
Widget w;
w.show();
return a.exec();
}
编译问题
问题解决办法,记录在另一篇文章: