我正在使用gdb调试一个C程序,当我检查一个变量的值时,我得到以下输出。它意味着什么?

时间:2016-08-11 05:05:44

标签: c debugging

代码:

int a;
int b;
char test[011];
a = 0x41414141;
b = 0x42424242;

gdb输出

(gdb) x/s &a
0x7fffffffde1c: "AAAA@\336\377\377\377\177"
(gdb) x/s &b
0x7fffffffde18: "BBBBAAAA@\336\377\377\377\177"

在代码中 a 使用 AAAA 进行初始化, b 使用 BBBB 进行初始化。 我需要了解以下内容。

  1. 为什么b的位置有 BBBBAAAA 而不是 BBBB 它应该有?
  2. @ \ 336 \ 377 \ 377 \ 377 \ 177 表示什么?

1 个答案:

答案 0 :(得分:4)

  

为什么b的位置有BBBBAAAA而不是BBBB应该有?

它没有。 b的位置有0x42424242(当解释为int时)。但是,通过运行x/s &b(而非print b),您告诉gdb打印从b位置开始的字符串,而不是打印存储在那里的int

恰好存储在b位置的字节看起来像" BBBB"当解释为ASCII时,之后的字节看起来像" AAAA @"当解释为ASCII时,然后还有一些字节不是可打印的字符,所以gdb将它们打印为转义码,然后是0字节(表示字符串的结尾)。

  

@ \ 336 \ 377 \ 377 \ 377 \ 177表示什么?

@是角色@。 \ 336和\ 337和\ 177是转义码 - @ aren&t; t可显示字符后面的字节,因此gdb将它们打印为八进制转义码(使用C语法)。