1)首先我想知道,如何解码这些变量?
我知道这个问题的解决方案,删除优化标志,使其不稳定,我不想做所有这些。有没有什么解决方案可以在不再次编译源的情况下完成?问题是每当我进行任何更改时,编译都需要很长时间,所以我不想使用不同的优化标志来编译它,我也尝试过一次更改优化标志,但它只是因为编译标志的更改而崩溃,原因如下我无法理解。
此外,当我执行“info reg”时,我无法找到有关理解各种寄存器的文档。我期待一些变量(我知道它的值,它会是什么),但是 info reg 向我显示了所有不同的值。我在这里缺少一些东西。我正在研究的架构是x86_64
2)我想知道gdb在解码此类寄存器变量时面临哪些限制?或者这个问题已经有人解决了。我在很多地方读过,通过汇编代码,您可以找出该寄存器中的变量。如果这是真的,为什么它不能构建到 gdb 中。如果这个问题有解决方案,请指出相关页面
如果您没有源代码并使用调试/无优化进行编译(即第 3 方代码)。您能做的最好的就是反汇编代码并尝试确定变量的存储方式。
在 gdb 中,
disassemble
指令将转储给定函数的程序集:
disassemble <function name>
或者如果符号已被剥离
disassemble <address>
其中
<address>
是函数的入口点。
您可能还需要检查函数的调用位置以确定所使用的调用约定。
一旦您弄清楚了函数的结构和变量布局(堆栈变量或寄存器),在调试时您可以使用
nexti
和 stepi
逐步执行每条指令,并通过转储来观察变量中的值如何变化寄存器或内存位置的内容。
我自己不知道任何好的入门书或教程,但这个问题及其答案可能对您有用。就我个人而言,我发现自己参考英特尔手册最多。可以从英特尔网站下载 pdf 版本。我目前没有方便的链接。如果其他人这样做也许他们可以更新我的答案。
您是否考虑过编译未优化的代码?
在您的
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.