这是一个简单的程序:
#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