Search code examples
segmentation-faultgdb

Continue debugging after SegFault in GDB?


I am debugging a huge program using GDB and there is a SegFault in my program. Instead of re-running the program, is it possible to switch to a previous stack frame and continue execution from there?


Solution

  • On Unix and Linux systems, at least, you can use gdb's handle command to tell gdb to stop the program when a signal is received (with the stop keyword) and not to pass the signal to the program (with the nopass keyword). When the program stops, you can use the return command to return a value from the current frame, then continue the program.

    $ 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)