版本与调试版本中的变量有奇怪的行为

时间:2011-10-21 18:51:37

标签: c++ visual-studio-2010

我在Visual Studio 2010中有一个C ++项目。

我只是想将两个字符串相互比较,但我在Release版本中看到了截然不同的行为。 Debug构建按预期工作。除了Visual Studio 2010设置的默认值之外,我没有对优化进行任何更改。

这是我的代码:

wchar_t validCRC[] = L"0xd07153b9";
wchar_t thisCRC[] = L"0xd07153b9"; // this is calculated on the fly but I get same behavior if I set it manually. i also tried setting these both to L"hello" and got same result

int cmp = 0;
cmp = wcscmp(validCRC, thisCRC); // if I put a breakpoint here, the visual studio debugger says 'cmp' is not in scope. 
pLog->Write("value of cmp: %d", cmp); // in both DEBUG and RELEASE, this prints "value of cmp: 0"

if (cmp == 0)
{ // yet for some reason, the DEBUG build follows this path
    return true;
}
else
{ // the RELEASE build follows this path
    return false;
}

2 个答案:

答案 0 :(得分:3)

发布版本已经过优化,因此调试器通常很难为您提供单个变量的值,尤其是局部变量,这些变量通常是存储的寄存器,稍后会用于其他一些指令。

这就是为什么你使用 debug 构建调试,以及发布构建你将发布的构建

如果你真的需要调试只发生在发布版本中的问题(未初始化的变量通常就是那里的原因),你可以使用特定于编译器的#pragma来仅对某些部分进行去优化,或者你可以de - 优化某些文件,或者您可以使用printf指令。

编辑:当你说“跟随”这条路径时,你可能意味着当你在调试器中单步执行它时的样子。同样,代码已经过优化,因此程序集与源代码不匹配。特别是返回通常是优化的,因此在程序集中只有一个实际的返回指令。因此,在发布版本中逐步执行代码并不是确定正在发生的事情的可靠方法。

再一次,调试版本构建的正确方法是使用printfs和其他机制。你仍然可以使用调试器来了解正在发生的事情,但你不能依赖这样的细节。

答案 1 :(得分:0)

尝试打印值而不是依赖于Release模式下的调试器。优化器非常具有攻击性,您的符号可能指向正在优化的代码。