Skip to main content
 首页 » 编程设计

linux-kernel之如何在 GDB 中 'reload' 源文件

2024年12月31日21linjiqin

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 重置目录列表命令似乎具有预期的效果。