Debugging ADPlus/CDB的行为不一致-在';g';

Debugging ADPlus/CDB的行为不一致-在';g';,debugging,windbg,sos,adplus,Debugging,Windbg,Sos,Adplus,我已将ADPlus/cdb设置为计算机上的默认即时调试器。当任何进程出现未处理的异常或由于任何其他原因崩溃时,我希望ADPlus为我生成一个崩溃转储。我正在使用ADPlus配置文件来设置输出目录,并运行用于将dmp文件推送到云中的预命令 为了测试以确保这一切正常,我编写了一个非常简单的程序,抛出一个未经处理的异常并崩溃。ADPlus总是像预期的那样连接自己,但它只成功地生成我想要的转储,大约15次中只有1次。在我的系统上没有任何改变,我背靠背地运行崩溃程序,得到不同的结果 大多数时候,我从cdb

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

为了测试以确保这一切正常,我编写了一个非常简单的程序,抛出一个未经处理的异常并崩溃。ADPlus总是像预期的那样连接自己,但它只成功地生成我想要的转储,大约15次中只有1次。在我的系统上没有任何改变,我背靠背地运行崩溃程序,得到不同的结果

大多数时候,我从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>
开头。

注释无法容纳所有这些内容…因此在这里

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

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

打开TaskManager,查看是否有多个应用程序实例出现(如果出现,则可能需要使用-p PID选项来让adplus监视正确的进程……这并不理想,因为必须先启动进程才能获得其PID)

还可以研究ProcDump,它使用了一种称为反射进程的技术…它允许一种非常快速的方法来复制进程空间,并让转储在不阻塞东西的情况下完成…如果DebugDiag不这样做,这可能会有所帮助

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


    • WinDbg命令“g”表示[继续]

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

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

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

      .NET 4及更高版本.loadby sos

      .NET 3.5和2 .按sos mscorwks加载

      .NET 1.0和1.1
      .load clr10\sos

      当ADPlus转储进程时…它应该异步执行此操作。但是,快速连续多次中断进程…可能是导致问题的原因?…尝试跟踪成功转储之间的时间段…并查看是否存在模式,并检查.dmp文件的时间戳。另外,作为使用ADPlus的替代方法…当崩溃发生时,尝试使用DebugDiag转储进程…您可能会得到更好的结果。。。。或者说是垃圾场。。。。您是在创建小型转储还是完全转储?时间戳似乎没有一个模式-有时我可以在几秒钟内获得转储,有时我在反复运行崩溃的应用程序的几十秒钟内无法获得转储。我特别喜欢ADPlus的是可以在外部配置文件中配置的前置和后置命令。DebugDiag是否有类似的功能?我正在生成完全转储。其他事情目前已优先于此问题,因此我没有机会实施您的建议。我还是会给你赏金的。谢谢你的回答。