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
:(: ( )
答案 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)
此警告表示使用新更改更新生成二进制文件的源文件。 要删除此警告,只需使用新文件和已修改文件重建正在调试的二进制文件。