Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 无法单步执行系统调用源代码_Unix_Gdb_Systems Programming - Fatal编程技术网

Unix 无法单步执行系统调用源代码

Unix 无法单步执行系统调用源代码,unix,gdb,systems-programming,Unix,Gdb,Systems Programming,我已经用-g选项编译了我的freebsd libc源代码,所以现在我可以进入libc函数 但我很难进入系统调用代码。我已经用-g编译了freebsd内核源代码。在设置断点时,gdb会通知.S文件上的断点。遇到断点时,gdb无法进入syscall源代码 此外,我还尝试了:gdb$catch syscall open 但这也不起作用 你能提出一些建议吗 谢谢。您似乎根本不了解UNIX系统的工作原理 想想看。假设您能够进入实现系统调用的内核函数,比如说sys\u open。现在您正在调试器中查看sys

我已经用-g选项编译了我的freebsd libc源代码,所以现在我可以进入libc函数

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

此外,我还尝试了:gdb$catch syscall open

但这也不起作用

你能提出一些建议吗


谢谢。

您似乎根本不了解UNIX系统的工作原理

想想看。假设您能够进入实现系统调用的内核函数,比如说
sys\u open
。现在您正在调试器中查看
sys\u open
的内核源代码。问题是:内核是在该点运行,还是停止运行。由于您需要在调试器中执行类似于
next
的操作,因此假设内核已停止

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

通常,内核会对键盘引发的中断做出反应,找出按下了哪个键,并将该键发送到正确的进程(从控制键盘的终端读取(2)时被阻止的进程)

但是你的内核停止了,所以你没有按键

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

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

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


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

如前所述,位于userland的gdb无法检查内核中运行的任何东西

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

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


从userland“调试”内核的另一种方式是使用。

在Linux上的调试是通过
ptrace(2)
系统调用实现的
ptrace
只能检查和停止在用户空间中运行的进程。我认为FreeBSD的进程调试机制是类似的,并且只设计用于用户空间进程:因为操作系统内核将获取和释放锁,并快速响应中断,所以将内核设计为允许从用户空间进行全功能调试似乎不太可能。嗨,Sarnold,谢谢你的评论。如果无法进行用户空间调试,那么kdb/kgdb是否可以达到此目的?我研究kdb/kgdb已有多年了,可能情况已经发生了巨大变化。:)但也许这将是一个很好的起点?您的“通过在同一台机器上运行的调试器调试内核是不可能的”结论仅适用于Linux上的kgdb。UML也是一个Linux特定的解决方案。有一个kgdb到FreeBSD的端口,但是FreeBSD内核可以用ddb进行本地调试,就像Solaris可以用kmdb进行调试一样。您对内核调试器无法工作的原因的解释是有缺陷的。内核不是单线程程序,甚至也不是多线程程序。内核是在特权上下文中执行的代码。许多内核线程可以同时运行此代码,因此影响其中一个线程执行的指令的断点没有令人信服的理由突然“停止内核”,即停止其他所有内核线程。