c - 如何用gdb读取局部变量?

标签 c assembly gdb

我知道您可以使用 gdb 查看 $ebp 的正偏移量来找到任何参数:

(gdb) x/4wx $ebp

然后,我会使用 x/s 查看第 3 个和第 4 个地址,因为它们将是第一个和第二个参数。局部变量呢?我如何看待与 $ebp 负偏移的值? 另外,有没有办法查看 $eax 的值? 每当我尝试使用 x/s $eax 打印 $eax 的值时,地址超出范围或值为 0,我确信这不是因为我只是放了一个常量寄存器中的值。

我尝试了 info locals 但我收到消息“没有可用的符号表信息”。

最佳答案

首先,您需要将调试符号编译到您的二进制文件中。在当前命令中使用 gcc 的 -g 选项来执行此操作。如果您使用不同的编译器,则需要查阅其文档。在此之后,'info locals' 和 print 命令将起作用。

要查看任何局部变量,您需要做的就是使用“打印”命令。例如,查看局部变量“i”就像“打印 i”一样简单。

您应该能够像处理 $ebp 一样处理 $eax。我怀疑您有问题,因为您使用的是 x/s。 x/s 将尝试打印出一个字符串,因此它会继续打印直到遇到空字符。如果长时间没有发生这种情况,则字符串的长度将超出范围。尝试“x/d $eax”。你甚至可以做'print $eax'。您还可以使用“信息寄存器”来获取所有寄存器数据。

关于c - 如何用gdb读取局部变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5959503/

相关文章:

debugging - 在反汇编中查找函数

linux - 从伪 tty 中分离一个 linux 进程,但保持 tty 运行?

linux - GDB 在事后分析中显示了错误的线程

c - 如何使用 getrusage 读取 C 中的页面错误?

结合 GetLastError 的值和自定义错误消息

c - 访问数组中的项目与指针引用的性能差异?

c - 如何将混合(asm、C)源代码编译为 32 位程序?

c - 在不调试的情况下查找导致 Illegal Instruction 错误的汇编指令

c - C语言中如何对链表进行排序?

macos - GDB 和操作码