“没有可用的源代码” - Visual Studio调试(即使符号已加载)

4
我已经设置好Visual Studio 2012专业版以下载调试符号。它已正确设置并且符号已下载。
我到达了我想要单步执行的代码行:
bool result = Membership.ValidateUser("user", "password");

我右击它并选择step into specific-->Membership.ValidateUser()
然后在Visual Studio中打开一个标签,显示:

无可用源代码 - 当前位置没有可用的源代码

Membership.ValidateUser()位于System.Web.dll中的System.Web.Security命名空间中。如果我打开模块窗口,就可以清楚地看到已下载该程序集的符号。
如果符号都在那里,为什么我不能进入源代码呢?

1
请查看此链接:http://blogs.msdn.com/b/sburke/archive/2008/01/16/configuring-visual-studio-to-debug-net-framework-source-code.aspx。向下滚动至“常见问题/故障排除”,然后查看步骤3。 - Lander
谢谢Lander,我已经尝试了这个步骤,但它并没有解决问题。 - Duncan Gravill
4个回答

2
您可能拥有符号,但您没有源代码。PDB对于调试来说并不足够,但将源代码与可执行文件链接起来是必要的。PDB非常适合报告漏洞,因为它们提供了调用堆栈的详细信息,但是为了进行调试,您需要拥有源代码。

如果我有 .net framework 4.0,那么我应该拥有 System.Web.dll 的源代码,因为它是 .net 的一部分 - 那么为什么 VS 无法看到源代码,我该如何解决这个问题? - Duncan Gravill
1
System.Web.dll只是编译后的代码。您需要拥有System.Web的.cs或.vb文件。 - Adauto
@Adauto 抱歉,但您是错误的。这就是符号的作用。dll被反汇编,符号使得可以看到方法名称等信息。 - Duncan Gravill
从blogs.msdn.com/b/sburke/archive/2008/01/16/… faq(3)看起来他在某种程度上是正确的,虽然PDB具有调用堆栈信息等,但仍可能缺少源代码,并且当从referenceserver.microsoft.com/symbols下载时,实际上会在临时文件夹中获取.cs文件。 - yoel halb

2

嗨,Richard,我尝试通过将光标放在方法调用上并按F12打开源类定义,但它不允许我设置任何断点。你所说的“进入源代码”是什么意思?我该怎么做?我一直在右键单击该方法并选择“跳转到特定位置”。此外,调用堆栈中的所有帧都已加载其符号。没有任何一个变灰,如果我右键单击,则“加载符号”在菜单中是灰色的。你提到的其他设置我已经正确了。 - Duncan Gravill
我认为这不是问题,因为 .NET 4.0 很早就发布了。事实上,他们正在准备发布4.5版本。而且,我已经确定我成功下载了与我的 .net 版本匹配的 System.Web.pdb 文件,但出于某种原因,它无法进入源代码。 - Duncan Gravill
@FunkyFresh84 我认为你只需要检查一下 System.Web.dll 是否被打了补丁或热修复。 - Richard Anthony Freeman-Hein
Richard,我正在尝试按照Cory Plotts在你提供的链接中所描述的方法下载源代码和符号。我已经下载了.NET 4.0源代码并将其安装到了我的C:\Users\Duncan\Documents\RefSrc文件夹中。现在我该如何配置VS以使用此位置处的源代码和符号呢?谢谢。 - Duncan Gravill
@FunkyFresh84 我认为这对你不起作用,因为4.5有一个新版本的System.Web.dll,被4.0使用。如果你想调试4.0,你需要在一个干净的盒子或虚拟机上安装4.0(例如,带有VS2010)。看看ASP.NET 4.5的变化(当然包括System.Web.dll):http://www.asp.net/vnext/overview/whitepapers/whats-new#_Toc318097382。如果你删除符号缓存(或移动位置),它将尝试拉下版本。选择4.0时拉下的版本是针对4.5使用的System.Web.dll相同的版本。 - Richard Anthony Freeman-Hein
@FunkyFresh84 另请参阅:http://blogs.msdn.com/b/dotnet/archive/2011/09/26/compatibility-of-net-framework-4-5.aspx。这表明System.Web.dll的4.5版本确实取代了4.0版本。它们不再兼容。这是为什么将4.5与4.0保持相同版本号是一个坏主意的又一个原因。 - Richard Anthony Freeman-Hein

1

我遇到了类似的问题,以下是我解决的方法:

右键单击项目 -> 属性 - > 编译 -> 高级编译选项...

然后从下拉菜单中将“生成调试信息”设置为“完整”。

希望这能帮到你。


1

我遇到了同样的问题,在我的情况下是版本4.0而不是4.5,但问题仍然存在。

在使用Fiddler进行检查后,发现对于许多DLL文件,referenceserver.microsoft.com服务器返回404,然后Visual Studio会回退并从msdl.microsoft.com的Microsoft符号服务器下载它,该服务器不包含实际的源代码。

因此,归根结底,使用Microsoft的代码进行源代码调试似乎并不总是有效,可能需要使用.NET Reflector

我刚刚发现另一个Stack Overflow答案,.NET framework source stepping not working despite options set,根据它的说法,问题可能与SP1有关。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接