我是否可以在不附加VS调试器的情况下从CLR异常中获取堆栈跟踪?

MSt*_*odd 9 .net debugging iis-6 windbg

我有一个在远程服务器上运行的网站,并希望从正在发生的异常中获取一些信息.我无法安装VS或使用远程调试,并且一直试图使用各种版本的WinDbg但收效甚微.在我的本地测试中,我可以让WinDbg打破C++异常,或者我抛出的CLR异常,但是不能获得比"抛出的东西"更多的信息.

WinDbg是可行的方式,还是有另一种方式,还是因为没有足够的日志而搞砸了?

sev*_*tov 17

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

.symfix
sxe clr
sxd av
.loadby sos clr
g
Run Code Online (Sandbox Code Playgroud)

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

(xxxx.xxxx): CLR exception - code e0434352 (first chance)
Run Code Online (Sandbox Code Playgroud)

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

编辑:我有打字错误sxesxd命令.感谢@MStodd注意到这一点.

  • @MStodd,这也应该有效.在.Net 2.0中,您可以使用`mscorwks`或`mscorsrv`(用于服务器模式应用程序),而在.Net 4.0中,您可以使用`mscoreei`.'clr`只是当前执行引擎的快捷方式.我注意到有时候`clr`不起作用,在这种情况下,可以使用`mscoreei`或`mscorwks`或`mscorsrv`. (2认同)
  • @Dono,据我所知,在某些情况下,CLR会导致AV成为某种内部机制,可能与内存探测有关.该AV的每个实例都由CLR本身内部处理,因此对应用程序没有副作用.请注意,`sdx av`在第一次机会异常时禁用自动中断,而不是第二次.如果您的代码存在导致AV的实际问题,则可能会出现第二次机会异常,并且windbg会像往常一样中断并允许您调查问题. (2认同)