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