"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.