Assembly 为什么%rax值是0xFFFFFFFFFFFD? 我在C++代码中有几个内核转储,在代码> STD::unordeDeMAP。导致核心转储的代码大致如下所示: std::unordered_map< std::string, std::vector<std::string> > fields; fields[key].push_back(value);

Assembly 为什么%rax值是0xFFFFFFFFFFFD? 我在C++代码中有几个内核转储,在代码> STD::unordeDeMAP。导致核心转储的代码大致如下所示: std::unordered_map< std::string, std::vector<std::string> > fields; fields[key].push_back(value);,assembly,segmentation-fault,gdb,x86-64,coredump,Assembly,Segmentation Fault,Gdb,X86 64,Coredump,在引用指令的%rax寄存器上发生分段故障: => 0x000000000043fcb4 <+68>: mov (%rax),%rbx 是什么原因导致%rax的值最终导致分段错误?可能是指针悬空rax来自rax+rdx*8,其中rdx是hash(input)%k(k是对象的一个字段,偏移量0x8),前面的rax值是指向表的指针。显然8(%r14)包含指针数组中的元素数;并且0(%r14)包含指向该数组的指针。你能检查一下这些值(8(%r14)和0(%r14))是否合

在引用指令的
%rax
寄存器上发生分段故障:

=> 0x000000000043fcb4 <+68>:    mov    (%rax),%rbx

是什么原因导致
%rax
的值最终导致分段错误?

可能是指针悬空<故障点处的code>rax来自
rax+rdx*8
,其中
rdx
hash(input)%k
(k是对象的一个字段,偏移量0x8),前面的
rax
值是指向表的指针。显然
8(%r14)
包含指针数组中的元素数;并且
0(%r14)
包含指向该数组的指针。你能检查一下这些值(
8(%r14)
0(%r14)
)是否合理吗?它们对我来说似乎合理,这就是我得到的:
(gdb)x/xg$r14+0 0x7f6edf7b6f48:0x00007f6f22b9f1b0
(gdb)x/xg$r14+8 0x7f6edf7b6f50:0000000000000007
。程序是多线程的吗,多个线程是否有权访问
字段
映射,如果有,这种访问是否受互斥锁保护?我建议尝试将其与
字段
对象的实际成员联系起来,或者通过读取标准库源代码来推断其布局,或者使用gdb的源代码级调试功能。它看起来像
这个
%r14
中,因此类似
p*(std::无序映射*)$r14
可能会显示该对象的内容。然后,您可以尝试找出哪个指针或索引是错误的,然后开始调查它是如何出错的。
=> 0x000000000043fcb4 <+68>:    mov    (%rax),%rbx
(gdb) p/x $rax
$1 = 0xfffffffffffffffd