我使用Windbg從託管代碼(C#,爲任何CPU構建的控制檯應用程序)加載故障轉儲,並在x64平臺上創建故障轉儲。我正在調試x64平臺。私人符號加載但沒有行號顯示?
我有使用以下命令加載我的應用程序的私人符號。以下是我在Windbg中使用的命令。
(set symbol path and copy FooService.pdb pdb file to local symbol path D:\Debug)
0:016> .reload /f
.*** WARNING: Unable to verify checksum for FooService.exe
DBGHELP: FooService.pdb- private symbols & lines
D:\Debug\FooService.pdb
0:016> lm
start end module name
00000000`00400000 00000000`0041c000 FooService C (private pdb symbols) D:\Debug\FooService.pdb
我的困惑是,當使用下面的命令時,堆棧跟蹤中沒有顯示行號信息。任何想法有什麼不對?我需要設置源路徑嗎?
0:016> ~6 e!clrstack
編輯1:我遇到了一些使用!pe和!U來查找引發異常的堆棧跟蹤的問題。
這是我的調試過程。首先,我使用!pe打印異常對象的堆棧跟蹤,當我使用!U進行反彙編代碼時。我發現的問題是!U將彙編FooService.ProcessOrders()的所有函數代碼,並且我想找到函數FooService.ProcessOrders發生崩潰的確切位置。我還發現帶有註釋的註釋IL代碼只包含我所做的函數調用(對於非函數調用C#代碼,例如a = a * 2,僅顯示彙編語言),並不完全IL映射到每行C#代碼,( 1)是否是正確的預期行爲? (2)從我在這裏發佈的分析中找到確切失敗的C#代碼有什麼解決方案或進一步的建議?
!pe 0000064280155325
StackTrace (generated):
SP IP Function
000000001A56DA70 00000642B74E3B7A System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(System.Data.Common.DbAsyncResult, System.String, Boolean)
000000001A56DB10 00000642B74E3FCC System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
000000001A56DB90 0000064280155325 FooService.ProcessOrders()
000000001A56F3E0 0000064280153A21 FooService.RountineJob()
!U 0000064280155325
預先感謝, 喬治
謝謝!如果我有應用程序的完整源代碼(C#託管代碼)的崩潰轉儲,使用Windbg從哪個託管代碼行查找源崩潰/中斷的最簡單方法是什麼?如果Windbg無法實現此目標,那麼其他工具可能會有所幫助? – George2 2009-10-12 08:04:56
通過崩潰我估計你正在談論一個未處理的異常。如果是這種情況,你可以在適當的線程上找到異常。使用!threads命令顯示所有託管線程以及這些上的任何例外。 !pe命令將詳細列出異常對象。有關更多信息,請參閱這個出色的博客http://blogs.msdn.com/tess/ – 2009-10-12 08:28:53
是的,Brain,我正在談論未處理的異常。我曾嘗試使用!pe和!線程,它們提供了一些信息,但是由於異常(SqlException)可能會從我的代碼的特定功能的幾條不同的線(場景)中拋出。使用!pe和!線程可以告訴我異常來自哪個函數,但是如果該函數可以在不同的位置/場景中引發異常,那麼如何判斷拋出異常的位置? – George2 2009-10-12 08:32:29