unix - 无法进入系统调用源代码

标签 unix gdb systems-programming

我已经用 -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/

相关文章:

c++ - 在GDB中查看打印方法

qt - GDB调试警告

我可以使用 openmp 或 pthreads 通过不同线程调用相同的系统调用吗

c++ - 在 Linux 上监视目录的程序

unix - 使 "ls"命令在 "a"之前对 "B"进行排序(与 a->b->A->B)

linux - 查找字符串是否直接或间接存在于所有文件中

c - 我在哪里可以找到在我的 C 程序的 .data 部分中创建静态变量的程序集?

c - opendir 不接受字符串变量,但接受纯字符串

将 : uid_t to string, off_t 转换为字符串

shell - 如何在shell中的一行中编写if else?