繁体   English   中英

这是 ubuntu 16.04 中的 gdb 错误吗?

[英]Is this a gdb bug in ubuntu 16.04?

我使用gdb附加一个程序,然后在function engine::monAppendSystemInfo中设置断点。 当断点被击中时,gdb coredump(实际上是我的程序在engine::monAppendSystemInfo中崩溃了)。这不是一个不可避免的问题。 它只出现过两次,无法复制。

下面是 engine::monAppendSystemInfo 的对比汇编代码。

下面的代码是从 coredump 文件反汇编而来的:

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 3是 GDB 如何设置断点。 恢复时, 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM