gpt4 book ai didi

c++ - 每当应用程序崩溃时为其创建转储文件

转载 作者:IT老高 更新时间:2023-10-28 23:13:51 26 4
gpt4 key购买 nike

每当我的应用程序崩溃时,我都会尝试为它创建一个转储文件。我目前正在使用带有 -e 标志的 procdump.exe 来执行此操作,因此如果我的应用程序中有未处理的异常,procdump 会为我创建一个转储文件。

我以为我已经完成了,但后来我发现我的应用程序崩溃并且 procdump 没有创建转储文件。经过一些调查,我发现 vector::front 的无效使用会导致运行时错误。我打开了 _SECURE_SCL_THROWS 标志,之后 procdump.exe -e 确实捕获了崩溃并创建了一个转储文件。

现在我的问题是:现在 procdump.exe -e 是否会在我的应用程序崩溃时始终创建转储文件?我如何保证没有其他任何 procdump -e 对我不利的情况?

最佳答案

我假设您在 Windows 环境中(因为您使用 procdump.exe)。您还可以为您的程序设置一个异常过滤器,以便在您的应用程序崩溃时编写一个mindump:

  1. 使用 SetUnhandledExceptionFilter 注册回调函数将在崩溃时调用。可能的签名是:

    LONG WINAPI HandleException(struct _EXCEPTION_POINTERS* apExceptionInfo)

    使用以下方式在某处注册:

    SetUnhandledExceptionFilter(HandleException);   
  2. 定义一个函数指针来调用函数MiniDumpWriteDump :

    typedef BOOL (WINAPI *MINIDUMPWRITEDUMP)(HANDLE hProcess, DWORD dwPid, HANDLE hFile, MINIDUMP_TYPE DumpType,CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,CONSTPMINIDUMP_USER_STREAM_INFORMATIOUserStreamParam,CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam);
  3. 使用 MiniDumpWriteDump在之前注册的回调方法(HandleException)中写入转储的函数(需要 DbgHelp.dll 5.1 或更高版本):

    HMODULE mhLib = ::LoadLibrary(_T("dbghelp.dll"));
    MINIDUMPWRITEDUMP pDump = (MINIDUMPWRITEDUMP)::GetProcAddress(mhLib, "MiniDumpWriteDump");

    HANDLE hFile = ::CreateFile(_T("dump_name"), GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,
    FILE_ATTRIBUTE_NORMAL, NULL);


    _MINIDUMP_EXCEPTION_INFORMATION ExInfo;
    ExInfo.ThreadId = ::GetCurrentThreadId();
    ExInfo.ExceptionPointers = apExceptionInfo;
    ExInfo.ClientPointers = FALSE;

    pDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL);
    ::CloseHandle(hFile);

关于c++ - 每当应用程序崩溃时为其创建转储文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9020353/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com