如果在Visual Studio 2008中声明怪异

时间:2009-10-22 08:44:49

标签: c# .net runtime

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

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

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

我喜欢一些解释。

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

6 个答案:

答案 0 :(得分:8)

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

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

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

答案 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修复了这个问题。这不是同一个问题。