来自ADPlus / CDB的不一致行为 - 'g'中没有可运行的调试错误

时间:2012-08-14 18:33:35

标签: debugging windbg sos adplus

我已将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]*

知道为什么我会这样做吗?我可以发布我的配置文件和完整日志,如果这将有所帮助。它的工作时间日志和工作时间日志之间的唯一区别在于,所有行都以0:004>开头,而0:000>则为{{1}}。

2 个答案:

答案 0 :(得分:1)

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

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

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

安装TaskManager,看看你是否有多个应用程序实例出现(如果你这样做,那么你可能不得不使用-p PID选项来获得adplus来监控正确的过程......不理想你必须先启动这个过程才能得到它的PID。

另请查看ProcDump,它使用一种名为Reflected Processes的技术...它允许一种非常快速的方法来复制进程空间并让转储完成而不需要保留东西......如果DebugDiag没有,这可能会有所帮助。

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

答案 1 :(得分:0)

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

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

所以消息" ' g'中没有 runnable 调试对象错误"在您的情况下是合乎逻辑的,因为该过程不是正在运行

关于加载正确版本的SOS,请使用以下命令,具体取决于.NET版本。

.NET 4及更高版本 .loadby sos

.NET 3.5和2 .loadby sos mscorwks

.NET 1.0和1.1 .load clr10 \ sos