到目前为止,我一直使用ASP.NET MVC框架源来调试ASP.NET MVC。在我的笔记本电脑上,我只是尝试了一种不同的方法,即在调试时右键显示VS中的“模块”窗口并右键单击System.Web.Mvc,然后选择“加载符号来源”> “Microsoft符号服务器”。
VS似乎实际上加载了一些东西,因为System.Web.Mvc程序集的符号文件被报告为已加载。此外,我的调用堆栈中属于System.Web.Mvc的所有行都从灰色变为黑色。但是,当我尝试步入属于System.Web.Mvc的代码时,仍然会收到“源代码不可用”错误消息。
所以,我加载了符号,但仍然没有源代码。这不是一个大问题,因为我仍然可以用旧的方式调试它。但我想知道微软符号服务器对什么有用呢?
答案 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确实非常有用。