2009-10-12 79 views
3

我使用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 

預先感謝, 喬治

回答

5

的WinDbg/SOS沒有行號映射到!clrstack輸出。所以只要lm告訴你,你有你自己的程序集私人pdb符號,你設置是正確的。不幸的是,當前版本的WinDbg/SOS不支持與本機代碼相同的源代碼級調試。

編輯:關於例外。當您執行!pe時,它會告訴您調用堆棧以及相關方法的偏移量。如果您從!pe輸出的IP列中獲取地址並在其上執行!U,您將看到相關方法的JITTED代碼。 IP列將成爲生成異常的代碼的最後一個地址(因此您必須做點計算才能找到正確的指令)。

反彙編的輸出用.NET調用進行註釋,因此不難將它映射爲IL或源代碼。這應該可以幫助你確定你正在尋找哪個throw語句。

這就是說,如果將方法分割成若干較小的方法,您將使調試變得更加容易。如果這樣做,方法名稱通常足以查明異常的位置。我意識到這並不總是一種選擇,但它值得考慮。

+0

謝謝!如果我有應用程序的完整源代碼(C#託管代碼)的崩潰轉儲,使用Windbg從哪個託管代碼行查找源崩潰/中斷的最簡單方法是什麼?如果Windbg無法實現此目標,那麼其他工具可能會有所幫助? – George2 2009-10-12 08:04:56

+1

通過崩潰我估計你正在談論一個未處理的異常。如果是這種情況,你可以在適當的線程上找到異常。使用!threads命令顯示所有託管線程以及這些上的任何例外。 !pe命令將詳細列出異常對象。有關更多信息,請參閱這個出色的博客http://blogs.msdn.com/tess/ – 2009-10-12 08:28:53

+0

是的,Brain,我正在談論未處理的異常。我曾嘗試使用!pe和!線程,它們提供了一些信息,但是由於異常(SqlException)可能會從我的代碼的特定功能的幾條不同的線(場景)中拋出。使用!pe和!線程可以告訴我異常來自哪個函數,但是如果該函數可以在不同的位置/場景中引發異常,那麼如何判斷拋出異常的位置? – George2 2009-10-12 08:32:29