我已经用 -g 选项编译了我的 freebsd libc 源代码,所以现在我可以进入 libc 函数。
但是我无法进入系统调用代码。我已经用-g编译了freebsd内核源代码。在设置断点时,gdb 会通知 .S 文件上的断点。在遇到断点时,gdb 无法进入系统调用源代码。
另外,我试过:gdb$catch syscall open
但这也行不通。
你能建议点什么吗?
谢谢。
我已经用 -g 选项编译了我的 freebsd libc 源代码,所以现在我可以进入 libc 函数。
但是我无法进入系统调用代码。我已经用-g编译了freebsd内核源代码。在设置断点时,gdb 会通知 .S 文件上的断点。在遇到断点时,gdb 无法进入系统调用源代码。
另外,我试过:gdb$catch syscall open
但这也行不通。
你能建议点什么吗?
谢谢。
您似乎根本不了解 UNIX 系统的工作原理。
想想看。假设您能够单步执行实现系统调用的内核函数,例如sys_open
. 所以现在你正在sys_open
调试器中查看内核源代码。问题是:内核是在那个时候运行,还是停止了。由于您将想要next
在调试器中执行类似的操作,因此我们假设内核已停止。
所以现在你按下n
键,会发生什么?
通常,内核将对键盘引发的中断做出反应,确定按下了哪个键,并将该键发送到正确的进程(read(2)
从控制键盘的终端阻止的进程)。
但是您的内核已停止,因此您无需按键。
结论:通过在同一台机器上运行的调试器调试内核是不可能的。
事实上,当人们调试内核时,他们通常是通过在另一台机器上运行调试器来完成的(这称为远程调试)。
如果你真的想进入内核,最简单的方法是使用UML。
在您玩过 UML 并了解用户空间/内核接口如何工作和交互之后,您可以尝试一下kgdb
,尽管设置通常有点复杂。您实际上不必为此拥有单独的机器,您可以使用 VMWare 或 VirtualPC 或 VirtualBox。