【问题标题】:What are Microsoft's public symbol servers useful for?微软的公共符号服务器有什么用处?
【发布时间】:2010-10-24 03:49:15
【问题描述】:

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

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

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

【问题讨论】:

标签: .net visual-studio debugging symbols


【解决方案1】:

它们使堆栈跟踪对于本机 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

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

【讨论】:

  • 这对于非托管代码是有意义的,但在托管代码中,即使不使用符号文件,我也可以看到外部代码的堆栈。所以我仍然想知道如果加载符号不能访问源代码,他们为什么要为 System.Web.Mvc 托管符号文件。
  • 对于托管代码,我不知道。它是否允许您查看函数参数值?
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 感谢源服务器的链接!不幸的是,它并没有涵盖所有程序集,但它看起来对它所涵盖的那些程序很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多