GDB 中优化的值:gdb 可以自动处理解码吗?

问题描述 投票:0回答:2

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

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

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

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

c debugging gdb compiler-optimization
2个回答
2
投票

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

在 gdb 中,

disassemble
指令将转储给定函数的程序集:

disassemble <function name>

或者如果符号已被剥离

disassemble <address>

其中

<address>
是函数的入口点。

您可能还需要检查函数的调用位置以确定所使用的调用约定。

一旦您弄清楚了函数的结构和变量布局(堆栈变量或寄存器),在调试时您可以使用

nexti
stepi
逐步执行每条指令,并通过转储来观察变量中的值如何变化寄存器或内存位置的内容。

我自己不知道任何好的入门书或教程,但这个问题及其答案可能对您有用。就我个人而言,我发现自己参考英特尔手册最多。可以从英特尔网站下载 pdf 版本。我目前没有方便的链接。如果其他人这样做也许他们可以更新我的答案。


0
投票

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

在您的

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. 
© www.soinside.com 2019 - 2024. All rights reserved.