.net 微软的公共符号服务器有什么用途?
到目前为止,我一直使用ASP.NET MVC框架源代码调试ASP.NET MVC。在我的笔记本电脑上,我尝试了另一种方法,即在调试时打开VS中的“模块”窗口,右键单击System.Web.Mvc,然后选择“从>Microsoft符号服务器加载符号” 由于System.Web.Mvc程序集的符号文件被报告为已加载,VS似乎实际加载了一些内容。此外,调用堆栈中属于System.Web.Mvc的所有行都从灰色变为黑色。但是,当我尝试单步执行属于System.Web.Mvc的代码时,仍然会收到源代码不可用的错误消息.net 微软的公共符号服务器有什么用途?,.net,visual-studio,debugging,symbols,.net,Visual Studio,Debugging,Symbols,到目前为止,我一直使用ASP.NET MVC框架源代码调试ASP.NET MVC。在我的笔记本电脑上,我尝试了另一种方法,即在调试时打开VS中的“模块”窗口,右键单击System.Web.Mvc,然后选择“从>Microsoft符号服务器加载符号” 由于System.Web.Mvc程序集的符号文件被报告为已加载,VS似乎实际加载了一些内容。此外,调用堆栈中属于System.Web.Mvc的所有行都从灰色变为黑色。但是,当我尝试单步执行属于System.Web.Mvc的代码时,仍然会收到源代码不可
所以,我加载了符号,但仍然没有源代码。这不是什么大问题,因为我仍然可以用老方法调试它。但是我想知道微软的符号服务器有什么用处 它们使堆栈跟踪对本机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
而且您无法从头开始查看。我还没有发现符号服务器对托管DLL有用-您仍然可以在没有它们的情况下获得托管堆栈跟踪。我认为托管符号的主要价值是行号信息,但你打算如何处理它
然而,如果没有调试本机代码的符号,我就无法生存。而且确实非常有用。根据我的经验,符号服务器对于托管和非托管调试都很有用,因为它们提供了非常需要的细节。其他人已经讨论了为什么这对本机代码很重要,所以我将继续使用托管代码 我使用WinDbg+Sos对托管代码进行了大量调试,我需要定期深入研究本机部分。请记住,对于操作系统而言,托管应用程序与非托管应用程序没有什么不同。最终,托管应用程序将调用Win32 DLL。要检查这些,您需要正确的符号 例如,如果您需要了解特定托管调用的详细信息,那么您确实需要查看本机代码。一个例子是,当您看到Monitor.Enter进入托管堆栈时。您无法通过查看调用本身来判断调用是刚刚发出还是线程正在等待*。通过转储本机调用堆栈,可以判断是否发出了对WaitForMultipleObjects的调用
*国家的国旗!threads命令将在这里帮助您,但是如果您想要详细信息,本地堆栈的转储仍然非常有用 这对于非托管代码是有意义的,但在托管代码中,即使不使用符号文件,我也可以看到外部代码的堆栈。所以我仍然想知道,如果加载符号不能访问源代码,为什么他们会为System.Web.Mvc托管符号文件。对于托管代码,我不知道。它是否允许您查看函数参数值,也许?感谢您提供到源服务器的链接!不幸的是,它并没有覆盖所有的程序集,但它看起来对那些它确实覆盖的程序集非常有用。请看这里: