2014-09-22 89 views
-2

我知道,在发布版本中单步执行代码会导致指示当前代码执行点的箭头跳过一些(至少表面上)怪异和误导地方。我的问题是:有没有什么可以预测和理解的东西可以读懂,哪些可能有助于解决仅在发布版本中发生的问题,但不能在调试版本中解决问题?Visual Studio C++在发布版本中单步执行代码

具体的例子,我试图去底部:(工程调试,而不是在释放)

void Function1(void) 
{ 
    if (someGlobalCondition) 
    Function2(10); 
    else 
    Function2(); 
} 

void Function2(const int parameter = 1) // see note below 
{ 
    DoTheActualWork(); // any code at all 
} 

// and finally lets call Function1() from somewhere... 
Function1(); 

注:为简便起见,我跳过这两个功能在头部声明的事实文件,并在.cpp文件中单独实现。因此Function2()中的默认参数表示法已经有了一些自由度。确定 - 如此在调试,这工作得很好。在发行版中,即使对someGlobalCondition有明确的依赖,代码指针始终会完全跳过Function1()的主体,并直接执行Function2(),但始终使用默认参数(并且始终使用10)。这种暗示Function1()正在编译时被优化......但是有没有得出这样结论的基础?有什么方法可以确定发布版本是否真的检查过someGlobalCondition

P.S. (1)不,这不是一个XY问题。我给出Y的上下文,这样我可以让问题X更有意义。 (2)不,我不会发布我的实际代码,因为这会强调Y这个问题,这个问题对除我以外的任何人都有非常低的价值,而X问题是多年来一直困扰我(可能还有其他人)的问题。

+1

尝试在'someGlobalCondition'中设置易变的变量 – 2014-09-22 05:20:41

+0

对于Y问题,我已经提出了很好的建议,即使它并不适用于我的情况。但...我真的不能强调,我想知道在哪里可以找到有用的文档,可以照亮X问题。 – omatai 2014-09-22 21:40:45

+0

函数'Function2'执行依赖于'parameter'吗? – 2014-09-22 22:27:11

回答

0

而不是寻求文件来解释显然莫名其妙的,当你单步骤切换到反汇编视图。您将会看到编译器如何优化您的代码以及它如何考虑所有内容......因为考虑了所有内容。

如果您没有看到为条件运行时间测试(例如jnetestcmp等)的证据,那么你可以安全地假设编译器已经确定了你的条件(S)为常数,你可以调查为什么是。如果您看到有关条件的证据正在测试,但从未得到满足,那么这将指向另一个方向。此外,如果您觉得优化的好处不会超过难以理解的代码执行点行为的成本,那么您可以始终关闭优化。

0

那么,在没有您的实际的代码时,我们可以推测的是,编译器发现someGlobalCondition从来就不是真的。

这是唯一可以正确优化出Function1并且始终使用1参数直接呼叫Function2的情况。

如果你想成为某些这种优化正在发生,最好的选择是分析编译器生成的汇编代码或机器代码。

+0

对不起 - 我会因为你回答Y的问题而沮丧,因为我刚才已经明确表示只是在那里为情境提供了一个X问题的例子。你怎么“知道”这是真的?如果在某处有文件可以证明它?这可能会为X问题提供一个有用的答案,我会反而赞成。 – omatai 2014-09-22 21:32:53

相关问题