我已经很久没有使用C++了,也许有什么变化。我有一个我没有写但需要使用的大程序,它似乎是随机的segfault,所以我用"-g";选项,并在gdb中运行。(我在英特尔64位使用Ubuntu 20(
当故障发生时,我会得到gdb输出,如果我更聪明的话,它会告诉我什么。我的问题是"0x7777777和0x555555的值是什么"> 这里是来自";gdb的回溯; 以下是我在断点处看到的内容。当我看到";0x7fffff75b8";所有的ffffff和555555似乎很难解释。12 0x000055555579392a in main (argc=2, argv=0x7fffffffde38) at mainSystem.cpp:3676
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的原因。