Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C GDB:尝试取消引用泛型指针_C_Debugging_Assembly_Gdb - Fatal编程技术网

C GDB:尝试取消引用泛型指针

C GDB:尝试取消引用泛型指针,c,debugging,assembly,gdb,C,Debugging,Assembly,Gdb,如何使GDB在打印函数中执行额外的解引用,如 x/s 当我在x/中尝试显式解引用时,会出现错误“尝试 取消引用通用指针”。多次使用x/有效,因为 每次使用都包含一个隐式的取消引用,但这很烦人,因为 我必须复制并粘贴每个中间结果 例子 考虑一下非常有用的C程序,example.C: #include <stdio.h> int main(int argc, char **argv) { printf("argv[0] = %s\n", argv[0]); } 我在printf处中

如何使GDB在打印函数中执行额外的解引用,如
x/s

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

例子 考虑一下非常有用的C程序,
example.C

#include <stdio.h>
int main(int argc, char **argv) {
  printf("argv[0] = %s\n", argv[0]);
}
我在
printf
处中断,首先用参数
运行程序

(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]
,但得到了“通用指针” 错误:

但是,通过使用“x/xw”手动取消引用几次,我可以 最终能够打印
argv[0]
(和
argv[1]
):


但是这很烦人,也很间接(指针编程是不习惯的?

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

例如,从上面我们结束的地方开始:

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

为什么GDB不能自动执行此过程?我知道我在使用指针,否则我就不会要求取消引用。显然,如果我要求再次取消引用,那么第一次取消引用的结果必须是一个指针。。。
Breakpoint 1, 0x080483e5 in main ()
(gdb) x/s **(0xc + $ebp)
Attempt to dereference a generic pointer.
(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"