Это ошибка gdb в ubuntu 16.04? - PullRequest
0 голосов
/ 16 июня 2020

Я использовал gdb для присоединения программы, а затем установил точку останова в функции 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)
• 1007
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?

1 Ответ

0 голосов
/ 16 июня 2020

Предположительно вы смотрите на дамп ядра вашей программы, когда 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
...