12

アプリケーションがクラッシュするたびに、アプリケーションのダンプファイルを作成しようとしています。私は現在、それを行うために-eフラグを指定してprocdump.exeを使用しているので、アプリケーションで未処理の例外がある場合、procdumpはダンプファイルを作成します。

完了したと思いましたが、アプリケーションがクラッシュし、procdumpがダンプファイルを作成しないことがわかりました。いくつかの調査の結果、vector::frontを無効に使用するとランタイムエラーが発生することがわかりました。_SECURE_SCL_THROWSフラグをオンにした後、procdump.exe -eがクラッシュをキャッチし、ダンプファイルを作成しました。

今私の質問に:今procdump.exe -eは私のアプリケーションがクラッシュしたときに常にダンプファイルを作成しますか?procdump -eが自分に適していない他のシナリオがないことをどのように保証できますか?

4

3 に答える 3

14

あなたはWindows環境にいると思います(procdump.exeを使用しているため)。アプリケーションがクラッシュするたびにmindumpを書き込むプログラムの例外フィルターを設定することもできます。

  1. クラッシュ時に呼び出されるSetUnhandledExceptionFilterを使用してコールバック関数を登録します。可能な署名は次のとおりです。

    LONG WINAPI HandleException(struct _EXCEPTION_POINTERS* apExceptionInfo)
    

    次を使用してどこかに登録します。

    SetUnhandledExceptionFilter(HandleException);   
    
  2. Function 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);
    
于 2012-01-26T15:46:38.457 に答える
10

/* WinDump.cpp */

#ifdef WIN32

#include <windows.h>
#include <Dbghelp.h>
#include <tchar.h>


typedef BOOL (WINAPI *MINIDUMPWRITEDUMP)(HANDLE hProcess, DWORD dwPid, HANDLE hFile, MINIDUMP_TYPE DumpType,CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam);

void create_minidump(struct _EXCEPTION_POINTERS* apExceptionInfo)
{
    HMODULE mhLib = ::LoadLibrary(_T("dbghelp.dll"));
    MINIDUMPWRITEDUMP pDump = (MINIDUMPWRITEDUMP)::GetProcAddress(mhLib, "MiniDumpWriteDump");

    HANDLE  hFile = ::CreateFile(_T("core.dmp"), 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);
}

LONG WINAPI unhandled_handler(struct _EXCEPTION_POINTERS* apExceptionInfo)
{
    create_minidump(apExceptionInfo);
    return EXCEPTION_CONTINUE_SEARCH;
}

#endif // WIN32

/* WinDump.h */

#ifdef WIN32

LONG WINAPI unhandled_handler(struct _EXCEPTION_POINTERS* apExceptionInfo);

#endif // WIN32

/* main.cpp */

#include "WinDump.h"

int main(int argc, char **argv)
{

    // Create a dump file whenever the gateway crashes only on windows
    SetUnhandledExceptionFilter(unhandled_handler);
    return 0;
}
于 2014-08-22T08:04:21.117 に答える
1

または、レジストリにキーを追加して、Windows の組み込みのエラー報告である WER を使用して、アプリで有効にします。詳細はこちら: https://docs.microsoft.com/en-us/windows/win32/wer/collecting-user-mode-dumps

于 2021-10-15T18:44:47.053 に答える