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

标签 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 初始化为 AAAAb 初始化为 BBBB。 我需要了解以下内容。

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

最佳答案

Why the location of b has BBBBAAAA instead of BBBB it is supposed to have?

事实并非如此。 b 的位置为 0x42424242(当解释为 int 时)。但是通过运行 x/s &b(与 print b 相对),您告诉 gdb 从 b 的位置开始打印一个字符串,而不是打印存储在那里的 int

碰巧存储在 b 位置的字节在解释为 ASCII 时看起来像“BBBB”,而在其之后的字节在解释为 ASCII 时看起来像“AAAA@”,然后还有一些字节不是可打印字符,因此 gdb 将它们打印为转义码,然后是一个 0 字节(表示字符串的结尾)。

What does the @\336\377\377\377\177 signify?

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

关于c - 我正在使用 gdb 调试 C 程序,当我检查变量的值时得到以下输出。它意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38893912/

相关文章:

c - 将结构中的结构传递给 pthread_create

C静态内联函数重定义规则

AS 的 SQL 语法错误

c++ - 这个按升序打印按行和按列排序的矩阵的程序的零在哪里?

c# - 在 x86 中附加 VS2010 SP1 后不久,测试中的自由运行应用程序退出

javascript - Internet Explorer XML 解析错误,无法重现示例

c# - 如何为 C# 和 Java 设置符号服务器

c - 如何处理枚举常量

c - Glade 3.18.3 的 Windows 二进制文件?

c - libev 循环在空闲时使用 99% 的 CPU