2009-05-06 44 views
4

到目前爲止,我一直使用ASP.NET MVC框架源來調試ASP.NET MVC。在我的筆記本電腦上,我嘗試了一種不同的方法,即在調試時調出VS中的「模塊」窗口,右鍵單擊System.Web.Mvc,然後選擇「加載符號」>「Microsoft Symbol Servers」。微軟的公共符號服務器有什麼用處?

由於System.Web.Mvc程序集的符號文件被報告爲加載,因此VS似乎實際上加載了一些東西。此外,在我的調用堆棧中屬於System.Web.Mvc的所有行都從灰色變爲黑色。但是,嘗試進入屬於System.Web.Mvc的代碼時,仍然收到「源代碼不可用」錯誤消息。

所以,我加載了符號,但仍然沒有源代碼。由於我仍然可以以舊方式進行調試,因此不是什麼大問題。但是我想知道微軟的Symbol服務器有什麼用處呢?

+0

搞笑。這裏也看到:http://social.msdn.microsoft.com/Forums/en/vsdebug/thread/c5084825-06f2-4859-b9f0-61325bfeacba – 2011-04-15 03:03:48

回答

4

它們使堆棧跟蹤對於本地DLL正常工作 - 沒有符號,堆棧跟蹤通常只能到最近的Windows DLL,然後停止。使用符號,他們繼續通過Winodws DLL。您可以看到函數名稱,但不能看到源代碼(顯然)。

調試原生的Windows程序,你經常會得到堆棧跟蹤這樣的:

mydll.dll 
    mydll.dll 
    some_windows_dll.dll 
    some_windows_dll.dll 
    some_other_windows_dll.dll 
    some_other_windows_dll.dll 
    myexe.exe 
    myexe.exe 

沒有爲Windows DLL的符號,你會發現,棧只得到了這麼遠:

mydll.dll 
    mydll.dll 
    some_windows_dll.dll 

,你不會看到所有的方式回到起點。

+0

這對非託管代碼有意義,但在託管代碼中,我可以看到堆棧對於外部代碼甚至不使用符號文件。所以我仍然想知道如果加載符號不能訪問源代碼,他們爲什麼要爲System.Web.Mvc提供符號文件。 – 2009-05-06 10:27:39

+0

對於託管代碼,我不知道。它可以讓你查看功能參數值嗎? – RichieHindle 2009-05-06 10:32:14

1

我還沒有找到符號服務器對託管的DLL有用 - 您仍然可以在沒有它們的情況下獲得託管堆棧跟蹤。我認爲託管符號的主要價值是行號信息,但您打算怎麼做?

但是,我不能沒有符號來調試本機代碼。而且source server確實非常有用。

2

以我的經驗符號服務器是有用的託管和非託管調試爲他們提供急需的細節。其他人已經介紹了爲什麼這對本地代碼很重要,所以我會堅持託管代碼。

我使用WinDbg + Sos對託管代碼進行了一些調試,我需要定期挖掘本機部分。請記住,對於OS,託管應用程序與非託管應用程序沒有區別。最終,託管應用程序將調用Win32 dll。檢查那些你需要適當的符號。

E.g.如果您需要查找有關特定託管呼叫的詳細信息,則需要查看本機代碼。一個例子可能是您在託管堆棧中看到Monitor.Enter。如果調用剛剛發佈或者線程實際上正在等待(*),您無法從查看自身的調用中看出來。通過轉儲本機調用堆棧,您可以確定是否發出了對WaitForMultipleObjects的調用。 (*)!threads命令的狀態標誌將在這裏幫助你,但是如果你需要詳細信息,本地棧的轉儲仍然非常有用。