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
认识到某些事情已经改变,如
warning: Source file is more recent than executable.
...(因此,我暂时必须重新启动整个 VM 和
gdb
:( :( )
请您参考如下方法:
使用 directory
重置目录列表命令似乎具有预期的效果。