一,环境
windows+msvc2015+Qt 5.10
二,release 生成 pdb 文件
(1),D:\Qt\Qt5.10.1\5.10.1\msvc2015\mkspecs\common
QMAKE_CFLAGS_RELEASE = -O2 -MD -Zi
QMAKE_LFLAGS_RELEASE = /INCREMENTAL:NO /DEBUG
(2) Qt pro文件
QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO
三, main 函数
#include <DbgHelp.h>
#pragma comment(lib,"Dbghelp.lib")
long __stdcall CrashInfocallback(_EXCEPTION_POINTERS *pexcp)
{
//创建 Dump 文件
HANDLE hDumpFile = ::CreateFile(
L"MEMORY.DMP",
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (hDumpFile != INVALID_HANDLE_VALUE)
{
//Dump信息
MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
dumpInfo.ExceptionPointers = pexcp;
dumpInfo.ThreadId = GetCurrentThreadId();
dumpInfo.ClientPointers = TRUE;
//写入Dump文件内容
::MiniDumpWriteDump(
GetCurrentProcess(),
GetCurrentProcessId(),
hDumpFile,
MiniDumpNormal,
&dumpInfo,
NULL,
NULL
);
}
return 0;
}
int main(int argc, char *argv[])
{
GlobalApplication app(argc, argv);
::SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)CrashInfocallback);
//测试用
int *p=nullptr;
*p=100;
}
三,加载 dmp 和pdb 文件,定位问题
(1), 双击 dmp 文件,用vs 打开
(2),
(3), 点击 仅限本机 进行调试
(4),
备注:如果工程同时加载了 easyloggin++ 日志,则pro配置中需要 取消错误打印选项 ,否则不会生成dmp 文件,因为错误被这个库 捕获了 但是它还记录不了太多有用的信息
四,利用工具生成 dump文件
(1),Procdump64.exe
- 下载procdump:
https://docs.microsoft.com/en-us/sysinternals/downloads/procdump
或者下p载sysinternal suites
https://docs.microsoft.com/zh-cn/sysinternals/downloads/sysinternals-suite
- 把里面的procdump64.exe拷贝到用户的机器上(procdump.exe是32bit,估计现在一般都是64位的)
- 打开命令行cmd,切换目录到procdump所在的目录。比如:D:\sysinternals
cd D:\sysinternals -> D:
- 在任务管理器里找到运行成的进程id(Pid),比如:
- 然后在命令行输入:
procdump64.exe -ma -t 19104。程序挂了的时候会在procdump所在的目录下生成一个dump文件。
(2),直接在任务管理器获取dump
在任务管理器里面找到对应的进程,右键-> 创建转储文件(create dump file)。弹一个对话框会显示保存文件的位置:
(3),使用windbg
如果客户没有实现加代码的方式保存dump,并且这个crash必现或者复现概率比较高,可以直接使用windbg:
- 安装好windbg 打开windbg
- Windbg -> File -> Open Executable
- 找到运行程序的exe文件
- 在命令行输入命令 .dump /f 全路径(建议文件后缀名.dmp)
第(2)(3)可以使用其他方式
。Windbg -> File -> Attahc to Process
。选择正在运行的进程,选中,点击OK。
这时就会在指定路径生成full dump,比较大,Dmp文件压缩一下。
管理员权限启动控制台,进入到下面debugging Tools安装目录下,
32位进程进到x86(C:\Program Files (x86)\Windows Kits\10\Debuggers\x86),
64位进程进到x64(C:\Program Files (x86)\Windows Kits\10\Debuggers\x64),
输入 "gflags /i xxx.exe +ust",xxx.exe是目标进程名。
五,利用windbg 分析dump文件
下载地址:https://docs.microsoft.com/zh-cn/windows-hardware/drivers/debugger/debugger-download-tools
(1)下载微软符号文件,先创建一个本地文件夹,比如:D:\jira\mysymbols
(2)File -> Symbol File Path。在弹框中输入:
SRV*D:\jira\mysymbol*http://msdl.microsoft.com/download/symbols;D:\jira\mysymbol;
这时候会把用到的微软符号文件,下载到本地路径。;分号后面代表如果需要会加载这个路径下的pdb文件。
(3)打开dump文件,可以直接拖进来。也可以 File -> Open Crash dump File
(4)可以直接在下面的编辑框输入!analyze -v指令。或者直接点击这个指令
(5)如果挂在agora_rtc_sdk,MODULE_NAME就是这个名字,直接点击会出现一个日期。
然后到服务器去找对应版本比较接近的日期的pdb文件。一般压缩包的日期会比这个时间稍微的晚一点。Pdb下载地址:
https://release.agoralab.co/disk/或者内部可以去149下载
(6)File -> Symbol File Path。在弹框中附加上放sdk的符号文件的路径,用;区分开。选中Reload,确定。再次输入!analyze -v指令。
参考:https://www.pianshen.com/article/469258720/
https://blog.csdn.net/u014552102/article/details/82026592
https://www.cnblogs.com/FKdelphi/p/10731775.html