这些点值(如0x5555555)是什么



我已经很久没有使用C++了,也许有什么变化。我有一个我没有写但需要使用的大程序,它似乎是随机的segfault,所以我用"-g";选项,并在gdb中运行。(我在英特尔64位使用Ubuntu 20(

当故障发生时,我会得到gdb输出,如果我更聪明的话,它会告诉我什么。我的问题是"0x7777777和0x555555的值是什么">

这里是来自";gdb的回溯;

12 0x000055555579392a in main (argc=2, argv=0x7fffffffde38) at mainSystem.cpp:3676

以下是我在断点处看到的内容。当我看到";0x7fffff75b8";所有的ffffff和555555似乎很难解释。

Program received signal SIGSEGV, Segmentation fault.
0x00005555556c01d1 in UnpackHeapval (
linkval=0xffffffffffffffff <error: Cannot access memory at address 0xffffffffffffffff>, 
val1=@0x7fffffff75b8: 18446744073709551615, val2=@0x7fffffff75c0: 18446744073709551615, 
val3=@0x555555aa8218: 18446744073709551615) at os.cpp:706
706     val1 = data[1];

那些0x7777777 是什么

我在引用的输出中没有看到任何这些。

和0x555555值?

我看到555555的位置位于堆栈跟踪的第二列的中间。该列包含函数的返回地址。

所有的ffffff和555555似乎很难解释。

它们只是有问题的地址部分的值。不清楚为什么你认为它们比79392a更难解释。

很明显,这些点指向我的进程之外的内存。

我不同意,除了这种情况:

linkval=0xffffffffffffffff <error: Cannot access memory at address 0xffffffffffffffff>,

0xffffffffff没有为您的进程映射。它在虚拟内存的内核空间中。用户空间地址在x86-64中仅使用较低的48位。从这个地址读取是触发segfault的原因。

最新更新