【问题标题】:How to detect exceptions thrown by the CLR? [closed]如何检测 CLR 抛出的异常? [关闭]
【发布时间】:2016-11-11 07:10:57
【问题描述】:

我在调试第三方应用程序时使用WaitForDebugEvent() API 来处理调试事件。我经常发现 CLR 引发的访问冲突(被调试者正在使用一些 .NET 库)。我稍后在使用 WinDbg 分析小型转储时看到了这一点。当WaitForDebugEvent() 返回时,我可以立即检测到来自 CLR 的此类异常吗?

以下是捕获的异常的详细信息:

EXCEPTION_RECORD:  (.exr -1)  
ExceptionAddress: 000007fef7e870eb (clr!EEFileLoadException::Throw+0x00000000000001ac)  
ExceptionCode: c0000005 (Access violation)  
ExceptionFlags: 00000000  
NumberParameters: 2  
   Parameter[0]: 0000000000000000  
   Parameter[1]: 000000000000007d  
Attempt to read from address 000000000000007d

【问题讨论】:

  • 这很清楚,但正如之前有人所说,SO 早就下地狱了。如今,这更像是一场由声望高的人领导的撒尿比赛。
  • 好吧,我最初赞成你的问题,因为我同意它很清楚并且可能很有趣。编辑让我更加困惑。我以为您是在说,当您使用 WaitForDebugEvent 时,您看不到 CLR 抛出的异常,而是在询问如何接收这些异常的通知。对我来说似乎是一个有效的问题。那么你编辑的这些异常细节是从哪里来的呢?这里的实际问题是什么?术语的不精确使用也无济于事。当您“捕获”异常时,这意味着异常处理程序,而不是 WaitForDebugEvent 返回 TRUE
  • 现在清楚了。好的 - 您可以在 clr.dll 中查看 ExceptionAddress - 这意味着“由 CLR 抛出”?那么在什么问题上呢?
  • 但是下一刻这里很有趣 - 异常直接在 clr!EEFileLoadException::Throw+0x00000000000001ac 地址?不是在这个函数代码中调用而是直接调用 RaiseException(或模拟)?

标签: windows debugging winapi clr


【解决方案1】:

来自 CLR 的所有异常都有 ExceptionCode 格式为 0xE0****** 和 NumberParameters > 3。最常见的,我看到 - e0434352 (0xe0000000 + 'CCR') - 例如 - this: -

未知异常 - 代码 e0434352(第一次机会)是一个很大的线索 这里。如果您查看错误,您可能会看到一些看起来像的十六进制 熟悉的‘0x43’‘0x43’‘0x52’或‘C’‘C’‘R’。不,这不是致敬 到克里登斯,并不意味着月亮升起不好。这告诉 我是从 CLR 运行时抛出的错误。甜的。事物 稍微轻松一点。

另一个常用代码 - 0xE0434F4D (0xe0000000+'COM') - How CLR maps SEH exceptions to managed exception types

编辑:

CLR 引发的访问冲突

您的意思是直接 STATUS_ACCESS_VIOLATION 异常?在这种情况下无法检测到,但我从未直接在 CLR 中看到这一点。或者当 CLR 抛出 RaiseException 并在 ExceptionInformation[0] -> STATUS_ACCESS_VIOLATION 时?

【讨论】:

  • STATUS_ACCESS_VIOLATION。
  • 您的意思是比由 CLR 托管代码(不在任何 DLL 中)直接引发 STATUS_ACCESS_VIOLATION 生成,通过无效访问内存位置?这是“经常”吗?我不查看这个,但在这种情况下,您只查看非常常见的异常代码,可以确定它不在 DLL 中,但如何确定这是 CLR 生成的代码 - 我不查看方式。或者您的意思是某些系统 .net DLL 中的 STATUS_ACCESS_VIOLATION ?
  • 我为之前不正确的评论道歉。我说的是 EXCEPTION_ACCESS_VIOLATION,而不是 STATUS_ACCESS_VIOLATION。
  • 我理解你,我的意思也正是这个 - EXCEPTION_ACCESS_VIOLATION 这与 STATUS_ACCESS_VIOLATION - c0000005 相同
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 2012-01-21
  • 2014-01-17
相关资源
最近更新 更多