我正在使用 Ubuntu 机器在 Qemu 中启动 Linux 内核。
我可以成功地在某些函数上设置断点,例如“start_kernel”。
但是,当为 GDB 启用 -tui 选项时,我在顶部窗口中收到“源不可用”错误。
我在 Linux 源代码文件夹中运行 GDB。
我使用以下命令来调用 GDB:
gdb -tui -ex '文件 vmlinux' -ex '目标远程本地主机:1234'
关于如何显示源代码有什么建议吗?
如果您停在无法查看源代码的位置,那么您可以尝试使用
info source
命令,以下是其输出示例:
(gdb) info source
Current source file is hello.c
Compilation directory is /tmp
Source language is c.
Producer is GNU C17 9.3.1 20200408 (Red Hat 9.3.1-2) -mtune=generic -march=x86-64 -g3 -O0.
Compiled with DWARF 4 debugging format.
Includes preprocessor macro info.
(gdb)
另一个有趣的设置是:
(gdb) show directories
Source directories searched: $cdir:$cwd
directories
设置控制 GDB 查找源文件的位置。 默认值由 $cdir
(编译目录)和 $cwd
(当前工作目录)组成。
因此,在我们的示例中,源文件是
hello.c
,编译目录是 /tmp
。 如果我们当前的工作目录是 /root
那么 GDB 将按以下顺序查找以下位置:
如果您重复此实验并且您认为源文件应该是可定位的,那么您可以使用此信息更新问题。
如果源文件不位于 GDB 将检查的路径之一,那么您可以 (a) 将源文件移动到 GDB 可以找到它的位置,或者 (b) 告诉 GDB 源文件在哪里。
要执行 (b),我们使用
directory
命令,如下所示:
(gdb) directory /blah
Source directories searched: /blah:$cdir:$cwd
这已将
/blah/
添加到要检查的位置列表的开头,因此现在 GDB 将按以下顺序检查这些位置:
如果您想从目录列表中删除条目,则可以使用
set directories
。 与仅将新条目添加到列表前面的 directories
命令不同,set directories
允许您完全重写列表。
以上是最有可能解决源文件丢失的解决方案,但是GDB也有能力在需要时重写源路径。 GDB 源路径处理的完整文档可以在这里找到。