从用户空间代码到内核空间的跟踪

时间:2018-03-22 15:07:57

标签: linux-kernel gdb

我最近使用qemu + gdb设置了内核调试系统。目前,我可以在__do_page_fault()处设置断点,并通过gdb跟踪调用(使用win命令)。现在我想要以下任务:一个简单的C程序,其中包含“hello worldprintf语句。跟踪从用户空间开始到write()系统调用(或在执行特定用户空间程序期间调用的内核空间中的任何内容)的调用序列。我想了解用户空间程序如何陷入系统调用w.r.t Linux内核。

现在我怀疑是在哪里设置断点?我们有内核代码以及程序的C代码。如何解决这种情况?请举例说明。

谢谢!

1 个答案:

答案 0 :(得分:1)

在我看来,最简单的方法是将其分为两部分。

  1. 使用主机gdb在客户端内核中放置断点。
  2. 在陷阱指令之前在用户代码中放置断点,使用in-guest目标gdb,当命中时 - 使用target(in-qemu)gdb打印堆栈。您将获得用户空间堆栈跟踪。
  3. 在来宾gdb中继续执行
  4. 内核断点(我们在第1阶段设置)将在主机gdb中命中。打印内核堆栈跟踪。
  5. P.S。 如果你的内核将持续命中断点(f.e. write syscall肯定被广泛使用),你可以使用条件断点来仅在传递了某些参数的情况下命中断点。