【问题标题】:visual studio 2010 debugger - steps into an "if" statement despite condition falseVisual Studio 2010 调试器 - 尽管条件为假,但仍进入“if”语句
【发布时间】:2012-05-17 22:49:48
【问题描述】:

我正在使用 VS 2010 Professional(在 Windows 7 Professional 64 上),使用 WCF 4.0 编写。 我有以下代码:

        if (responseMessage.StatusCode == HttpStatusCode.NotFound)
        {                
            throw new ContentNotFoundException(contentId, SSPErrorCode.PartnerRestGetStream404);
        }

当将调试器附加到进程时,在“if”语句或之前设置断点,当条件为假(responseMessage.StatusCode 为“OK”)时,调试器将进入“if”语句。然后它跳过“throw”语句而不做任何事情,然后继续执行代码。

我试过了:

重新启动 VS,注销我的 Windows 用户,重新启动,清理解决方案,再次构建它,重新构建它,回收应用程序池,重新启动 IIS,在“if”语句和条件中添加更多代码 - 没有任何效果远。

必须有一个缓存,我可以清理它以摆脱它,但是什么,在哪里?

谷歌搜索我只发现 http:--social.msdn.microsoft.com/Forums/en-US/vsdebug/thread/d4b70fd7-b74a-42ce-a538-7185df3d3254/,所以我尝试手动设置断点,然后它没有在这个类中中断,尽管在其他类中也出现了同样的问题。

我很想在不重新安装 VS 的情况下解决这个问题。提前谢谢!


更新

  1. 由于我提出这个问题但找不到答案,我继续我的项目。
  2. 我偶然发现了这个问题,由 John MacIntyre 在this post 上报告,最终得到了一个简化示例:
using System; 

namespace IEnumerableBug2 
{ 
    class Program 
    {
        static void Main(string[] args) 
        {
            if (new object() == null)
                throw new Exception();
            try { }  catch { }
        }
    }
}

更新 #2

请注意,我的方法中还有一个 try-catch 语句,在 'if' 语句之后几行。

我刚刚尝试再次重现此错误,但失败了。我将把这个问题留给可能需要它的其他人,但是,正如我所写的,我不再能够重现这种行为。

【问题讨论】:

  • 看起来像是 IDE 中的真正错误。向 MS 报告。
  • 当面向 .NET 4.5 时,这似乎已在 Visual Studio 11 中得到修复;但是,当面向 .NET 4.0 时,该错误仍然存​​在。
  • 现在,多年后,我昨天遇到了这个问题。我注意到的是它似乎只发生在 if 语句中的代码只抛出异常时。在我的情况下也是如此。我将其注释掉,并用一些涉及字符串和布尔值的随机语句替换,它跳过了就好了。同时,虽然它似乎没有跳过异常抛出行,但实际上并没有执行它:尽管 Visual Studio 进入了 if 块,但没有抛出异常。奇怪,看起来像一个错误,但只要没有实际发生投掷,就不会严重。
  • @Rob - 是的,这是完全相同的行为。令人困惑,但并不完全影响调试逻辑。
  • 通过相关问题回答:stackoverflow.com/a/27552372/19308

标签: visual-studio-2010 debugging


【解决方案1】:

我也遇到了这个问题,但略有不同。 这是我的代码:

        string lockCode = Guid.NewGuid().ToString();
        bool alreadyLocked = string.IsNullOrWhiteSpace(lockCode);

        if (alreadyLocked) {
            throw new Exception("already running");
        }

        try {
            PerformTask(task);
        }
        finally {
            UnlockTask(task, lockCode);
        }

如您所见,lockCode 字符串始终分配有 Guid 值。调试器会进入“if”范围,尽管它不应该这样做。不抛出异常。

我正在使用 ReSharper 6.0 的 Windows 7 64 位上运行 Visual Studio 2010 SP1。

Microsoft Visual Studio 2010
Version 10.0.40219.1 SP1Rel
Microsoft .NET Framework
Version 4.0.30319 SP1Rel
Installed Version: Premium

这发生在我使用框架 4.0 上的 ASP.NET 应用程序时。 我尝试在我的机器上的另一个项目上运行此处发布的重现代码,但无法重现该问题。

另外,我已经删除了此路径上 .NET Framework 的 Shadow Copy Cache:

C:\Users\username\AppData\Local\assembly

我删除了 VS2010 符号缓存目录和临时 ASP.NET 文件。 我重新启动了计算机,清理了整个解决方案并重建了所有内容。 不知道为什么会这样。

解决方法:如果我从方法中删除“try-finally”部分,或将 throw 语句提取到不同的方法,调试器会正确地跨过“if”范围。

很抱歉没有发布真正的解决方案,我希望这有助于隔离问题或解决问题。

【讨论】:

    【解决方案2】:

    今天我也遇到了这个问题。下面的代码解决了这个问题,优点是不编译发布版本的解决方法:

    using System; 
    
    namespace IEnumerableBug2 
    { 
        class Program 
        {
            static void Main(string[] args) 
            {
                if (new object() == null)
                    throw new Exception();
    
                #if DEBUG
                bool workaround = true; // dummy instruction
                #endif
    
                try { }  catch { }
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      虽然实际上发生了奇怪的事情,但我高度怀疑这是调试器中的错误或 VS 安装错误。

      我认为一定是发生了一些事情,你没有正确地进行干预。您是否将表达式“responseMessage.StatusCode == HttpStatusCode.NotFound”放入调试观察窗口?它返回什么?是否有可能 StatusCode 每次都返回不同的值?您是否尝试过多次评估以确保其一致?

      我可以想象这种情况发生的唯一方法是如果代码被更改,并且当系统提示您是否要调试源文件(即使其版本不匹配)时,您的回答是“是”。这可以解释为什么你可以跳过“抛出”行而不做任何事情——你不是在调试你看到的实际代码,而是它的旧版本。要解决此问题,请重新构建所有内容,即使版本不匹配,也不要在提示您是否要调试时说“是”——这太令人困惑了!

      【讨论】:

      • 感谢您的回复。奥马尔。我很抱歉地说不是这样。我已经检查了返回码的值,并且已经这样做了好几次,并确保条件本身返回“false”。是的,很有可能原因是正在调试的代码缓存不是最新版本的代码,但是,正如我在问题本身中所写的那样,我已经清理了解决方案,重建,甚至重置了 IIS和机器本身。我也把这种奇怪的行为展示给了我的几个同事,还有我的老板,他们自己也试过了,也检查过了,所以这不可能是我梦寐以求的......
      • 如果在 If 语句或 throw 语句上设置新断点,代码编辑器边缘的断点图标是全红,还是只是一个未填充的红圈?如果它不是完全红色,则在您重建所有内容后,打开“模块”窗口并找到应用程序从中加载您的 DLL 的路径。在资源管理器中转到该路径并验证 DLL 是“刚刚”创建的,而不是不久前创建的。
      • 另外,如果你在 if 之前放置一个 MessageBox.Show("1"),在 if 中放置一个 MessageBox.Show("2"),以及一个 MessageBox.Show("3" ) 就在 if 之后,三个 MessageBox 中的哪一个出现?
      • 另外,也许这会有所帮助:weblogs.asp.net/mreynolds/archive/2003/08/11/23576.aspx
      • OP 是正确的,这是 Visual Studio 的一个已知问题,请参阅:stackoverflow.com/a/27552372/19308
      猜你喜欢
      • 1970-01-01
      • 2020-08-19
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      • 2020-09-30
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多