2009-05-06 111 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命令的状态标志将在这里帮助你,但是如果你需要详细信息,本地栈的转储仍然非常有用。