这是 ubuntu 16.04 中的 gdb 错误吗?



我用 gdb 附加了一个程序,然后在函数引擎中设置了一个断点::monAppendSystemInfo。当遇到断点时,gdb 核心转储(实际上,这是我的程序在引擎中崩溃::monAppendSystemInfo(。这不是一个不可避免的问题。它只出现过两次,无法复制。

这是引擎的比较汇编代码::monAppendSystemInfo。

下面的代码是从核心转储文件中反汇编的:

Dump of assembler code for function engine::monAppendSystemInfo(bson::BSONObjBuilder&, unsigned int):
0x00000000011188f1 <+0>:     push   %rbp
0x00000000011188f2 <+1>:     mov    %rsp,%rbp
0x00000000011188f5 <+4>:     push   %r12
0x00000000011188f7 <+6>:     push   %rbx
0x00000000011188f8 <+7>:     sub    $0xb20,%rsp
0x00000000011188ff <+14>:    mov    %rdi,-0xa98(%rbp)
0x0000000001118906 <+21>:    mov    %esi,-0xa9c(%rbp)
0x000000000111890c <+27>:    int3                      // strange point
=> 0x000000000111890d <+28>:    mov    0x28,%rax          // crash for accessing 0x28
0x0000000001118915 <+36>:    mov    %rax,-0x18(%rbp)

下面的代码是从普通gdb反汇编出来的,程序可以继续运行:

Dump of assembler code for function engine::monAppendSystemInfo(bson::BSONObjBuilder&, unsigned int):
0x00000000011188f1 <+0>:     push   %rbp
0x00000000011188f2 <+1>:     mov    %rsp,%rbp
0x00000000011188f5 <+4>:     push   %r12
0x00000000011188f7 <+6>:     push   %rbx
0x00000000011188f8 <+7>:     sub    $0xb20,%rsp
0x00000000011188ff <+14>:    mov    %rdi,-0xa98(%rbp)
0x0000000001118906 <+21>:    mov    %esi,-0xa9c(%rbp)
=> 0x000000000111890c <+27>:    mov    %fs:0x28,%rax     // "%fs:0x28" was changed to "0x28" in above
0x0000000001118915 <+36>:    mov    %rax,-0x18(%rbp)

我的 linux 是:ubuntu16.04.4 LTS,环境如下:

root@lyysdbserver1:~# g++ --version  
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609  
Copyright (C) 2015 Free Software Foundation, Inc.
root@lyysdbserver1:~# gdb --version  
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1  
Copyright (C) 2016 Free Software Foundation, Inc.  

为什么将"%fs:0x28"更改为"0x28"?这是一个 gdb 错误吗?

大概您正在寻找程序的核心转储,而 GDB 已经设置了断点。int 3GDB 设置断点的方式。恢复时,int 3指令应替换为原始字节。

看看这两个指令序列的机器代码如何比较:

mov %fs:0x28,%rax;    64 48 8b 04 25 28 00 00 00
int 3; mov 0x28,%rax; cc 48 8b 04 25 28 00 00 00

最新更新