C++ 崩溃时导出堆栈信息并使用调试工具定位问题 ?

当C++程序遇到崩溃时,理解如何导出堆栈信息至关重要。本文将介绍如何在程序崩溃时捕获堆栈信息,并利用调试工具进行问题定位。通过这些方法,开发者可以更快地找到错误源头,提高修复效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <Windows.h>
#include <DbgHelp.h>

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

void CreateDumpFile(LPCSTR lpstrDumpFilePathName, EXCEPTION_POINTERS* pException) {
    // 创建Dump文件
    HANDLE hDumpFile = CreateFileA(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);
}

LONG ApplicationCrashHandler(EXCEPTION_POINTERS* pException) {
    // 获取时间
    SYSTEMTIME syst;
    GetLocalTime(&syst);
    CHAR strDateTime[256];
    sprintf_s(strDateTime, 256, ".%d.%.2d.%.2d.%.2d.%.2d.%.2d.%.3d.dmp", syst.wYear, syst.wMonth, syst.wDay, syst.wHour, syst.wMinute, syst.wSecond, syst.wMilliseconds);

    // 获取文件完整路径
    CHAR szFilename[MAX_PATH];
    GetModuleFileNameA(NULL, szFilename, MAX_PATH);

    // 输出文件名称
    std::string outfilename;
    outfilename += szFilename;
    outfilename += strDateTime;

    MakeSureDirectoryPathExists(outfilename.c_str());

    CreateDumpFile(outfilename.c_str(), pException);

    FatalAppExitA(NULL, "*** Unhandled Exception! ***\0");

    return EXCEPTION_EXECUTE_HANDLER;
}

> 注意:需要在部署机器上需要放入符号文件 *.pdb,程序崩溃时才会导出调用堆栈详细信息。 

/*!
测试程序:
1. 生成该程序,运行该程序,非 IDE 调试器运行,会自动在程序目录生成 .dmp 后缀的文件。
2. 使用 使用 winDbg 调试工具打开 .dmp 文件
输入 !analyze –v 指令即可看到详细的分析信息
*/
int main() {
	// 设置异常处理钩子
    SetUnhandledExceptionFilter(ApplicationCrashHandler);
    // 异常测试
    *(int*)nullptr = 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值