DbgHelp教程3——Minidump

Minidump文件用来事后调试。DbgHelp库提供写Minidump的MiniDumpWriteDump方法。其实不光是程序崩溃的时候可以写dump,运行的任何时候都可以写个dump。

虽然名称是MiniDump,但有可能写的dump文件比FullDump都大,因为dump里面包含的信息不一样。MiniDumpWriteDump包含了一个MINIDUMP_TYPE参数,指定了dump类型:

以下就是一个生成dump的例子:

bool WriteDump() {
  HANDLE hDumpFile =
    CreateFile(L"mini.dmp", GENERIC_WRITE, FILE_SHARE_WRITE, NULL,
      CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

  if (hDumpFile != INVALID_HANDLE_VALUE) {
    int minidump_type = MiniDumpNormal | MiniDumpWithDataSegs | MiniDumpWithHandleData;
    MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile,
      minidump_type, NULL, NULL, NULL);
  }

  return true;
}

往往我们希望在程序发生未处理的异常导致崩溃的时候来生成dump,因此我们可以注册这些这些异常的处理回调函数,在回调函数里面生成dump。 最常用的是SetUnhandledExceptionFilter函数,当程序发生未处理的SEH异常的时候,就会回调注册的处理函数。还有_set_invalid_parameter_handler函数,它可以注册CRT检测到的无效参数异常处理函数。_set_purecall_handler它可以注册纯虚函数调用异常处理函数。更多的异常函数,可以参考http://www.codeproject.com/Articles/207464/Exception-Handling-in-Visual-Cplusplus。

chromium里面的崩溃收集系统使用的Breakpad,跨平台,设计精良。有空写一些文章来介绍。