10

使用 Visual Studio 2008 SP1 和一个 VB.NET 项目;我有一些我无法进入的代码。立即窗口显示消息“不带符号 'Some.Namespace.Here' 的单步方法”

我怎样才能确保方法总是有符号?!我需要进入每一行代码。我正在按 F8(这是 VS2008 中的“步入”,从内存中我认为它曾经是 VS2005 中的 F11)。

这个调试器的东西总是让我感到困惑:在解决方案级别的属性页中,我看到一个包含 4 个值的配置下拉列表:活动(调试)、调试、发布、所有配置。- 当前设置为“活动(调试)”在项目级别,我看到一个包含 2 个值的配置下拉列表:调试、发布。- 当前设置为“调试”

4

3 回答 3

22

我知道这是一个老问题,但是您是否在返回 IEnumerable 的方法中使用了 yield 功能?

例如(人为):

public IEnumerable<object> GetObjects(IEnumerable<object> objects)
{
    foreach(var obj in objects)
        yield return obj;
}

我经常在单元测试中遇到这个问题,但是由于延迟评估,yield 语句在必要时才会处理。例如,强制枚举的一种方法是将 .ToList() 附加到调用语句,尽管您不希望永久这样做,除非调用可能是对枚举本身并不重要的某些功能的测试。

因此,执行以下操作应导致枚举:

GetObjects(new List<object>()).ToList();

简而言之,如果您正在调用需要枚举的方法,但从不枚举结果,您将在输出中得到该错误。这也可能发生在 LINQ 语句中,例如 .Select。

编辑:没有注意到这是一个 VB.NET 项目,但我很确定原则仍然存在。

于 2010-04-15T11:06:25.760 回答
4

我在 Visual Studio 2010 中遇到了同样的问题。我会尝试进入 .NET Framework 源代码,Visual Studio 会跳过它,输出窗口会说它无法进入,因为没有加载符号文件但是当我查看模块窗口时,我会看到相关的符号文件实际上已加载。

问题是加载了 .NET 符号文件,但它不是包含源信息的 .NET 符号文件。Microsoft 位于http://referencesource.microsoft.com/symbols的公共符号服务器包含带有源信息的符号。Microsoft 的公共符号服务器http://msdl.microsoft.com/download/symbols包含没有源信息的符号。

一种解决方案是正确设置 _NT_SYMBOL_PATH 以便它从http://referencesource.microsoft.com/symbols获取 .NET Framework 符号(如果存在),否则从http://msdl.microsoft.com/download/symbols获取。像这样的东西会起作用:

_NT_SYMBOL_PATH=SRV*d:\SymbolsCache*http://referencesource.microsoft.com/symbols;SRV*d:\SymbolsCache*http://msdl.microsoft.com/download/symbols

这个 _NT_SYMBOL_PATH 将使调试器首先查找具有源信息的符号,然后如果没有,它将获取没有它的符号。当 Visual Studio 有一个包含源信息的符号文件时,它能够单步执行该代码。

于 2010-12-22T19:41:14.570 回答
0

If the namespace in question is a third party dll that didn't come with the symbols (pdb file) then this will occur. In order to "step into" the symbol file is needed.

If it's your own code then you would just need to double check that your symbol files exist. Having it set to debug at the project level should do this.

于 2009-09-30T01:29:53.980 回答