TL;博士认为为同一个崩溃事件编写多个转储是有意义的,如果是,您需要注意什么。
当我们的应用程序中有一个未处理的异常/ abort / younameit时,我们使用MiniDumpWriteDump编写崩溃转储。
到目前为止,代码实际上编写了两个转储()。
MiniDumpWithDataSegs,以获得一个小的,可以发送甚至糟糕的电子邮件w/o问题一旦拉链。MiniDumpWithFullMemory,有完整的信息,如果我们需要它。为了实现这个功能,我们两次调用MiniDUmpWriteDump:
1 Open/create file for small dump
2 Write small dump
3 Open/create file for large dump
4 Write large dump据我所知,这个方案的一个附加想法是编写小转储更快。它通常是次秒级,而编写大型转储通常需要相当长的时间,特别是当应用程序完全加载并且大型转储很容易达到1.2 GB或更多的时候。
据我所知,首先编写这个小转储的想法是,由于它更快,它将在崩溃时对崩溃的进程进行更详细的快照,因为该进程是大量多线程的。
显然,进程的线程在第一次调用结束到对MDWP的第二次调用开始之间继续运行,因此我们确实有很多情况下,小型转储中的信息实际上比大型转储中的信息更准确。
但是,在考虑了这一点之后,我认为要编写转储,MiniDumpWriteDump无论如何都必须挂起进程的线程,所以如果我们首先编写大型转储,那么大型转储就会比小转储更准确。
问题
我们应该先写大垃圾堆,再写小垃圾堆吗?我们应该写两个垃圾堆吗?我们可以让系统先挂起进程的线程,然后写两个完全“同步”的转储吗?
发布于 2013-05-07 16:14:36
几年来,我曾分析过来自不同客户的垃圾堆,以下只是我个人对你问题的看法,希望这会有所帮助。
我们应该在小转储之前写大转储吗?我不认为订单对于崩溃、挂起等典型问题很重要。崩溃点在那里,死锁在转储中,第一次捕获或之后。
我们应该写两个转储吗?--我建议至少写一个完整的转储,这个小转储对你来说是非常方便的--对问题所在有一个初步的印象,但是它是非常有限的。当你的应用程序崩溃时。所以你可以建议客户发电子邮件给你做第一轮的小转储,如果这不能帮你找出根本原因,那就问问完整的转储吧。从技术上讲,您可以从一个完整的转储中去掉一个小转储,但是,您可能不希望您的客户为您做这种工作。这取决于你如何与你的客户互动。
我们可以让系统先挂起进程的线程,然后写两个完全“同步”的转储吗?
从技术上讲这是可行的。例如,一个简单的NtSuspendProcess()挂起所有目标线程,它相对容易执行-proc,但是必须从另一个进程调用它。如果您喜欢在-proc中执行,则必须枚举所有线程并调用SuspendThread(),这就是MiniDumpWriteDump()的工作方式。但是,我认为sync/asyn不会影响转储的准确性。
发布于 2013-04-29 07:11:18
同时写两个转储是不可取的,因为MiniDumpWriteDump不是线程安全的。
所有的DbgHelp函数,比如这个函数,都是单线程的。因此,多个线程对此函数的调用可能会导致意外的行为或内存损坏。
您是否应该使用一个小转储来编写一个大型转储,这取决于您的应用程序和您可能期望的bug类型。微型端只包含堆栈信息,它不包含堆内存、句柄信息或最近卸载的模块。
获取堆栈信息显然会给您提供堆栈跟踪,但是如果堆栈跟踪只告诉您最后的操作是引用堆上的某些内存,则跟踪没有多大用处。您期望的失败模式将决定哪个更有意义。如果您的遗留代码可能没有使用RAII来管理句柄,或者处理堆分配的内存没有您想要的那样管理,那么完整的转储将是有用的。
您还应该考虑提交内存转储的人。如果您的客户在互联网上,他们可能不喜欢提交一个相当大的内存转储。他们可能还会担心私有数据,这些数据也可能与一个完整的内存转储一起提交。最小转储更小,更容易提交,包含私有数据的可能性更小(虽然不是不可能)。如果您是客户,在内部网络上运行,那么完整的内存转储是更可接受的。
最好先写一个小型转储,然后再写一个大转储。这样,您更有可能快速获得一些数据,而不是等待一个完整的转储。一个完整的转储可能需要一段时间,用户往往不耐烦。他们可能会决定终止这个过程,这样他们就可以回去工作了。另外,如果磁盘已满(可能是造成崩溃的原因),则您有空间容纳小型磁盘的可能性略大于完全转储空间。
发布于 2013-04-29 13:07:25
DbgHelp.dll导入SuspendThread和ResumeThread。你也可以做同样的事。为所有线程调用SuspendThread (当然不包括当前线程),根据需要调用MiniDumpWriteDump多次,然后在挂起的每个线程上调用ResumeThread。这应该给你一贯准确的转储。
https://stackoverflow.com/questions/16272451
复制相似问题