我遇到了一个非常奇怪的问题,甚至录下了我的会话,因为我认为没有人会相信我。
我遇到了一个似乎在非常基础的层面上存在的错误。这是一个单线程应用程序,我所做的就是求值一个布尔值。
这个布尔值等于false,然而,if语句却像它是true一样执行...你会明白我的意思的。我已经多次清理并重新构建解决方案,但毫无头绪。
请给我一些解释,谢谢。
我遇到了一个非常奇怪的问题,甚至录下了我的会话,因为我认为没有人会相信我。
我遇到了一个似乎在非常基础的层面上存在的错误。这是一个单线程应用程序,我所做的就是求值一个布尔值。
这个布尔值等于false,然而,if语句却像它是true一样执行...你会明白我的意思的。我已经多次清理并重新构建解决方案,但毫无头绪。
请给我一些解释,谢谢。
我猜测在部署过程中发生了一些奇怪的事情,因此pdb与实际代码不同步。如果您使用日志记录而不是调试器来确定发生了什么,我认为您将看到更合理的行为。我怀疑这不是CLR本身在处理“if”时表现出奇怪的行为 - 更有可能是调试器/运行时不一致。
我很久以前看到过类似的情况,是在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
我一个星期前也遇到了完全相同的问题。同时拥有VS2008,最新的SP。WinForms应用程序。值为false,但是if
语句却总是被执行。我正在进行与您视频中一样的调查。这里是我的代码片段:
if (CurrentFileFormatVersion > int.Parse(metaInfo.SimulationFileVersion))
throw new SimulationFormatException(ws, ss);
以“Release”方式编译的无调试器运行正常,请尝试。
我想VS2008调试器中有一个错误。在使用“if”和“throw”关键字时,可以以某种方式复现。
编辑:上面的“executed”一词是错误的,当然应该使用“已步入但未执行”的表述。
针对代码的奇异高亮现象,我也来一句“我也有这个问题”。我正在运行VS2008和C#。我的Windows Forms项目引用了另一个项目中的类库,并且我正在逐行调试两个项目。在某个时候,黄色高亮在调试时与实际执行的代码行相差了14到20行。
我关闭了VS,打开了两个项目的目录,并删除了bin/Debug和obj/Debug中的所有内容,然后重新启动了VS。在重新编译和逐步调试时,一切都正常了。
我不知道问题是在.manifest、.pdb还是.Cache文件中。这不重要。把它们全部删掉,然后就没问题了。
顺便说一句,谷歌几乎没什么用处,除了返回了这个SO线程之外。所有其他结果都是关于VC++模板和VS2005存在问题的,在那里一个SP修复了那个问题。这不是同样的问题。
我认为这看起来像是调试步骤范围不正确的情况。你不能总是相信调试器中的黄色高亮显示。你实际上没有进入到代码中。在 F# 的早期测试版中,我们遇到了很多类似的错误,其中黄色高亮会像疯了一样跳来跳去。调试器的高亮大多取决于编译器写入 .pdb 文件的“源范围”,该范围对应于特定编译指令集。
这是哪个版本的 VS/C#?
编辑 看到其他人的答案后,确实可能的原因是您的 .pdb 文件与您的 .dll 不同步。