[ASP.NET Debugging BuggyBits讀書筆記] Lab02 Crash

原文來自:http://blogs.msdn.com/b/tess/archive/2008/02/11/net-debugging-demos-lab-2-crash-review.aspx ui

1. 打開command-line prompt轉到WinDbg目錄,執行 adplus –crash –pn w3wp.exe –quiet this

2. 在Review.aspx頁面裏點擊Refresh按鈕,將觸發w3wp.exe進程的crash debug

3. 打開EventViewer,查看System.evt,找到事件記錄: 指針

image

可見進程被終止,是由於發生了0xe0434f4d錯誤,而該錯誤是CLR錯誤在系統層面的統一稱呼。 對象

查看 Application.evt,找到事件記錄: blog

image

可見系統接收到了System.NullReferenceException錯誤。 進程

image

可見是Review類型的Finalize()方法拋出了NullReferenceException。 事件

4. 用WinDbg打開2nd chance的.dmp文件。 get

5. 執行 .loadby sos.dll mscorwks,執行 !pe 查看錯誤。執行 !dso 查看與該thread相關的全部object。 string

image

能夠發現,在全部拋出NullReferenceException的對象裏,只有一個object的地址爲026f4d1c,所以懷疑它纔是真正拋出錯誤的對象。

6. 執行 !pe 026f4d1c ,獲得結果以下:

image

能夠看到與該exception相關聯的方法是Review類型的Finalize()方法。

7. 能夠發現該Fucntion所處的IP(Instruction pointer)是063B0f54,執行 !u 063B0F54:

image

能夠發現063B0f54的位置介於063b0f53和063bf55之間,這裏正好是執行063b0f53指令的地方,嘗試把指針[ecx]的內容賦值給eax,而ecx的內容等於esi+4所指向的對象的內容。結合NullReferenceException,能夠得知,esi+4指向的內容爲空,因此該空值賦值給ecx之後,這是程序所訪問的地址空間就變成了[0],出現NullReferenceException。

8. 在託管程序中,esi指針一般是this指針,也就是說,這個指針指向的是Review類型的的一個對象,所以咱們嘗試去查看這個對象究竟包含哪些內容。執行 !do 026c15d8,獲得該Review對象的內容:

image

可見,該對象偏置4之後(offset+4),是quote變量的值,其value值(該值指向了quote的內容的存放地點)被指爲null,所以其地址值變爲了00000000,若是嘗試去訪問0000000地址的值(命令爲move ecx, dword ptr [esi+4]),就會拋出NullReferenceException

9. 查看源代碼:

image

可見程序在對象不使用以後都會執行一個ClearReview()方法。

image

該方法的實際內容是將對象置位null(指針將變爲0)。

對於託管對象而言,並不須要在使用以後進行析構,但是程序仍然進行了析構,其代碼爲:

image

這裏程序將先進行ToString()而後再和string.empty進行比較,這裏因爲quote已經爲空,因此執行ToString()的時候就會出現NullReferenceException.

相關文章
相關標籤/搜索