自己创建 minidump

本文介绍了如何在程序崩溃时自动生成MiniDump文件以方便调试。通过替换drwtsn32.exe并使用ntsd或直接调用API创建MiniDump,可以获得更丰富的调试信息。文章提供了具体的实现代码。


以前曾写过一个 bugslayer.dll 的介绍. 在程序出错时将调用栈写到文件. 觉得不错. 后来开始用 windbg. 知道了 userdump. 知道了如何调试 dump... 才知道程序崩溃的时候写 dump 文件其实可以获取比调用栈多得多的信息. 

如果你的程序什么都不干. 那么在程序出错的时候. drwtsn32.exe 会写一个 userdump. 但 drwtsn32 有些缺点. 比如只能写一个 dump 文件. 后面的崩溃写 dump 文件时会覆盖前面的. win2000 下的 drwtsn32 只能写旧式的 dump 文件(往往尺寸比较大). 有一篇文章论述的比较清楚:
 http://www.debuginfo.com/articles/ntsdwatson.html

建议使用 ntsd 代替 drwtsn32. 但 ntsd 的缺点就是需要安装最新的 windbg. 这是一个硬伤. 在看了 debuginfo.com 的另一篇文章:
 http://www.debuginfo.com/articles/effminidumps.html
 
之后, 我选择的是在程序出错的时候调用 api 自己写 minidump. 克服了 drwtsn32, ntsd 的缺点.
将封装好的函数放到了一个头文件中, 包含即可. 使用的方法很简单:

#include <windows.h>
#include "minidump.h"
LONG __stdcall MyUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)
{
 CreateMiniDump(pExceptionInfo, "c://user.dmp");
 return EXCEPTION_EXECUTE_HANDLER;
}

void main()
{
 SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
 *(int*)0=0; // AV
}

这样就好了. 注意安装至少 xp 以上的 sdk.
这里用到了一个 api SetUnhandledExceptionFilter(), 如果不明白可以搜一下 msdn.
运行例子程序出错退出之后, 就得到了 c://user.dmp. 可以用 windbg 等调试器来分析了.  

代码从这里下载 http://nicoster.googlepages.com/minidump.rar

Minidump 是一种轻量级的崩溃转储文件,在 Linux 系统中,它可以帮助开发者分析程序崩溃时的状态,定位问题所在。 ### Minidump 的作用 Minidump 文件包含了程序崩溃时的关键信息,如线程栈信息、寄存器状态、加载的模块等。这些信息对于调试和修复程序中的崩溃问题非常有帮助。开发者可以通过分析 Minidump 文件,了解程序崩溃时的调用栈,找出可能导致崩溃的代码位置。 ### Minidump 的使用方法 #### 生成 Minidump 文件 在 Linux 中,可以使用一些工具来生成 Minidump 文件。例如,使用 Breakpad 库,它是一个跨平台的崩溃报告系统,可以在程序崩溃时生成 Minidump 文件。 以下是一个简单的示例代码,展示如何使用 Breakpad 生成 Minidump 文件: ```cpp #include <client/linux/handler/exception_handler.h> bool DumpCallback(const google_breakpad::MinidumpDescriptor& descriptor, void* context, bool succeeded) { if (succeeded) { printf("Minidump written to: %s\n", descriptor.path()); } else { printf("Minidump write failed\n"); } return succeeded; } int main() { google_breakpad::MinidumpDescriptor descriptor("/path/to/dump/directory"); google_breakpad::ExceptionHandler eh(descriptor, NULL, DumpCallback, NULL, true, -1); // 模拟崩溃 int* ptr = nullptr; *ptr = 1; return 0; } ``` 在上述代码中,首先创建了一个 `MinidumpDescriptor` 对象,指定了 Minidump 文件的存储路径。然后创建了一个 `ExceptionHandler` 对象,并传入回调函数 `DumpCallback`,当程序崩溃时,会调用该回调函数生成 Minidump 文件。 #### 分析 Minidump 文件 生成 Minidump 文件后,可以使用一些工具来分析它。例如,使用 `minidump_stackwalk` 工具,它是 Breakpad 提供的一个命令行工具,可以将 Minidump 文件中的信息解析成可读的格式。 以下是使用 `minidump_stackwalk` 工具的示例命令: ```sh minidump_stackwalk /path/to/minidump.dmp /path/to/symbols > stacktrace.txt ``` 其中,`/path/to/minidump.dmp` 是 Minidump 文件的路径,`/path/to/symbols` 是符号文件的路径,`stacktrace.txt` 是输出的堆栈跟踪信息文件。 ### 注意事项 - **符号文件**:为了能够准确地分析 Minidump 文件,需要提供相应的符号文件。符号文件包含了程序的调试信息,如函数名、变量名等。在编译程序时,可以使用 `-g` 选项生成符号文件。 - **权限问题**:确保程序有足够的权限在指定的目录下生成 Minidump 文件。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值