什么是Microsoft的公共符号服务器有用?

时间:2009-05-06 10:23:17

标签: .net visual-studio debugging symbols

到目前为止,我一直使用ASP.NET MVC框架源来调试ASP.NET MVC。在我的笔记本电脑上,我只是尝试了一种不同的方法,即在调试时右键显示VS中的“模块”窗口并右键单击System.Web.Mvc,然后选择“加载符号来源”> “Microsoft符号服务器”。

VS似乎实际上加载了一些东西,因为System.Web.Mvc程序集的符号文件被报告为已加载。此外,我的调用堆栈中属于System.Web.Mvc的所有行都从灰色变为黑色。但是,当我尝试步入属于System.Web.Mvc的代码时,仍然会收到“源代码不可用”错误消息。

所以,我加载了符号,但仍然没有源代码。这不是一个大问题,因为我仍然可以用旧的方式调试它。但我想知道微软符号服务器对什么有用呢?

3 个答案:

答案 0 :(得分: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

你不能一直看到回头。

答案 1 :(得分:2)

根据我的经验,符号服务器对 托管和非托管调试非常有用,因为它们提供了非常需要的详细信息。其他人已经说明了为什么这对本机代码很重要,所以我会坚持使用托管代码。

我使用WinDbg + Sos对托管代码进行了一些调试,我需要定期深入研究本机部分。请记住,对于操作系统,托管应用程序与非托管应用程序没有区别。最终,托管应用程序将调用Win32 dll。检查那些你需要适当的符号。

E.g。如果您需要查找有关特定托管呼叫的详细信息,您真的需要查看本机代码。一个示例可能是您在托管堆栈中看到Monitor.Enter。如果刚刚发出调用或者线程实际正在等待(*),你无法通过查看自己的调用来判断。通过转储本机调用堆栈,您可以判断是否发出了对WaitForMultipleObjects的调用。

(*)!threads命令的状态标志将在这里帮助您,但如果您想要详细信息,则本机堆栈的转储仍然非常有用。

答案 2 :(得分:1)

我没有发现符号服务器对托管DLL有用 - 你仍然可以获得没有它们的托管堆栈跟踪。我认为托管符号的主要价值是行号信息,但你打算怎么做呢?

但是,我不能没有用于调试本机代码的符号。 source server确实非常有用。