无法进入系统调用源代码

San*_*ngh 6 unix gdb systems-programming

我用-g选项编译了我的freebsd libc源代码,现在我可以介入libc函数了.

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

另外,我试过:gdb $ catch系统调用打开

但这也行不通.

你能建议一下吗?

谢谢.

Emp*_*ian 7

您似乎对UNIX系统的工作原理基本缺乏了解.

想一想.假设您能够进入实现系统调用的内核函数,比如说sys_open.所以现在你sys_open在调试器中查看内核源代码.问题是:内核是在那个点运行,还是停止了.既然您想要next在调试器中执行某些操作,那么我们假设内核停止.

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

通常,内核会对键盘引发的中断作出反应,找出按下了哪个键,然后将该键发送到正确的进程(read(2)从控制键盘的终端被阻塞的进程).

你的内核已停止,所以没有按键给你.

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

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

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

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

  • 您对内核调试器无法工作的原因的解释是有缺陷的。内核不是单线程程序,甚至也不是多线程程序。内核是在特权上下文中执行的代码。许多内核线程可以同时运行此代码,因此影响其中一个执行指令的断点没有令人信服的理由突然“停止内核”,即停止所有其他内核线程。 (2认同)