使用SetUnhandledExceptionFilter()为访问冲突异常创建minidump

Nav*_*een 11 c++ debugging winapi windbg

每当从我的代码生成结构化异常时,我使用以下代码创建一个minidump文件:

void CreateMiniDump( EXCEPTION_POINTERS* pep ) 
{
  // Open the file 
typedef BOOL (*PDUMPFN)( 
  HANDLE hProcess, 
  DWORD ProcessId, 
  HANDLE hFile, 
  MINIDUMP_TYPE DumpType, 
  PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, 
  PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, 
  PMINIDUMP_CALLBACK_INFORMATION CallbackParam
);


    HANDLE hFile = CreateFile( _T("C:/temp/MiniDump.dmp"), GENERIC_READ | GENERIC_WRITE, 
    0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); 

    HMODULE h = ::LoadLibrary(L"DbgHelp.dll");
    PDUMPFN pFn = (PDUMPFN)GetProcAddress(h, "MiniDumpWriteDump");

  if( ( hFile != NULL ) && ( hFile != INVALID_HANDLE_VALUE ) ) 
  {
    // Create the minidump 

    MINIDUMP_EXCEPTION_INFORMATION mdei; 

    mdei.ThreadId           = GetCurrentThreadId(); 
    mdei.ExceptionPointers  = pep; 
    mdei.ClientPointers     = TRUE; 

    MINIDUMP_TYPE mdt       = MiniDumpNormal; 

    BOOL rv = (*pFn)( GetCurrentProcess(), GetCurrentProcessId(), 
      hFile, mdt, (pep != 0) ? &mdei : 0, 0, 0 ); 



    // Close the file 

    CloseHandle( hFile ); 

  }

}

LONG WINAPI MyUnhandledExceptionFilter(
 struct _EXCEPTION_POINTERS *ExceptionInfo
)
 {
     CreateMiniDump(ExceptionInfo);
     return EXCEPTION_EXECUTE_HANDLER;
 }
Run Code Online (Sandbox Code Playgroud)

我正在SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);从我的应用程序的主要入口点开始(虽然我没有为每个线程设置它).在此之后测试此代码我执行以下操作以生成访问冲突:int* p = 0; *p = 0;转储文件确实生成了.然后我使用windbg打开转储文件并使用.ecxr命令获取异常记录.但是,没有信息(即我没有得到调用堆栈).此外,如果我使用!analyze -v命令,那么它能够显示发生崩溃的行.有人知道我错过了什么以及如何解决这个问题?

顺便说一句,我使用VC7编译器和/ EHa(异步模型异常模型)标志.

Ale*_*x F 3

您创建小型转储的代码没问题,问题是事后调试。调试器必须有权访问程序源代码、.pdb 文件(应该是构建此程序可执行文件时创建的 pdb 文件)和操作系统调试符号。只有拥有所有这些信息,调试器才能显示源代码和调用堆栈中的异常位置。

使用 Visual Studio 调试器的事后调试过程详细描述如下:http://www.codeproject.com/KB/debug/postmortemdebug_standalone1.aspx对于 WinDbg,使用符号、源和图像文件路径为调试器提供相同的信息。