C++ 使用PDB Dump调试
2022/1/30 1:04:35
本文主要是介绍C++ 使用PDB Dump调试,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
C++ 使用PDB Dump调试
程序如果发给客户在生产环境下发生了崩溃,往往很难定位问题,利用PDB + Dump可以快速的帮助我们定位问题。本文的方法在使用Qt + MSVC编译器时同样可用。
1. 生成PDB文件。
vs在生成debug版程序时会自动生成PDB文件,release版可能不会生成,在工程名点击右键——属性——链接器——调试。在生成调试信息栏选择《生成调试信息》即可让vs在生成Release版时也生成PDB文件。每次生成的PDB对应本次生成的exe文件,所以要保存好发给客户的exe对应的PDB文件。
2.生成Dump文件
有多种配置方法可以生成Dump文件,有的需要在客户的电脑上进行配置,使用起来不方便,我们这里利用SetUnhandledExceptionFilter在程序里生成Dump文件的方法。无需配置方便使用,创建一个win32控制台程序,输入以下代码.
#include <iostream> #include <Windows.h> //包含DBG调试模块头文件 #include <DbgHelp.h> using namespace std; //加载DBG模块 #pragma comment(lib,"DbgHelp.lib") // 创建Dump文件 void CreateDumpFile(LPCWSTR lpstrDumpFilePathName, EXCEPTION_POINTERS* pException) { HANDLE hDumpFile = CreateFile(lpstrDumpFilePathName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); //Dump信息 MINIDUMP_EXCEPTION_INFORMATION dumpInfo; dumpInfo.ExceptionPointers = pException; dumpInfo.ThreadId = GetCurrentThreadId(); dumpInfo.ClientPointers = TRUE; //写入Dump文件内容 MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL); CloseHandle(hDumpFile); } //处理Unhandled Exception的回调函数 long __stdcall ApplicationCrashHandler(EXCEPTION_POINTERS* pException) { //发生未处理异常时,生成一个Test.dmp文件。 CreateDumpFile(L"Test.dmp", pException); cout << "异常已记录" << endl; system("pause"); return EXCEPTION_EXECUTE_HANDLER; } int main() { //在程序开始设置未处理异常回调。 SetUnhandledExceptionFilter(ApplicationCrashHandler); //中断程序 _asm int 3; std::cout << "Hello World!\n"; std::cin.get(); }
以上代码将在程序崩溃时,生成一个Test.dmp文件。将Test.dmp与生成程序时生成的exe和pdb文件放在同一个文件夹下,用vs打开Test.dmp,然后点击使用 仅限本机 调试,即可跳转到出错代码的位置。
这篇关于C++ 使用PDB Dump调试的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享