如何解决为什么%rax值为0xfffffffffffffffd?
我在std::unordered_map
的{{3}}内有几个C ++代码核心转储。导致核心转储的代码大致如下:
std::unordered_map< std::string,std::vector<std::string> > fields;
fields[key].push_back(value);
我无法在本地机器上复制它,我只有几个核心转储。它们都是由operator[]
内部的分段错误引起的。这是反汇编有害代码的一部分:
(gdb) disassemble
Dump of assembler code for function std::__detail::_Map_base<std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::pair<std::__cxx11::basic_string<char,std::allocator<char> > const,std::vector<std::__cxx11::basic_string<char,std::allocator<std::__cxx11::basic_string<char,std::allocator<char> > > > >,std::allocator<std::pair<std::__cxx11::basic_string<char,std::allocator<char> > > > > >,std::__detail::_Select1st,std::equal_to<std::__cxx11::basic_string<char,std::allocator<char> > >,std::hash<std::__cxx11::basic_string<char,std::__detail::_Mod_range_hashing,std::__detail::_Default_ranged_hash,std::__detail::_Prime_rehash_policy,std::__detail::_Hashtable_traits<true,false,true>,true>::operator[](std::__cxx11::basic_string<char,std::allocator<char> > const&):
0x000000000043fc70 <+0>: push %rbp
0x000000000043fc71 <+1>: mov $0xc70f6907,%edx
0x000000000043fc76 <+6>: mov %rsp,%rbp
0x000000000043fc79 <+9>: push %r15
0x000000000043fc7b <+11>: push %r14
0x000000000043fc7d <+13>: mov %rdi,%r14
0x000000000043fc80 <+16>: push %r13
0x000000000043fc82 <+18>: push %r12
0x000000000043fc84 <+20>: mov %rsi,%r12
0x000000000043fc87 <+23>: push %rbx
0x000000000043fc88 <+24>: sub $0x18,%rsp
0x000000000043fc8c <+28>: mov 0x8(%rsi),%rsi
0x000000000043fc90 <+32>: mov (%r12),%rdi
0x000000000043fc94 <+36>: callq 0x408cd0 <_ZSt11_Hash_bytesPKvmm@plt>
0x000000000043fc99 <+41>: mov 0x8(%r14),%rcx
0x000000000043fc9d <+45>: xor %edx,%edx
0x000000000043fc9f <+47>: mov %rax,%r13
0x000000000043fca2 <+50>: div %rcx
0x000000000043fca5 <+53>: mov (%r14),%rax
0x000000000043fca8 <+56>: mov (%rax,%rdx,8),%rax
0x000000000043fcac <+60>: mov %rdx,%r15
0x000000000043fcaf <+63>: test %rax,%rax
0x000000000043fcb2 <+66>: je 0x43fd18 <std::__detail::_Map_base<std::__cxx11::basic_string<char,std::allocator<char> > const&)+168>
=> 0x000000000043fcb4 <+68>: mov (%rax),%rbx
0x000000000043fcb7 <+71>: mov 0x40(%rbx),%rsi
在引用mov
寄存器的%rax
指令上发生了分段错误:
=> 0x000000000043fcb4 <+68>: mov (%rax),%rbx
问题是%rax
的值为0xfffffffffffffffd
,而mov
试图在该地址读取,这导致分段错误:
(gdb) p/x $rax
$1 = 0xfffffffffffffffd
%rax
的值最终导致细分错误的原因是什么?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。