【问题标题】:Printing Assembly Variable in GDB在 GDB 中打印汇编变量
【发布时间】:2012-10-06 19:27:11
【问题描述】:

我没有完整的源代码,但有一个带有符号的目标文件。有一条读线:

=> 0x080489cd <+169>:   call   0x8049275 <read_line>
   0x080489d2 <+174>:   mov    %eax,(%esp)
   0x080489d5 <+177>:   call   0x8048d59 <phase_1>

in the function:
 8048d59:   55                      push   %ebp
 8048d5a:   89 e5                   mov    %esp,%ebp
 8048d5c:   83 ec 08                sub    $0x8,%esp

我在第一行放了一个 b 并在函数名中添加了一个以确保。输入“1”后尝试p *(char**)$esp,我得到:

0x80489da "\350\355\006"

这不是我所期望的。我预计会看到“1”。我也试过了:

gdb x $esp
0xbffff0cc: 0x080489da

gdb x *0xbffff0cc

0x80489da <main+182>: 0x0006ede8

【问题讨论】:

  • 你说你有一个带有符号的目标文件。你知道它是否使用gcc -g 编译,即带有调试信息。如果是这种情况,您可以很快恢复 100% 的源代码。

标签: c assembly gdb


【解决方案1】:

如果你在函数的第一个喜欢的地方中断(我假设这就是你的意思:“我在第一行放了一个 b”)那么你看到的是返回地址。看起来您实际上看到了调用 phase_1 的返回地址。

如果您要查找的是第一个参数,请尝试:

p *(char**)($esp+4);

【讨论】:

  • 我还没有脱离phase_1。第二部分在 phase_1 部分。如何获得单个指令的结果?
  • 我不确定您所说的“单个指令的结果”是什么意思。指令本身没有“结果”。您可以查看写入的位置(内存或寄存器)。但是,如果您想要的只是 read_line 的结果,我真的建议您尝试我提供的语句。如果它不起作用,请告诉我它说了什么。
猜你喜欢
  • 2017-05-19
  • 2019-02-14
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
相关资源
最近更新 更多