3

这是一个简单的程序:

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

typedef struct {
        char str[10];
} my_struct;

static my_struct s1;

int main()
{
        char *temp_str = "test";
        strcpy(s1.str, temp_str);
        printf("%s\n", s1.str);
}

该程序按预期编译和运行,但我看到 gdb 有一些我不太理解的奇怪行为。这些 gdb 命令是在 printf 行上设置的断点之后运行的。

(gdb) p s1.str
$5 = "test\000\000\000\000\000"
(gdb) printf "%s\n", s1.str
test
(gdb) set $tmp = s1
(gdb) printf "%s\n", $tmp.str
Attempt to take address of value not located in memory.

为什么最后一个命令不起作用?在直接访问变量(s1.str)不那么干净的更复杂的情况下,在这个例子中是否有任何有效的方法可以使用 printf 和 $tmp 之类的东西?这是 gdb 7.2。

但是,以下确实有效:

(gdb) set $tmp_str = s1.str
(gdb) printf "%s\n", $tmp_str
test

另一个有趣的地方是,如果我在结构中添加一个 int(在这种情况下,x - 设置为 4),我可以成功地做到:

(gdb) set $tmp = s1
(gdb) printf "%d\n", $tmp.x
4
4

1 回答 1

2

可能是因为 $tmp 指向一个结构(s1),而不是 char 数组(s1.str),gdb 对事物非常聪明,但通常会按字面意思理解事物。

set $tmp = s1

一般是指:

set $tmp = (address of)s1

因此 $tmp 只是一个指针,从技术上讲,您必须将 $tmp 转换/强制为 (struct my_struct) 类型指针,您可以从中引用结构内容 str。

set $tmp = (struct my_struct)s1

但我认为这在 gdb 中不起作用(不确定,试试吧!)。任何状况之下:

set $tmp = s1.str
printf "%s\n", $tmp

不过可能对你有用。

于 2013-10-26T00:59:39.080 回答