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