3

我必须对 C++ 项目进行一些事后调试。已知的执行方法是将 cdb 调试器设置为小型转储生成器,然后处理收集的转储。我几乎阅读了整个网络,但没有找到一种解决方案来生成一个带有已崩溃进程名称的小型转储

有没有办法以 cdb 生成带有进程名称的转储文件的方式设置 AeDebug\Debugger 注册表变量?当我将对 cdb.exe 的调用封装在一个批处理文件中时,它启动良好,但在符号搜索中保持阻塞。我必须执行 Ctrl+C 才能停止批处理,然后创建具有正确进程名称的小型转储......但我当然不能在无人看管的生产环境中设置这样的东西......

以前有人这样做过吗?

4

1 回答 1

2

它开始良好,但在符号搜索中保持阻塞。

它在寻找什么?您可以执行“!sym noise”来打开有关符号加载的嘈杂输出。不过,它不应该永远阻塞——它最终应该超时。如果您修复符号路径,那也会有所帮助。您可以将符号路径设置为空,然后不可能阻止从任何地方加载符号。

关于使用进程名称生成转储,我的一位同事(Jeremy)在 cdb/ntsd 命令行上提出了这个建议:

-c ".foreach( obj { lm 1m a @$exentry; } ) { .dump /m /u ${obj}.dmp;.dump /ma /u ${obj}.dmp; }; q"

他还说“确保你使用@$exentry 而不仅仅是 $exentry,否则它会尝试符号解析并破坏你的 for 循环。”

但更简单的方法可能是使用 Windows 错误报告 (WER) LocalDumps 功能:

http://msdn.microsoft.com/en-us/library/bb787181(VS.85).aspx

代替具有进程名称的转储文件,将有一个包含进程名称的目录,其中包含转储文件,这可能会满足您的需求。要获得转储中的最大信息,请将 DumpType 设置为 0,并将 CustomDumpFlags 设置为 0x1B65。

请注意,此功能纯粹用于配置本地转储:“这些转储的配置和控制独立于 WER 基础架构的其余部分。即使 WER 被禁用或用户取消 WER 报告,您也可以使用本地转储收集。本地转储可能与发送给 Microsoft 的转储不同。”

另请注意,LocalDumps 不支持托管进程。

于 2009-09-29T15:57:05.300 回答