GCC 优化和调试

0xb*_*00d 4 c debugging gcc compiler-optimization

我不完全理解以下内容:

当同时使用调试和优化时,优化器执行的内部重新排列会使得在调试器中检查优化程序时很难看到发生了什么。例如,语句的顺序可能会改变。

我的理解是,当我使用该-g选项构建程序时,可执行文件将包含一个符号表,其中包含变量、函数名称、对它们的引用及其行号。当我使用优化选项构建时,例如指令的顺序可能会根据优化而改变。

我不明白的是,为什么调试更困难。我想看一个例子,以及一个易于理解的解释。

Sam*_*nen 5

一个可能发生的例子:

int calc(int a, int b)
{
    return a << b + 7;
}

int main()
{
    int x = 5;
    int y = 7;
    int val = calc(x, y);
    return val;
}
Run Code Online (Sandbox Code Playgroud)

优化这可能与

int main()
{
    return 642;
}
Run Code Online (Sandbox Code Playgroud)

一个人为的例子,但试图在实际代码中调试这种优化并不简单。有些调试器可能会在单步执行时显示所有标记的代码行,有些可能会跳过它们,有些可能会感到困惑。开发人员至少是。


dor*_*ron 5

简单的例子:

int a = 4;
int b = a;
int c = b;
printf("%d", c);
Run Code Online (Sandbox Code Playgroud)

可以优化为:

printf("%d", 4);
Run Code Online (Sandbox Code Playgroud)

事实上,在优化编译中,编译器很可能会这样做(当然是在机器代码中)

调试时,调试器将允许我们检查 a、b 和 c 关联的内存,但是当顶部版本优化为底部版本时,a、b 和 c 不再存在于 RAM 中。这使得检查 RAM 来弄清楚发生了什么变得更加困难。