Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 微软的公共符号服务器有什么用途?_.net_Visual Studio_Debugging_Symbols - Fatal编程技术网

.net 微软的公共符号服务器有什么用途?

.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的代码时,仍然会收到源代码不可

到目前为止,我一直使用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托管符号文件。对于托管代码,我不知道。它是否允许您查看函数参数值,也许?感谢您提供到源服务器的链接!不幸的是,它并没有覆盖所有的程序集,但它看起来对那些它确实覆盖的程序集非常有用。请看这里: