【问题标题】:GDB on subtle lines when next or step下一步或步骤时,GDB 在细微的线条上
【发布时间】:2014-12-05 15:02:55
【问题描述】:

我使用 GDB 调试嵌入式 linux 目标板。在目标板上 gdbserver 正在运行剥离的二进制应用程序。在 PC 端,我运行附加了调试符号的应用程序。

通过以太网连接从 PC 执行“目标远程 ip:port”,并且与 gdbserver 的连接正常。我在一些函数中添加断点并继续。当我在我的简单函数中触发外部事件和程序中断时,调试器成功中断。奇怪的行为从这一点开始。当我在 GDB 控制台中执行 step 或 next 而不是下一行时,它会转到上一行而不是前进两行并向后退两行。每次我做下一步或步骤时,都会继续。没有循环或跳转,代码应该逐行执行,但事实并非如此。为什么 GDB 会这样?我应该怎么做才能解决这个问题。

【问题讨论】:

    标签: linux debugging gdb embedded gdbserver


    【解决方案1】:

    这是应用了高级优化的代码的正常行为。除非你真的打算调试优化器,否则在调试器中执行优化的代码几乎是没有用的。

    来自manual

    当你调试一个用‘-g -O’编译的程序时,记住优化器已经重新排列了你的代码;调试器向您展示了真正存在的东西。当执行路径与你的源文件不完全匹配时不要太惊讶!

    【讨论】:

    • “在调试器中执行优化代码几乎没用”——相反,许多错误出现在优化的构建中,最终需要学习如何调试优化的代码。但确实如果该错误也出现在未优化的代码中,那么调试未优化的变体会容易得多。
    • @EmployedRussian :正是出于这个原因,我确实说过“几乎” - 所以它几乎没有相反。此类错误通常通过使用未定义的行为 发生。如果您最终不得不出于编译器错误以外的任何原因调试优化代码,那么它可能首先说明了代码的一般质量。通常可以通过将警告级别设置为高并修复它们,或使用静态分析来避免此类错误。由于优化器执行的数据流分析,优化器通常可以在编译期间发现诸如可能未初始化的变量之类的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2014-03-24
    相关资源
    最近更新 更多