4

我已将 ADPlus / cdb 设置为我机器上的默认即时调试器。当任何进程出现未处理的异常或因任何其他原因崩溃时,我希望 ADPlus 为我生成故障转储。我正在使用 ADPlus 配置文件来设置输出目录并运行用于将 dmp 文件推送到云的预命令。

为了测试以确保它有效,我编写了一个非常简单的程序,该程序抛出未处理的异常并崩溃。ADPlus 总是像它应该的那样附加自己,但它只成功地生成了我想要的转储,大约 15 次。在不更改系统上的任何内容的情况下,我背靠背运行崩溃的程序并获得不同的结果。

大多数时候,我从 cdb 收到以下错误:

0:000> g

       ^ No runnable debuggees error in 'g'

0:000>

*[EOF]*

当它正常工作时,日志中的相同位置如下所示:

0:004> g

FirstChance_epr_Process_Shut_Down

*[More stuff after here]*

知道为什么我会得到这种行为吗?如果有帮助,我可以发布我的配置文件和完整日志。when-it-works 日志和 when-it-doesn't-work 日志之间的唯一区别是所有行都以0:004>它工作的时间和不工作的时间开始0:000>

4

2 回答 2

1

评论无法容纳所有这些...所以放在这里...

是的,使用 DebugDiag,您可以预先附加 VBS 脚本,并且您可以在事件发生时定义自定义操作(即运行 VBS 脚本)。

我认为您需要等到 CDB 完成转储并且 CDB/您的进程已经退出,然后再尝试再次启动您的应用程序。(您可以在脚本中使用 tlist 来监视进程...等到它消失)。...否则带有 -PN 选项的 ADPlus 可能会使 CDB 尝试重新附加到已经崩溃的进程...它不能因为已经附加了调试器。

安装 TaskManager 并查看是否出现了应用程序的多个实例(如果出现了,那么您可能必须使用 -p PID 选项来让 adplus 监控正确的进程……这并不理想,因为您必须这样做已首先启动该进程以获取其 PID)。

还可以查看 ProcDump,它使用一种称为 Reflected Processes 的技术......它允许一种非常快速的方法来复制进程空间并让转储完成而不会阻碍事情......如果 DebugDiag 没有,这可能会有所帮助。

看看这个链接......就在底部......它显示了如何等待 CDB 完成转储(但它是一个 Powershell 脚本)。

于 2012-08-20T23:56:09.530 回答
0

WinDbg 命令 'g' 表示 [继续]

由于您正在打开转储文件,因此无法“继续”,它只包含进程内存。

因此,在您的情况下,消息“'g' 中没有可运行的调试错误”是合乎逻辑的,因为进程没有运行

关于加载正确版本的 SOS,请根据 .NET 版本使用以下命令。

.NET 4 及更高版本 .loadby sos

.NET 3.5 和 2 .loadby sos mscorwks

.NET 1.0 和 1.1 .load clr10\sos

于 2014-11-03T12:52:32.733 回答