【问题标题】:If statement weirdness in Visual Studio 2008Visual Studio 2008 中的 if 语句异常
【发布时间】:2009-10-22 08:44:48
【问题描述】:

我遇到了一个非常奇怪的问题,我记录了我的会话,因为我认为没有人会相信我。

我遇到了一个似乎处于非常基本级别的错误。这是一个单线程应用程序,我所做的只是评估一个布尔值。

布尔值等于假,然而,if 语句的执行就好像它是真的......有点。你会明白我的意思。我已经清理了解决方案并重建了很多次。不知道发生了什么。

请给我一些解释。

http://www.youtube.com/watch?v=ope9kxEyt4g

【问题讨论】:

  • 什么版本的VS?您是否应用了最新的服务包?
  • 您能发布为该代码生成的 IL 吗?
  • 几个月前我在 SO 上看到过另一个关于同样情况的问题,但我终其一生都无法找到原因/解决方案。
  • 附带问题:您使用哪种工具制作视频?帧率看起来比我用 Camtasia 管理的更流畅。
  • 您是否使用像 PostSharp 这样的 AOP 工具在构建之后/作为构建的一部分修改程序集?从你点击调试按钮到你的代码开始的时间,它看起来并不像它,但在某些情况下,当涉及到与源代码行相关的可执行代码的位置时,这些也可能会导致调试器出错。跨度>

标签: c# .net runtime


【解决方案1】:

我以前见过很多次。基本上发生的事情是您正在调试的代码与您看到的代码不匹配。

我不知道是什么原因造成的,解决方案遵循货物崇拜指南。

  • 关闭 Visual Studio 的所有副本
  • 删除此项目的所有 bin 和 object 文件夹
  • 删除所有 .NET 项目的所有 bin 和 object 文件夹
  • 删除您在“C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files”中找到的所有文件

【讨论】:

  • 我已经删除了 bin 文件夹中的所有文件,我完全忘记了 obj 和临时 asp 文件。会试一试。我仍然不明白为什么硬编码 false 会产生所需的结果,或者为什么放入 else 语句可以解决问题。
  • 对不起,我不得不否决你的答案,但事实证明,做所有这些事情仍然没有解决问题。我已经删除了所有 bin 文件夹、Obj 文件夹、所有 x86 和 x64 的临时 asp 文件,但仍然存在相同的问题。
  • 无赖。如果您找到其他答案,请告诉我。
【解决方案2】:

我的猜测是部署时发生了一些奇怪的事情,因此 pdb 与实际代码不同步。如果您使用日志记录而不是调试器来确定发生了什么,我怀疑您会看到更明智的行为。我怀疑这是因为 CLR 本身在“如果”时表现得很奇怪——它更有可能是调试器/运行时不一致。

【讨论】:

  • 我自己清除了 bin 文件夹,我们正在谈论一个全新的构建。我喜欢放入调试语句以查看发生了什么的想法。我会试试这个。谢谢乔恩。
  • 第二个。调试我正在升级的 ASP.NET 应用程序有时会使调试器有点偏离。最简单的例子是当你在一个方法中插入一些代码时,开始调试并看到这些行从未被执行——它们只是被跳过了。或者当调试器突出显示一行但实际执行下一行时。删除 obj/ 和 bin/ 文件夹总是对我有帮助。
【解决方案3】:

我很久以前在 Delphi 中看到过一个类似的案例,所以我的问题是:你是为 Release 还是 Debug 编译,有还是没有优化?

我问的原因是,有一次,在调试会话期间,我发现了一个由 4-5 行代码组成的小过程,根据调试器的说法,它似乎正在反向执行。

基本上,使用以下类型的代码:

procedure Test;
begin
    Line1;
    Line2;
    Line3;
    line4;
end;

根据调试器,执行顺序是这样的:

procedure Test;
begin             start -+
    Line1;               |                             +-> here -+
    Line2;               |                   +-> here -+         |
    Line3;               |         +-> here -+                   |
    line4;               +-> here -+                             |
end;                                                             +-> end

原因是这些行之间没有副作用,因此编译器通过重写代码来“优化”代码,实际上是重新排列代码以完全反向执行。

那么,您是否有更下方的 throw 语句实际上是正在执行的语句,但编译器将此显示为您遇到问题的语句,因为由于重新排列代码,实际上只发出了两个 throw 语句一次作为可执行代码?

注意:我没有任何理由知道这就是 Visual Studio 正在做的事情,但这是我在看到您的视频时想到的。

【讨论】:

    【解决方案4】:

    我认为这看起来像是调试步进范围刚刚关闭的情况。您不能总是相信调试器中的黄色突出显示。你实际上并没有介入。在早期的 F# Beta 中,我们有很多这样的错误,黄色高亮会像疯了一样跳来跳去。调试器突出显示主要取决于编译器写入 .pdb 文件的任何内容,作为对应于特定编译指令集的“源范围”。

    这是什么版本的 VS/C#?

    编辑 看过其他人的回答,确实可能的原因是您的 .pdb 文件与您的 .dll 不同步。

    【讨论】:

    • 我会在周一回去工作时尝试清除 obj 文件以及所有其他临时文件和生成的文件。我会及时通知大家。
    【解决方案5】:

    一周前我遇到了完全相同的问题。还有VS2008,最新的SP。 WinForms 应用程序。该值为 false 但始终执行 if 正文。我正在做与您的视频中相同的调查。这是我的一段代码:

     if (CurrentFileFormatVersion > int.Parse(metaInfo.SimulationFileVersion))
         throw new SimulationFormatException(ws, ss);
    

    在没有编译为“Release”的调试器的情况下运行很好。试试看。

    我想在 VS2008 调试器中有一个错误。以某种方式可以使用“if”和“throw”关键字重现。

    编辑:上面的“执行”一词当然是错误的。必须改用“已介入但未执行”。

    【讨论】:

    • if-block 是真的执行了还是只是被调试器高亮了?在 Vince 的视频中,似乎代码没有被执行(异常对象 e 为空)。
    【解决方案6】:

    只需在代码的时髦突出显示时添加“我也是”。我正在用 C# 运行 VS2008。我有一个 Windows 窗体项目引用另一个项目中的类库,我正在逐行调试。 “在某些时候”,调试中的黄色突出显示与正在执行的实际行相差 14 到 20 行。

    我关闭了 VS,打开了两个项目的目录,删除了两个目录中 bin/Debug 和 obj/Debug 中的所有内容,然后重新启动了 VS。在重新编译并逐步调试时,一切都很好了。

    我不知道问题出在 .manifest、.pdb 还是 .Cache 文件中。没关系。把嗯全部吹走就没事了。

    FWIW,谷歌搜索几乎没用,只是它返回了这个 SO 线程。所有其他命中都是关于 VC++ 模板和 VS2005 的问题,其中一个 SP 解决了这个问题。这不是同一个问题。

    【讨论】:

    • 我放弃了这个问题。我尝试了一切,我从临时 Internet 文件中清除了所有 DLL,Bin 中的所有本地文件,甚至将解决方案移至另一台 PC。问题似乎出在调试器中,不知道为什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多