2016-07-08 109 views
3

我正在使用WaitForDebugEvent() API在調試第三方應用程序時處理調試事件。我經常遇到由CLR拋出的訪問衝突(惡意使用一些.NET庫)。我後來在分析WinDbg的迷你轉儲時看到了這一點。當WaitForDebugEvent()返回時,能否立即檢測到來自CLR的異常情況?如何檢測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 
+0

這很清楚,但正如有人之前所說,SO很久以前就已經下地獄了。這些日子更像是一個由具有足夠聲譽的人開始的排尿比賽,首先就會開始嘔吐。 – kytodrk

+0

嗯,我最初提出你的問題是因爲我同意這個問題很明確而且很有意思。編輯讓我更加困惑。我以爲你在說當你使用WaitForDebugEvent時,你看不到CLR拋出的異常,並且詢問如何接收這些異常的通知。對我來說似乎是一個有效的問題。那麼這些來自你編輯的異常細節在哪裏?這裏的實際問題是什麼?術語的不精確使用也無濟於事。當你「捕捉」一個異常,這意味着一個異常處理程序,而不是WaitForDebugEvent返回TRUE –

+0

現在清除。好的 - 你可以在clr.dll中查看ExceptionAddress - 這意味着「由CLR拋出」?那麼在什麼問題上? – RbMm

回答

0

來自CLR的所有異常ExceptionCode形式取0xE0 ******和NumberParameters> 3.最常見的,這是我看到的 - e0434352(0xe0000000 + 'CCR') - 看 - 例如this: -

的未知異常 - 代碼e0434352(第一次機會)是一個很大的線索 這裏。如果你看看這個錯誤,你可能會看到一些十六進制,看起來像是'0x43''0x43''0x52'或'C''C''R'。不,這不是對Creedence致敬 ,並不意味着月球上升不好。這告訴 我正在從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?

+0

STATUS_ACCESS_VIOLATION。 – kytodrk

+0

你的意思是由CLR託管代碼生成(不在任何DLL中)直接引發STATUS_ACCESS_VIOLATION,由無效的訪問內存位置?這是「經常」?我沒有看到這一點,但在這種情況下,你只查看非常常見的異常代碼,可以確定它不在DLL中,但是如何確定這是CLR生成的代碼 - 我沒有查看方法。或者你的意思是在某些系統.net DLL中的STATUS_ACCESS_VIOLATION? – RbMm

+0

對於以前的評論不正確,我表示歉意。我正在討論EXCEPTION_ACCESS_VIOLATION,而不是STATUS_ACCESS_VIOLATION。 – kytodrk