Compiler construction GDB这样的调试器如何处理ICC/GCC等编译器进行的代码优化?

Compiler construction GDB这样的调试器如何处理ICC/GCC等编译器进行的代码优化?,compiler-construction,gdb,Compiler Construction,Gdb,假设我们正在编译程序以使用ICC创建进程二进制文件。。稍后当它在机器中执行时,我们要调试它。。(非常普通的过程..很抱歉这么琐碎的解释)。。GDB是如何处理ICC执行的代码优化的?当涉及到编译器优化时,GDB通常基于GIGO原则。也就是说,编译器将它所做的事情的描述发送到调试信息中,gdb读取并解释这些信息。因此,gdb由编译器决定;事实上,不同编译器生成的调试信息之间存在真正的质量差异 用户会遇到其中一些问题。这不是一个详尽的列表,但我认为它涵盖了常见的 有时打印变量会产生。这通常发生在局部

假设我们正在编译程序以使用ICC创建进程二进制文件。。稍后当它在机器中执行时,我们要调试它。。(非常普通的过程..很抱歉这么琐碎的解释)。。GDB是如何处理ICC执行的代码优化的?

当涉及到编译器优化时,GDB通常基于GIGO原则。也就是说,编译器将它所做的事情的描述发送到调试信息中,gdb读取并解释这些信息。因此,gdb由编译器决定;事实上,不同编译器生成的调试信息之间存在真正的质量差异

用户会遇到其中一些问题。这不是一个详尽的列表,但我认为它涵盖了常见的

  • 有时打印变量会产生
    。这通常发生在局部变量上,这意味着编译器发出了调试信息,注意到变量存在,但没有关于如何恢复变量值的调试信息。自从“VTA”补丁登陆以来,GCC一直努力在这些情况下发出巧妙的调试信息,但即使有了这些补丁,也不能总是这样做

  • 有时内联意味着回溯看起来很奇怪。在这里,GCC非常好地描述了内联决策;但还有其他一些情况,比如部分内联,可能会令人困惑

  • 优化常常导致gdb中的非线性步进。当归属于一行的指令在归属于其他行的指令之前或之后移动时,就会发生这种情况。据我所知,没有人真正努力解决这个问题,用户的答案是,调试优化代码时必须习惯这一点


我不知道你的编译器在这种情况下会做什么。如果您对DWARF有一定的了解,那么编写一些测试用例并检查生成的调试信息并不难。

非常感谢您提供了经过良好编译/详细的答案。。!!