无法进入系统调用源代码

时间:2011-05-14 01:14:54

标签: unix gdb systems-programming

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

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

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

但这也行不通。

你能建议吗?

感谢。

2 个答案:

答案 0 :(得分:7)

您似乎对UNIX系统的工作方式缺乏了解。

想一想。假设你能够进入实现系统调用的内核函数,比如sys_open。所以现在你在调试器中查看sys_open的内核源代码。问题是:内核是在那个点运行,还是停止了。由于您希望在调试器中执行next之类的操作,因此我们假设内核 已停止。

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

通常,内核会对键盘引发的中断做出反应,找出按下了哪个键,然后将该键发送到正确的进程({{1}中被阻止的进程来自控制键盘的终端。)

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

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

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

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

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

答案 1 :(得分:3)

正如雇佣的俄罗斯人已经说过的那样,gdb在用户空间中无法检查内核中运行的任何内容。

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

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

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