7

我已经用 -g 选项编译了我的 freebsd libc 源代码,所以现在我可以进入 libc 函数。

但是我无法进入系统调用代码。我已经用-g编译了freebsd内核源代码。在设置断点时,gdb 会通知 .S 文件上的断点。在遇到断点时,gdb 无法进入系统调用源代码。

另外,我试过:gdb$catch syscall open

但这也行不通。

你能建议点什么吗?

谢谢。

4

2 回答 2

10

您似乎根本不了解 UNIX 系统的工作原理。

想想看。假设您能够单步执行实现系统调用的内核函数,例如sys_open. 所以现在你正在sys_open调试器中查看内核源代码。问题是:内核是在那个时候运行,还是停止了。由于您将想要next在调试器中执行类似的操作,因此我们假设内核停止。

所以现在你按下n键,会发生什么?

通常,内核将对键盘引发的中断做出反应,确定按下了哪个键,并将该键发送到正确的进程(read(2)从控制键盘的终端阻止的进程)。

但是您的内核已停止,因此您无需按键。

结论:通过在同一台机器上运行的调试器调试内核是不可能的。

事实上,当人们调试内核时,他们通常是通过在另一台机器上运行调试器来完成的(这称为远程调试)。

如果你真的想进入内核,最简单的方法是使用UML

在您玩过 UML 并了解用户空间/内核接口如何工作和交互之后,您可以尝试一下kgdb,尽管设置通常有点复杂。您实际上不必为此拥有单独的机器,您可以使用 VMWare 或 VirtualPC 或 VirtualBox。

于 2011-05-14T03:24:00.703 回答
3

正如 Employed Russian 所说,处于用户态的 gdb 无法检查内核中运行的任何内容。

然而,没有什么能阻止在内核本身中实现调试器。在这种情况下,可以从本地调试会话(控制台)逐步设置断点并运行内核代码。在 FreeBSD 中,这样的调试器可以作为ddb使用。

一些限制是您的 gdb 和 ddb 会话之间缺乏连接,而且我不确定 FreeBSD/ddb 下的内核代码是否可以使用源级调试 (-g)。

从用户态“调试”内核的另一种侵入性更小的方法是使用dtrace

于 2011-05-14T04:38:55.783 回答