How to ‘reload’ source files in GDB

gdblinux-kernel

Is there a command in gdb that I can use to (re)load / "refresh" source files? (As far as I can see, gdb works only with source directories, according to Debugging with GDB: Source – and there is no specific command to "refresh")

Background about my problem:

I use a virtual machine with a debug kernel, so I can connect to a local instance of gdb, and can debug kernel modules. The modules are compiled with debug info on, and this specifies folders where the source of the modules is kept (Instruct GDB 6.5 to use source embedded in object file – Stack Overflow). I have the source directories in the same path(s) in both VM and local machine.

The problem is this – I need to do quite a bit of steps in order to get the module to segfault – and the remote gdb to go into the stack. Then I do a backtrace, and I can see the source files referenced, i.e.

#0  0xc0132a13 in ?? ()
#1  0xc056e551 in ?? ()
#2  0xc056e506 in ?? ()
#3  0xd8be53f3 in mymodule_func1 (var1=0xd79f9b44, var2=0x0, var3=825269148)
    at /media/src/mymodule.h:954
#4  0xd8be53d0 in mymodule_func2 (data=3617561412)
    at /media/src/mymodule.h:936
#5  0xc014fe87 in ?? ()
#6  0xc0151478 in ?? ()

Then I try to do say, list /media/src/mymodule.h:954 – and I realize that I have changed stuff on the local version of mymodule.h file!!

So I undo the changes – but unfortunately, GDB does not see these changes! And, of course, I don't want to restart GDB – because that means I have to restart the VM, and go through the entire procedure in order to get the kernel module to segfault again 🙁 !!

Then I try to do something like this:

(gdb) show symbol-reloading
Dynamic symbol table reloading multiple times in one run is off.
(gdb) set symbol-reloading on
(gdb) add-symbol-file ~/mymodule.o 0xd8be4000
add symbol table from file "/media/src/mymodule.o" at
    .text_addr = 0xd8be4000
(y or n) y
Reading symbols from /media/src/mymodule.o...done.

… in hope that it will somehow "reload" the source files – but unfortunately, list /media/src/mymodule.h:954 shows that it doesn't, nothing is changed – even though gdb does recognize that something has changed, as in warning: Source file is more recent than executable.… (so, for the time being, I have to restart entire VM and gdb as well 🙁 🙁 )

Best Answer

Resetting the directory list using the directory command appears to have the desired effect.