"target record-full" в gdb приводит к сбою команды "n" в printf с "Process record не поддерживает инструкцию 0xc5 по адресу 0x7ffff7dee6e7"?

Я пытался использовать команды "reverse-step" и "reverse-next" внутри gdb. Переполнение стека говорит мне, что я должен запустить "target record-full" в контексте выполнения, где я хочу "rn" и "rs". Но произошла странная ошибка:

  1 
  2 #include<stdio.h>
  3 int i=0;
  4 void fa()
  5 { 
  6   ++i;
  7   printf("%d\n",i);
  8   ++i;
  9 }
 10 int main(){
 11   fa();
 12   return 0;
 13 } 

Я компилирую и запускаю эту программу:

(gdb) b 4
Breakpoint 1 at 0x40052a: file test02.c, line 4.
(gdb) r
Starting program: /home/Troskyvs/a.out 

Breakpoint 1, fa () at test02.c:6
6     ++i;
(gdb) target record-full
(gdb) n
7     printf("%d\n",i);
(gdb) n                      # Error happens here!
Process record does not support instruction 0xc5 at address 0x7ffff7dee6e7.
Process record: failed to record execution log.

Program stopped.
_dl_runtime_resolve_avx () at ../sysdeps/x86_64/dl-trampoline.h:81
81  ../sysdeps/x86_64/dl-trampoline.h: No such file or directory.

Хорошо, если я не запускаю "target record-full", то второе "n" будет в порядке и перейдет к следующей строке. Я не совсем получаю информацию об ошибке здесь.

Это связано с "целевым рекордом"? Как я могу победить это?

Я попробовал другой подход:

(gdb) set exec-direction reverse
(gdb) n

No more reverse-execution history.
fa () at test02.c:7
7     printf("%d\n",i);
(gdb) n

No more reverse-execution history.
fa () at test02.c:7
7     printf("%d\n",i);
(gdb) n

Ну не работает

2 ответа

AVX не поддерживается с GDB 7.11.1

Основная проблема заключается в том, что инструкции AVX в настоящее время не поддерживаются, но glibc использует их в 64-битной Ubuntu 16.04:

rr отличная рабочая альтернатива: https://github.com/mozilla/rr Вот минимальный рабочий пример: установка точки останова в GDB, где функция возвращает

На самом деле для того простого случая, который у вас есть, полная запись должна работать, если вы добавите параметр "-static" в команду компиляции gcc.

Другие вопросы по тегам