我必须在C ++项目上执行一些事后调试。 已知的执行方法是将cdb调试器设置为minidump生成器,然后处理转储收集。 我几乎阅读了整个网络,但是我没有找到一个解决方案来生成一个带有崩溃进程名称的minidump
有没有办法设置AeDebug \ Debugger注册表变量,以便cdb生成一个带有进程名称的转储文件? 当我在批处理文件中封装对cdb.exe的调用时,它启动良好但在符号搜索上保持阻塞状态。 我必须执行Ctrl + C才能停止批处理,然后创建具有正确进程名称的minidump ...但当然我无法在无人值守的生产环境中设置这样的东西... < / p>
以前是否有人这样做过?
答案 0 :(得分:2)
它开始很好但在符号搜索上仍然被阻止。
它在寻找什么?您可以执行“!sym noisy”打开有关符号加载的嘈杂输出。它不应该永远阻止 - 它应该最终超时。如果您修复了符号路径,那也会有所帮助。您可以将符号路径设置为空,然后无法阻止从任何地方加载符号。
关于使用进程名称生成转储,我的一位同事(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,您也可以使用本地转储集合。禁用或用户取消WER报告。本地转储可能与发送给Microsoft的转储不同。“
另请注意,LocalDumps不支持托管进程。