我已用-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。
ptrace(2)
系统调用实现的;ptrace
仅能检查和停止在用户空间运行的进程。我预计FreeBSD的进程调试机制类似,并且仅设计用于在用户空间工作的进程:因为操作系统内核将快速获取和释放锁以及响应中断,所以从用户空间设计允许全功能调试似乎非常不可能。 - sarnold