我遇到一个很奇怪的问题,我记录了我的会话,因为我认为没有人会相信我。
我遇到了一个似乎处于非常基础的错误。这是一个单线程应用程序,我正在做的就是评估一个布尔值。
布尔值等于false,但if语句正在执行,好像它是真的......排序。你会明白我的意思。我已经清理了解决方案并重建了很多次。不知道发生了什么。
我喜欢一些解释。
答案 0 :(得分:8)
过去我见过很多次。基本上发生的事情是您正在调试的代码与您看到的代码不匹配。
我不知道是什么导致这种情况,解决方案遵循货物崇拜准则。
答案 1 :(得分:6)
我的猜测是部署时发生了一些奇怪的事情,因此pdb与实际代码不同步。如果您使用日志记录而不是调试器来计算正在发生的事情,我怀疑您会看到更明智的行为。我怀疑它是CLR本身与“if”表现得奇怪 - 它更可能是调试器/运行时不一致。
答案 2 :(得分: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正在做的事情,但这是我在看到您的视频时想到的。
答案 3 :(得分:0)
我认为这看起来就像调试步进范围刚刚关闭的情况。您无法始终信任调试器中的黄色突出显示。你实际上并没有踩到它。在早期的F#Betas中,我们有很多像这样的错误,黄色突出显示会疯狂地跳来跳去。调试器突出显示主要是由编译器写入.pdb文件的任何内容,作为对应于特定编译指令集的“源范围”。
这是什么版本的VS / C#?
EDIT 看过其他人的答案后,确实可能的原因是您的.pdb文件与您的.dll不同步。
答案 4 :(得分:0)
一周前我遇到了完全相同的问题。还有VS2008,最新的SP。 WinForms应用程序。该值为false,但始终执行if
正文。我和你的视频一样进行同样的调查。这是我的代码:
if (CurrentFileFormatVersion > int.Parse(metaInfo.SimulationFileVersion))
throw new SimulationFormatException(ws, ss);
没有调试编译为'Release'的运行很好。试试吧。
我想VS2008调试器中存在一个错误。以某种方式可以使用'if'和'throw'关键字重现。
编辑:上面的“执行”一词当然是错误的。 <步入但未执行'必须改为使用。答案 5 :(得分:0)
在这里添加一个“我也是”代码的时髦突出显示。我用C#运行VS2008。我有一个Windows Forms项目引用另一个项目中的类库,我正在逐行调试。 “在某些时候”调试中的黄色突出显示是从正在执行的实际行中偏离14到20行。
我关闭VS,打开两个项目的目录,从bin / Debug和obj / Debug两个目录中删除所有内容,然后重新启动VS.在重新编译和逐步调试时,一切都很好。
我不知道问题是在.manifest,.pdb还是.cache文件中。没关系。把你吹走,一切都会好的。
FWIW,谷歌搜索几乎无用,只是它返回了这个SO线程。所有其他命中都是关于VC ++模板和VS2005的问题,其中SP修复了这个问题。这不是同一个问题。