如何在gdb中查看C++整数的二进制内容?

4
int main()
{
     int a = 0;
}

我编译:g++ -std=c++14 -g test.cpp 在gdb中运行程序: gdb ./a.out (gdb) break main (gdb) run (gdb) next 我尝试过: (gdb) print /t &a 这将打印出11111111111111111111111111111111101110101111100 这看起来不像正确的数字,我原本期望的是0000....0000。如何从整数变量a的内存位置打印二进制值?
3个回答

7
你正在尝试打印在主函数的栈帧中与其值无关的 a 的地址。可以尝试使用以下命令: print /t a

4
使用 p /x 命令可以以十六进制的形式打印某些内容。让我们看一下当 a 被设置为 0 时会发生什么。
(gdb) n
28               return(0);
(gdb) p a
$6 = 0

好的

(gdb) p /x a
$7 = 0x0

十六进制表示正确

(gdb) p /x &a
$8 = 0x7fffffffe3dc

自动内存(堆栈)中变量a的地址。
(gdb) p /t &a
$9 = 11111111111111111111111111111111110001111011100

看起来像二进制文件,在我的计算机上与你的稍有不同。很好。

(gdb) print /t &a

That prints 11111111111111111111111111111111101110101111100

That doesn't look like the right number?

开头有33个1,并且最后4位为0xc。

与十六进制比较,我的看起来是正确的。0x7fffffffe3dc。

我怀疑你的也是正确的。

如果你预期看到一堆0,那就是a的值,而不是a的地址。

(gdb) p /t a
$10 = 0

gdb缩小了结果——0确实是一堆0。


我的系统是64位的。 - 2785528
您也可以在gdb中打印文字值:打印带有第32位设置的整数
p /t (1 << 31)输出为:$1 = 10000000000000000000000000000000要打印64位文字值,可以使用:p /t (1UL << 63)其输出为:$2 = 1000000000000000000000000000000000000000000000000000000000000000
- gallo

2

2
谢谢提供资源链接,看起来它们对我很有用。 - Robert C. Holland
2
希望如此!那些对我非常有帮助! - Felipe Centeno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接