在给定地址gdb处找到的显示值

时间:2013-01-24 03:58:46

标签: c linux assembly gdb x86

我在gdb中调试二进制文件。它是由英特尔IA-32上的gcc编译的C代码。我从objdump检索了这个输出。我最感兴趣的是这里的最后一行:

08048d9e <func_1>
8048d9e:    55                      push   %ebp
8048d9f:    89 e5                   mov    %esp,%ebp
8048da1:    83 ec 18                sub    $0x18,%esp
8048da4:    c7 44 24 04 88 99 04    movl   $0x8049988,0x4(%esp)
8048dab:    08 
8048dac:    8b 45 08                mov    0x8(%ebp),%eax
8048daf:    89 04 24                mov    %eax,(%esp)
8048db2:    e8 54 01 00 00          call   8048f0b <strings_not_equal>

我相信最后一行会比较在指定地址找到的值:8048f0b。我尝试了:

(gdb) x 0x8048f0b

并收到:

0x8048f0b <strings_not_equal>:  0x57e58955

我是否错误地解释了装配?这是读取gdb中地址值的正确方法吗?我有点期待找到一个更ascii友好的十六进制值。我有兴趣找到与之比较的存储字符串值。

您是否也喜欢使用这种类型的调试工具?我一直在考虑尝试ddd。我想找到一种更简单的调试方法。

1 个答案:

答案 0 :(得分:20)

您正在读取内存地址0x8048f0b的值,但行call 8048f0b <strings_not_equal>表示此地址是函数的开头(称为strings_not_equal())。你不会期望它是ASCII - 你希望它是更多的机器代码。

如果您正在寻找strings_not_equal()的函数参数,那么它们将被推入堆栈。第一个参数是从0x8(%ebp)复制的,func1()$0x8049988的第一个参数。第二个参数是x/s,可能是字符串的地址。

如果您想将地址内容打印为字符串,可以使用x/s 0x8049988 执行此操作:

{{1}}