如何使GDB在打印功能(例如打印功能)中进行额外的取消引用x/s

当我尝试在x/中进行显式取消引用时,出现错误“尝试
取消引用通用指针”。多次使用x/是可行的,因为
每次使用都包含一个隐式取消引用,但这很烦人,因为
我必须复制并粘贴每个中间结果。



考虑一下非常有用的C程序example.c:

#include <stdio.h>
int main(int argc, char **argv) {
  printf("argv[0] = %s\n", argv[0]);
}

如果我将其构建并加载到GDB中,则会看到argv存储在0xc(%ebp),因为它的 double 作为第二个传递
第26行的printf参数(即0x4(%esp)中的参数):
$ gcc -o example example.c
$ gdb example

(gdb) disass main
Dump of assembler code for function main:
   0x080483e4 <+0>:   push   %ebp
   0x080483e5 <+1>:   mov    %esp,%ebp
   0x080483e7 <+3>:   and    $0xfffffff0,%esp
   0x080483ea <+6>:   sub    $0x10,%esp
   0x080483ed <+9>:   mov    0xc(%ebp),%eax
   0x080483f0 <+12>:  mov    (%eax),%edx
   0x080483f2 <+14>:  mov    $0x80484e0,%eax
   0x080483f7 <+19>:  mov    %edx,0x4(%esp)
   0x080483fb <+23>:  mov    %eax,(%esp)
   0x080483fe <+26>:  call   0x8048300 <printf@plt>
   0x08048403 <+31>:  leave
   0x08048404 <+32>:  ret
End of assembler dump.

我在printf处中断,并使用firstsecond:
(gdb) break *main + 26
Breakpoint 1 at 0x80483fe

(gdb) run first second
Starting program: /var/tmp/SO-attempt-to-dereference-generic-pointer/example first second

我尝试在GDB中打印argv[0],但是得到了“通用指针”
错误:
Breakpoint 1, 0x080483e5 in main ()
(gdb) x/s **(0xc + $ebp)
Attempt to dereference a generic pointer.

但是,通过使用“x / xw”手动取消引用几次,
最终能够打印argv[0](和argv[1]):
(gdb) x/xw 0xc + $ebp
0xbfffeba4: 0xbfffec34
(gdb) x/xw 0xbfffec34
0xbfffec34: 0xbfffedc8
(gdb) x/s 0xbfffedc8
0xbfffedc8:  "/var/tmp/SO-attempt-to-dereference-generic-pointer/example"

(gdb) x/xw 0xbfffec34 + 4
0xbfffec38: 0xbfffee03
(gdb) x/s 0xbfffee03
0xbfffee03:  "first"
(gdb)

但是,这很烦人并且是间接的(因为指针编程是不是?)

最佳答案

解决方案是在取消引用指针之前先转换指针。

例如,从上面我们停下来的地方接起:

(gdb) x/s **((char ***) (0xc + $ebp))
0xbfffedc8:  "/var/tmp/SO-attempt-to-dereference-generic-pointer/example"
(gdb) x/s *(*((char ***) (0xc + $ebp)) + 1)
0xbfffee03:  "first"
(gdb) x/s *(*((char ***) (0xc + $ebp)) + 2)
0xbfffee09:  "second"

请注意,堆栈地址0xc + $ebp本身是指向
该堆栈位置的内容,因此我们需要char ***而不是char **

关于c - GDB:尝试取消引用通用指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20414699/

10-11 18:57