调试时出现“当前上下文中不存在变量”的错误

31

我插入了两个临时变量并想查看它们的值,但是我无法看到它们。我可以通过将其放置在其他地方来解决它,但我对为什么会出现这种行为感到感兴趣。

   public float Value
    {
        get
        {
            float result = Memory.ReadFloat(Address);

            double Radian = Math.Round(result, 2); // **BREAK POINT HERE**
            double Degree = Math.Round(Math.Round((double)(result * 180 / Math.PI)), 2); // **BREAK POINT HERE**

            return result; // **BREAK POINT HERE**
        }
    }

我的程序出现了三个错误,但我无法在Visual Studio 2012中查看变量的值。只有结果会出现在本地窗口中,没有名为“Radian”或“Degree”的变量。

例如,如果我添加一个“Radian”变量的监视器,我会得到带有红色十字标志的以下消息:

Radian - 当前上下文中不存在名称为“Radian”的内容

5个回答

69

可能是本地变量被JIT编译器优化掉了。由于您正在使用Visual Studio,您可以尝试将配置切换到Debug并重新构建。

如果无法解决问题,您可以配置JIT编译器以禁用优化并生成跟踪信息 - 可以在此处查看如何设置配置。这应该允许您在将调试器附加到进程时看到本地变量。


4
谢谢。显然,从 Visual Studio 优化带有断点的代码似乎很愚蠢。很明显我想要使用它:D - Dominik Antal
13
我把我的配置管理器从“发布版”改为“调试版”,现在它可以工作了。 - Riaan

22

我在使用VS2012时遇到了另一种情况,会导致变量在调试模式下“消失”:

请确保你没有出现以下情况:

if(false)
   {
   .
   }
else
   {
   //Code here will be optimized and variables will not be available.
   }

请阅读此链接:http://stackoverflow.com/about,以更深入了解SO上的问题/答案。您的贡献并非回答问题,而是更像评论。一旦您提高了声望,可以将其添加:http://stackoverflow.com/faq#reputation - Radim Köhler
13
@RadimKöhler,你错了。他在这里提供的答案救了我的一天,我为解决这个问题而疯狂,结果如此简单。我在我的代码中添加了一个if(false)以避免长时间运行的块并测试另一个点,我的错误与ishayle所描述的相同。 - Diego Mendes
所以这个答案也帮助了我,但是被优化的代码不在else结构内。有时候我会在if else上面添加if(1==2)而不是注释掉代码。结果发现在此之下的变量对调试器不可用。 - CLRBTH
我在这里也遇到了同样的问题,这个解决方案对我来说也解决了“变量不存在于当前上下文”错误(Visual Studio 2010 SP1)!在过去的几个小时里,我只找到了像“使用调试构建,不要使用优化”之类的建议。我做到了!但我从未想过if(false)会导致Visual Studio 2010出现这种行为。显然是VS中的一个bug!再说一遍: 如果你在鼠标悬停或Watch/Locals下看不到变量内容,请在方法或类中搜索if(false)或可能被编译器优化的东西(即使在Debug模式下),并将其删除。 - Gerrit
1
如果可以的话,我会给这个答案点赞+20。这个问题在Visual Studio 2010中困扰了我数月,我从未找出是什么触发了它。我在网上进行了许多搜索,这是我遇到的唯一解释这种微妙差别的答案。不得不把本地变量提升到更高的范围才能在调试器中看到它们,真的很烦人!再次感谢你。 - Special Sauce

18

如果您正在尝试在发布版本中进行调试(而不是调试版本),则会出现此错误。将解决方案配置更改为Debug(Any CPU),您就能在立即窗口中查看变量的值。


我遇到的问题是所有在调试中的项目都被设置为发布,因此所有代码都被优化了... 直到看到你的答案并解决了我最近一直有的很多问题,我才意识到这一点 :) - Asken

2
我有一个.NET Standard项目,对我有用的方法是:
  • 项目属性。
  • 生成选项卡。
  • 高级按钮(在右下角)。
  • 将“调试信息”选项更改为“完整”。
  • 列表项
它曾经被设置为“可移植”。将其更改为“完整”使我能够再次在监视和立即窗口中看到变量。
不确定是否相关,但我最近将该项目从PCL转换为.NET Standard。也许在转换过程中有些东西丢失了。

适用于我 <3 - CorrM
节省了我大量的时间! - E-A

0

我将我的解决方案配置更改为Debug(Any CPU),但那不是问题所在。升级到Visual Studio 2017后,我以为我处于Debug模式,但还有一个简单(但重要)的步骤。(对大多数人来说可能很明显,但我错过了。)在“解决方案配置”设置为“Debug”的情况下,我还必须单击“Debug”旁边的向下箭头并选择“配置管理器...”,然后在相应的弹出窗口中,“配置”仍然设置为“Release” - 我必须将其更改为“Debug”并单击“关闭”按钮。从那里重新运行允许我在调试时查看所有变量。


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