开发出的exe程序经常因各种情况出现崩溃,为了得到崩溃原因,保存日志:
main 函数加入
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);
static LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException)
{
EXCEPTION_RECORD *record = pException->ExceptionRecord;
QString errCode(QString::number(record->ExceptionCode, 16));
QString errAddr(QString::number((uint)record->ExceptionAddress, 16));
QString errFlag(QString::number(record->ExceptionFlags, 16));
QString errPara(QString::number(record->NumberParameters, 16));
qDebug()<<"errCode: "<<errCode;
qDebug()<<"errAddr: "<<errAddr;
qDebug()<<"errFlag: "<<errFlag;
qDebug()<<"errPara: "<<errPara;
QString DumpFilePath = qApp->applicationDirPath();
DumpFilePath.append("\\config").append("\\").append(QDateTime::currentDateTime().toString("yyyyMMddhhmmss")).append(".dmp");
HANDLE hDumpFile = CreateFile((LPCWSTR)DumpFilePath.utf16(),
GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if(hDumpFile != INVALID_HANDLE_VALUE) {
MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
dumpInfo.ExceptionPointers = pException;
dumpInfo.ThreadId = GetCurrentThreadId();
dumpInfo.ClientPointers = TRUE;
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
CloseHandle(hDumpFile);
qDebug()<<("gener dmp file")<<DumpFilePath;
}
QString msg ="";
msg.append("restart").append(DumpFilePath);
qWarning(qPrintable(msg));
::SetCursor(LoadCursor(NULL, IDC_ARROW));
QProcess process;
process.execute("TASKKILL /IM EthDcrMiner64.exe /F");
process.close();
QString program = QApplication::applicationFilePath();
QStringList arguments = QApplication::arguments();
// QString workingDirectory = QDir::currentPath();
QString workingDirectory = qApp->applicationDirPath();
QApplication::exit();
QProcess::startDetached(program, arguments, workingDirectory);
return EXCEPTION_EXECUTE_HANDLER;
}