Saturday, January 29, 2011

First Chance Exception, Second Chance Exception, WinDBG

所有Managed异常的HRESULT都是0xE0434352(无法用Error Lookup找到这个Error Code)。
通常在Event Log或者WinDBG所见到的Managed异常如下:
CLR exception - code e0434352

通常情况下First Chance Exception不是真正能导致程序Crash的异常,通常这个异常可以通过try…catch来捕获。只有当这个异常无法被捕获时才会升级为Second Chance Exception,这个异常会导致Crash。

可以用过WinDBG的命令sxe e0434352来使Debugger在First Chance Exception的时候Break。

image

继续Debug

image

可以看出Thread 4出现了一个System.Exception,还能看出这是一个First Chance Exception。

image

WinDBG报了Second Chance Exception,这导致了程序Crash。

慢慢玩儿,有点意思。

3 comments:

  1. sxe 我懂。!pe 不记得用过,这是扩展命令,不知是哪个模块的。用 windbg 调试 .Net 程序有种用手术刀切菜的感觉...

    BTW, 顺手查了一下张银奎写的《软件调试》(这书我买了又给人借走,只留电子版),其中写道:

    “托管异常,这是.Net程序使用托管方法抛出的异常。所有这类异常的异常代码都是 0xe0636f6d (.com)”

    我没有证实。

    你的 e0434352 用 ASCII 翻译是(.CCR),莫非是这个意思?

    ReplyDelete
  2. !pe在sos.dll中,是WinDBG的.net扩展。
    VS自然很好,但是有时候莫名其妙的错误不是我代码的问题...
    我也奇怪张银奎的异常代码会和我的那么不一样,根据更权威的资料:
    basically all managed exception are natively referred to as 0xe0434f4d

    有神奇了,难道版本不一样error code也不一样??

    ReplyDelete