如何在GDB中“重新加载”源文件

时间:2010-11-07 14:43:58

标签: linux-kernel gdb

gdb中是否有可用于(重新)加载/“刷新”源文件的命令? (据我所知,gdb仅适用于源目录,根据Debugging with GDB: Source - 并且没有特定的命令来“刷新”

关于我的问题的背景:

我使用带有调试内核的虚拟机,因此我可以连接到gdb的本地实例,并可以调试内核模块。这些模块使用调试信息进行编译,并指定保存模块源的文件夹(Instruct GDB 6.5 to use source embedded in object file - Stack Overflow)。我在VM和本地计算机的相同路径中都有源目录。

问题是这个 - 我需要做很多步骤才能让模块进行段错误 - 并且远程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 - 因为这意味着我必须重新启动VM,并完成整个过程以使内核模块再次发生段错误:( !!

然后我尝试做这样的事情:

(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 < / strong>认识到某些内容已发生变化,如warning: Source file is more recent than executable. ...( 所以,暂时,我必须重新启动整个虚拟机和gdb :(: (

3 个答案:

答案 0 :(得分:32)

使用directory命令重置目录列表似乎具有所需的效果。

答案 1 :(得分:5)

来自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++)

答案 2 :(得分:0)

此警告表示使用新更改更新生成二进制文件的源文件。 要删除此警告,只需使用新文件和已修改文件重建正在调试的二进制文件。