3

我有一个应用程序在发布版本中偶尔崩溃;不幸的是,它看起来像是在第 3 方 DLL 中崩溃。在试图掌握它的过程中,我一直在海量的 HOW TO 和 Windows 如何创建故障转储的描述中游弋。

我正在考虑使用这个建议的小型转储:

获取启动时崩溃的进程的转储

我计划将此功能保留在代码中,以便始终为我的应用程序创建转储,而无需事先设置 PC。顺便说一句,此应用程序不用于分发;它将与我们自己的硬件配对,因此如果应用程序发生崩溃,我不担心随机用户在他们的机器上构建转储文件。

附加说明:所有代码都是 C/C++。

Dr. Watson (drwtsn32.exe) 和此代码将为我生成的内容有什么不同吗?

4

4 回答 4

2

有了 Watson 博士,只有当 Dr. 看到你“崩溃”时,你才会得到转储。使用 dumper API,您将能够从应用程序中的任何位置调用它。例如。您可以将普通断言转储而不是显示对话框。以我的经验,一旦你的应用程序支持转储,你会发现调查、解决和修复各种问题会更容易,因为你可以在任何你认为合适的地方生成完整的转储(甚至是小型转储)代码。

于 2010-04-22T22:13:00.577 回答
1

没有太大区别,只是如果您创建自己的小型转储,您可以更好地控制其中的细节级别。默认情况下,Minidumps 有堆栈和一些局部变量,但是创建自己的可以让您选择创建完整的内存转储,这也可能被证明更有用(尽管如果内存映像是,这可能会使这些转储的收集更成问题大的)。

如果崩溃发生得相当频繁,那么只收集 drwatson(或 Vista 以后的 werfault)为您生成的一些小型转储可能是值得的,因为这可能会为您提供足够的信息。如果没有,那么您可以选择添加自己的未处理异常过滤器。可能发生的另一件事是您收到的小型转储是崩溃的位置,而不是可能出现的第一次机会异常。创建自己的小型转储意味着您更有可能获得更接近问题所在的堆栈跟踪。

另一种选择是,如果您的机器更频繁地出现问题,则在后台运行ADPlus - 它会坐下来等待您的应用程序崩溃或抛出异常,然后生成一些有用的日志文件。它的作用与未处理的异常过滤器类似,只是它不需要对您的应用程序进行任何更改。

于 2010-04-22T22:05:46.840 回答
1

最需要注意的是MiniDumpWriteDump必须进行内存分配和文件 I/O。如果堆结构损坏,从失败进程内部调用它可能会失败。

从辅助进程调用MiniDumpWriteDump与使用 Dr. Watson 的工作方式相同,只是您可以控制转储选项。

推荐阅读:MiniDumpWriteDump中的loader锁死锁

于 2010-04-23T05:02:27.570 回答
0

我不这么认为。尽管 Dr Watson 会生成完整或小型转储,但您可以使用ntsd 调试器来更好地控制转储中包含的数据。

沃森博士的小型转储对于大多数事情来说已经足够好了,你会得到一个调用堆栈和变量。如果您需要更多,ntsd 有很多选项

使用 DrWatson 的唯一好处是预装在 Windows 上。

于 2010-04-22T22:05:41.413 回答