如果在Visual Studio 2008中声明怪异

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

我遇到了一个似乎处于非常基础的错误。 这是一个单线程应用程序,我正在做的就是评估一个布尔值。

布尔值等于false,但if语句正在执行,好像它是真的……排序。 你会明白我的意思。 我已经清理了解决方案并重建了很多次。 不知道发生了什么事。

我想要一些解释。

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

我过去曾多次见过这种情况。 基本上发生的事情是您正在调试的代码与您看到的代码不匹配。

我不知道是什么导致这种情况,解决方案遵循货物崇拜准则。

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

我的猜测是部署时发生了一些奇怪的事情,因此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 

原因是这些行在它们之间是无副作用的,因此编译器通过重写它来“优化”代码,实际上重新排列代码似乎完全反向执行。

那么,你是否有一个更低的throw语句实际上是执行的那个,但编译器将此显示为你遇到问题的那个,因为,由于重新安排代码,两个throw语句实际上只发出一次作为可执行文件码?

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

我认为这看起来就像调试步进范围刚刚关闭的情况。 您无法始终信任调试器中的黄色突出显示。 你实际上并没有踩到它。在早期的F#Betas中,我们有很多这样的错误,黄色突出显示会疯狂地跳来跳去。 调试器突出显示主要由编译器写入.pdb文件的任何内容构成,作为对应于特定编译指令集的“源范围”。

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

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

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

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

没有调试编译为’Release’的运行很好。 试试吧。

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

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

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

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

我不知道问题是在.manifest,.pdb还是.cache文件中。 没关系。 把你吹走,一切都会好的。

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