【问题标题】:Can I get a stacktrace from a CLR exception without attaching the VS debugger?我可以在不附加 VS 调试器的情况下从 CLR 异常中获取堆栈跟踪吗?
【发布时间】:2012-08-01 22:53:30
【问题描述】:

我有一个在远程服务器上运行的网站,并且想从正在发生的异常中获取一些信息。我无法安装VS或使用远程调试,并且一直在尝试使用各种版本的WinDbg,但收效甚微。在我的本地测试中,我可以让 WinDbg 中断 C++ 异常或我抛出的 CLR 异常,但无法获得比“抛出某些东西”更多的信息。

WinDbg 是要走的路,还是有其他方法,还是我因为没有足够的日志记录而搞砸了?

【问题讨论】:

  • 我会说你需要更好的日志记录,是的
  • 我会临时设置adplus,以便在抛出异常时创建一个小型转储,然后使用 WinDbg 查看该小型转储。

标签: .net debugging iis-6 windbg


【解决方案1】:

将 WinDbg 附加到进程,然后输入以下命令:

.symfix
sxe clr
sxd av
.loadby sos clr
g

执行将继续(在 go 命令之后),并在抛出 CLR 异常(或任何其他未处理的异常)时中断。每当它在 CLR 异常上中断时,您都会看到:

(xxxx.xxxx): CLR exception - code e0434352 (first chance)

然后您可以使用诸如!pe 打印异常类型、!ClrStack 转储堆栈、!dso 转储堆栈中的托管对象等 SOS 命令。

编辑:我在sxesxd 命令中有拼写错误。感谢@MStodd 注意到这一点。

【讨论】:

  • 稍后我将在我的机器上试一试,但它看起来不错。看起来对于.NET 2.0,我需要.loadby sos mscorwks 而不是.loadby sos clr。听起来对吗?
  • @MStodd,应该也可以。在 .Net 2.0 中,您可以使用 mscorwksmscorsrv(用于服务器模式应用程序),而在 .Net 4.0 中,您可以使用 mscoreei。 'clr' 只是当前执行引擎的快捷方式。我注意到有时clr 不起作用,在这种情况下使用mscoreeimscorwksmscorsrv 很好。
  • @SevaTitov 请问您为什么建议禁用访问冲突中断? (sxd av) 通常托管的 NullReferenceException 最初表现为一个 AV,所以我认为最好在这些上启用中断。
  • @Dono,据我了解,在某些情况下,CLR 会导致 AV 作为某种内部机制,可能与内存探测有关。该 AV 的每个实例都由 CLR 本身在内部处理,因此对应用程序没有副作用。请注意,sdx av 在第一次机会异常时禁用自动中断,而不是第二次。如果您的代码存在导致 AV 的实际问题,它可能会出现第二次机会异常,windbg 将照常中断并允许您调查问题。
  • 我有新的 Windows Store 版本的 WinDbg。我不知道如何执行这些命令。
猜你喜欢
  • 2019-11-05
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 2015-03-17
  • 2010-11-07
相关资源
最近更新 更多