Продолжить отладку после SegFault в GDB? - PullRequest
0 голосов
/ 14 октября 2019

Я отлаживаю огромную программу, используя GDB, и в моей программе есть SegFault. Вместо повторного запуска программы, возможно ли переключиться на предыдущий кадр стека и продолжить выполнение оттуда?

Ответы [ 2 ]

2 голосов
/ 14 октября 2019

В системах Unix и Linux, по крайней мере, вы можете использовать команду gdb handle , чтобы указать gdb остановить программу при получении сигнала (с ключевым словом stop) и не передавать сигналв программу (с ключевым словом nopass). Когда программа останавливается, вы можете использовать команду return , чтобы вернуть значение из текущего кадра, а затем продолжить программу.

$ gdb -q segvtest
Reading symbols from segvtest...done.
(gdb) list 1,99999
1       #include <stdio.h>
2
3       int a()
4       {
5               int *p = 0;
6               return *p;
7       }
8
9       int main()
10      {
11              int i = a();
12              printf("a() returned %d\n", i);
13      }
(gdb) handle SIGSEGV stop nopass
Signal        Stop      Print   Pass to program Description
SIGSEGV       Yes       Yes     No              Segmentation fault
(gdb) run
Starting program: /home/mp/segvtest

Program received signal SIGSEGV, Segmentation fault.
0x00000000080006c0 in a () at segvtest.c:6
6               return *p;
(gdb) return 12345
Make a return now? (y or n) y
#0  0x00000000080006d6 in main () at segvtest.c:11
11              int i = a();
(gdb) c
Continuing.
a() returned 12345
[Inferior 1 (process 74) exited normally]
(gdb)
0 голосов
/ 14 октября 2019

возможно ли переключиться на предыдущий кадр стека и продолжить выполнение с него?

Да, вы можете сделать это с помощью обратной отладки .

Когда вы получаете segfault, запустите reverse-finish, чтобы выйти из текущего кадра в обратном направлении. Вы остановитесь в предыдущем кадре, где вы собираетесь вызвать функцию, которая вызвала ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...