Как «перезагрузить» исходные файлы в GDB - PullRequest
21 голосов
/ 07 ноября 2010

Есть ли в gdb команда, которую я могу использовать для (повторной) загрузки / «обновления» исходных файлов? ( Насколько я вижу, gdb работает только с исходными каталогами , согласно Отладка с помощью GDB: Source - и нет специальной команды для "обновления" )

Справочная информация о моей проблеме:

Я использую виртуальную машину с отладочным ядром, поэтому я могу подключиться к локальному экземпляру gdb и отлаживать модули ядра. Модули скомпилированы с отладочной информацией, и это указывает папки, в которых хранится источник модулей ( Поручить GDB 6.5 использовать источник, встроенный в объектный файл - Переполнение стека ). У меня есть исходные каталоги по одному и тому же пути на виртуальной и локальной машинах.

Проблема в том, что мне нужно сделать немало шагов для того, чтобы модуль перешел на segfault, и чтобы удаленный GDB попал в стек. Затем я делаю обратную трассировку и вижу ссылки на исходные файлы, т. Е.

#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 ?? ()

Затем я пытаюсь сделать, скажем, list /media/src/mymodule.h:954 - и я понимаю, что я изменил материал в локальной версии файла mymodule.h !!

Так что я отменяю изменения - но, к сожалению, GDB не видит эти изменения! И, конечно же, я не хочу перезапускать GDB - потому что это означает, что мне нужно перезапустить виртуальную машину и пройти всю процедуру, чтобы заставить модуль ядра снова выполнить segfault :( !!

Затем я пытаюсь сделать что-то вроде этого:

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

... в надежде, что он каким-то образом "перезагрузит" исходные файлы - но, к сожалению, list /media/src/mymodule.h:954 показывает, что это не так, ничего не меняется - даже если gdb распознает это что-то изменилось, как в warning: Source file is more recent than executable. ... (, поэтому на данный момент я должен перезапустить всю ВМ, а также gdb :( :( )

Ответы [ 3 ]

32 голосов
/ 18 мая 2011

Сброс списка каталогов с помощью команды directory дает желаемый эффект.

5 голосов
/ 10 мая 2016

С https://www.cs.rochester.edu/~nelson/courses/csc_173/review/gdb.html:

После изменения программы перезагрузите исполняемый файл с помощью команды файла

  (gdb) file gdbprog
  A program is being debugged already.  Kill it? (y or n) y

  Load new symbol table from "gdbprog"? (y or n) y
  Reading symbols from gdbprog...
  done.
  Breakpoint 1 at 0x2298: file gdbprog.cc, line 10.


  (gdb) run
  Starting program: gdbprog 

  Breakpoint 1, InitArrays (array=0x18be8)
        at gdbprog.cc:10
  10                for(i = 0;i < 10;i++)
0 голосов
/ 29 сентября 2015

Это предупреждение означает, что исходные файлы, из которых был сделан двоичный файл, обновляются с новыми изменениями.Чтобы удалить это предупреждение, просто восстановите двоичный файл, который вы отлаживаете, с новыми и измененными файлами.

...