4

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

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

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

4

3 回答 3

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

而且你不会一直看到回到起点。

于 2009-05-06T10:24:39.540 回答
2

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

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

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

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

于 2009-05-06T11:12:05.430 回答
1

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

然而,我不能没有用于调试本机代码的符号。源服务器确实非常有用。

于 2009-05-06T10:37:41.800 回答