gpt4 book ai didi

c - GDB:尝试取消引用通用指针

转载 作者:太空狗 更新时间:2023-10-29 16:29:38 25 4
gpt4 key购买 nike

如何让 GDB 在打印函数中执行额外的取消引用,例如x/s?

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

例子

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

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

如果我构建它并将其加载到 GDB 中,我会看到 argv 存储在0xc(%ebp),因为它的双重重复作为第二个传递第 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 处中断并使用参数 first 和运行程序第二个:

(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com