linux下qt程序如何产生dmp,Qt生成dump文件

Qt生成dump文件

Qt生成dump文件

1、编译时生成pdb文件:

在.pro文件中加两行配置

QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO

QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO

然后重新编译,即可在exe文件的目录下生成.pdb文件。

2、项目中增加崩溃时生成dump文件的代码

#include

#include

#include

#include

#pragma comment(lib, "user32.lib")

int GenerateMiniDump(PEXCEPTION_POINTERS pExceptionPointers)

{

// 定义函数指针

typedef BOOL(WINAPI * MiniDumpWriteDumpT)(

HANDLE,

DWORD,

HANDLE,

MINIDUMP_TYPE,

PMINIDUMP_EXCEPTION_INFORMATION,

PMINIDUMP_USER_STREAM_INFORMATION,

PMINIDUMP_CALLBACK_INFORMATION

);

// 从 "DbgHelp.dll" 库中获取 "MiniDumpWriteDump" 函数

MiniDumpWriteDumpT pfnMiniDumpWriteDump = NULL;

HMODULE hDbgHelp = LoadLibrary(L"DbgHelp.dll");

if (NULL == hDbgHelp)

{

return EXCEPTION_CONTINUE_EXECUTION;

}

pfnMiniDumpWriteDump = (MiniDumpWriteDumpT)GetProcAddress(hDbgHelp, "MiniDumpWriteDump");

if (NULL == pfnMiniDumpWriteDump)

{

FreeLibrary(hDbgHelp);

return EXCEPTION_CONTINUE_EXECUTION;

}

// 创建 dmp 文件件

wchar_t szFileName[MAX_PATH] = { 0 };

wchar_t szVersion[] = L"DumpFile";

SYSTEMTIME stLocalTime;

GetLocalTime(&stLocalTime);

wsprintf(szFileName, L"%s-%04d%02d%02d-%02d%02d%02d.dmp",

szVersion, stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay,

stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond);

HANDLE hDumpFile = CreateFile(szFileName, GENERIC_READ | GENERIC_WRITE,

FILE_SHARE_WRITE | FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);

if (INVALID_HANDLE_VALUE == hDumpFile)

{

FreeLibrary(hDbgHelp);

return EXCEPTION_CONTINUE_EXECUTION;

}

// 写入 dmp 文件

MINIDUMP_EXCEPTION_INFORMATION expParam;

expParam.ThreadId = GetCurrentThreadId();

expParam.ExceptionPointers = pExceptionPointers;

expParam.ClientPointers = FALSE;

pfnMiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),

hDumpFile, MiniDumpWithDataSegs, (pExceptionPointers ? &expParam : NULL), NULL, NULL);

// 释放文件

CloseHandle(hDumpFile);

FreeLibrary(hDbgHelp);

return EXCEPTION_EXECUTE_HANDLER;

}

LONG WINAPI ExceptionFilter(LPEXCEPTION_POINTERS lpExceptionInfo)

{

// 这里做一些异常的过滤或提示

if (IsDebuggerPresent()) {

return EXCEPTION_CONTINUE_SEARCH;

}

return GenerateMiniDump(lpExceptionInfo);

}

main函数中调用:

SetUnhandledExceptionFilter(ExceptionFilter);

3、模拟错误代码以测试

void main()

{

SetUnhandledExceptionFilter(ExceptionFilter);

int aa = 3;

int bb = 0;

int cc = aa/bb;

qDebug()<

}

编译代码后,运行可执行文件,会在exe同目录下生成dump文件。

4、通过dump文件分析bug

将dump、pdb文件拷贝到源码所在目录下

linux下qt程序如何产生dmp,Qt生成dump文件_第1张图片

用vs文件打开dump文件,右侧设置符号路径

linux下qt程序如何产生dmp,Qt生成dump文件_第2张图片

linux下qt程序如何产生dmp,Qt生成dump文件_第3张图片

点击“仅限本机进行调试”

linux下qt程序如何产生dmp,Qt生成dump文件_第4张图片

代码会跳转到出错的地方,便定位了问题代码。

注意事项:release和debug版本的.pdb文件是不同的,需各自使用各自的。

Qt生成dump文件相关教程

你可能感兴趣的:(linux下qt程序如何产生dmp,Qt生成dump文件)