【问题标题】:confusion with dereferencing argv与取消引用 argv 混淆
【发布时间】:2020-04-14 00:34:33
【问题描述】:

我有这个小程序:

#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[]) {
   printf("argv[1] -> %s\n", argv[1]); 
}

我在gdb 中使用以下命令进行了分析:

$ gdb -q  --args foo hello
Reading symbols from foo...
(gdb) break main
Breakpoint 1 at 0x1148: file foo.c, line 5.
(gdb) run
Starting program: /tmp/foo/foo hello

Breakpoint 1, main (argc=2, argv=0x7fffffffea68) at foo.c:5
5          printf("argv[1] -> %s\n", argv[1]);
(gdb) print argv@2
$1 = {0x7fffffffea68, 0x200000000}
(gdb) print *argv@2
$2 = {0x7fffffffecd8 "/tmp/foo/foo", 0x7fffffffece5 "hello"}

argv[1] 的内容是 0x200000000 而不是 0x7fffffffece5,它是字符串 "hello" 的实际地址。

【问题讨论】:

    标签: c console-application argv


    【解决方案1】:

    print argv@2 不会做你认为的那样。它似乎打印了(&amp;argv)[0](&amp;argv)[1],而不是打印argv[0]argv[1]

    这是我尝试调试您的程序时得到的结果:

    (gdb) p argv
    $1 = (char **) 0x7fffffffecd8
    (gdb) p argv[0]
    $2 = 0x7fffffffeeb8 "/home/a.out"
    (gdb) p argv[1]
    $3 = 0x0
    (gdb) p argv@2
    $4 = {0x7fffffffecd8, 0x100000000}
    (gdb) p (&argv)[1]
    $5 = (char **) 0x100000000
    

    【讨论】:

    • 为什么argv@2 中的第二个数字不是在第一个数字之后的sizeof(char***) 字节?
    • @bool3max argv@2 打印内存中argv 和位于argv 之后的不存在指针的值,而不是它们的地址。
    【解决方案2】:

    我在gdb 中使用了检查命令,现在事情变得有意义了:

    (gdb) x/2xg argv
    0x7fffffffea58: 0x00007fffffffecc2      0x00007fffffffecd5
    (gdb) x/1s 0x00007fffffffecc2
    0x7fffffffecc2: "/tmp/foo/foo"
    (gdb) x/1s  0x00007fffffffecd5
    0x7fffffffecd5: "hello"
    (gdb)
    

    【讨论】:

      猜你喜欢
      • 2013-05-27
      • 1970-01-01
      • 2018-08-08
      • 2023-03-07
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多