【问题标题】:Value optimized out in GDB: Can gdb handle decoding it automatically?GDB 中优化的值:gdb 可以自动处理解码吗?
【发布时间】:2012-10-15 15:36:51
【问题描述】:

1) 首先我想知道,如何解码这些变量?

我知道这个问题的解决方案,删除优化标志,让它不稳定,我不想做所有这些。是否有任何解决方案可以在不重新编译源代码的情况下完成?问题是每当我进行任何更改时,编译都需要很长时间,所以我不想使用不同的优化标志来编译它,我也尝试过一次更改优化标志,但它只是因为编译标志的变化而崩溃,原因我想不通。

当我执行“info reg”时,我也无法找到有关理解各种寄存器的文档。我期待一些变量(我知道它的值,它会是什么)但是 info reg 向我展示了所有不同的值。我在这里遗漏了一些东西。我正在研究的架构是 x86_64

2) 我想知道 gdb 在解码此类寄存器变量时面临哪些限制?或者这个问题已经有人解决了。我在很多地方读过汇编代码,您可以找出该寄存器中的变量。如果那是真的,为什么它不能被构建到 gdb 中。如果有解决此问题的方法,请指向相关页面

【问题讨论】:

  • 这里唯一能解决问题的是“我想知道有什么限制”和“请指向相关页面”。你还没有描述一个问题,这些都是非常模糊和开放式的问题,实际上并不能解决问题。其他人可能不同意,但我投票结束。
  • 对不起,我不明白。我的基本问题是如何找出这样一个被优化的变量的值。我知道这个问题的解决方案,删除优化标志,让它不稳定,我不想做所有这些。是否有任何解决方案可以在不重新编译源代码的情况下完成?您可以假设该库是我无权访问的第 3 方代码。我还应该描述什么。那么gdb肯定会面临一些问题,因为它无法显示这些变量。这就是我所说的“限制”。
  • 您的评论与您的​​原始帖子相差数英里。在您的评论中,您问“我如何找出这样一个被优化的变量的值?”。 (这是一个真正的问题,不像你原来的帖子)。您还描述了您在原始帖子中忽略的限制(“库是我无权访问的第 3 方代码”“有没有可以在不再次编译源代码的情况下完成的解决方案?”)。我建议您编辑您的问题以包含此信息。
  • 是的,我同意。更新了我的问题。

标签: c debugging compiler-construction gdb compiler-optimization


【解决方案1】:

如果您没有源代码并使用调试/无优化(即第 3 方代码)进行编译。您可以做的最好的事情是反汇编代码并尝试确定变量的存储方式。

在 gdb 中,disassemble 指令将转储给定函数的程序集:

disassemble <function name>

或者如果符号已被剥离

disassemble <address>

&lt;address&gt; 是函数的入口点。

您可能还必须检查调用函数的位置以确定使用的调用约定。

一旦您弄清楚了函数的结构和变量布局(堆栈变量或寄存器),在调试时您可以使用nextistepi 逐步执行每条指令,并观察变量中的值如何变化转储寄存器或内存位置的内容。

我自己不知道任何好的入门或教程,但this question and its answers 可能对您有用。就我个人而言,我发现自己最常参考英特尔手册。可以从英特尔网站以 pdf 格式下载它们。我暂时没有方便的链接。如果其他人这样做,也许他们可以更新我的答案。

【讨论】:

  • 是否有任何关于阅读 x86_64 的汇编代码的文档?我从学校的 MIPS 知识中了解了基础知识,但忘记了一些说明的含义。
  • 我没有足够熟悉的资源来推荐自己,但我用更多信息更新了我的答案。
【解决方案2】:

您是否考虑过编译未优化的代码?

在您的 gcc 选项中尝试其中一个:

-Og
    Optimize debugging experience. -Og enables optimizations that do not interfere with debugging. It should be the optimization level of choice for the standard edit-compile-debug cycle, offering a reasonable level of optimization while maintaining fast compilation and a good debugging experience. 


-O0
    Reduce compilation time and make debugging produce the expected results. This is the default. 

【讨论】:

  • 感谢您的回答,但我刚刚更新了我的问题,我不想这样做:)
  • 如果库是您无权访问的第 3 方代码,您将如何进行任何调试?你暗示你有符号,并且可以查看变量和源代码;但这与您无权访问图书馆的说法相矛盾。
  • 好的,让我解释一下,就像我可以访问源代码一样,但是每当我进行更改时都需要很长时间才能编译。所以我想,与其包含太多细节,不如直接说出来。
猜你喜欢
  • 2017-09-29
  • 2017-07-20
  • 2015-08-15
  • 1970-01-01
  • 2021-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多