【问题标题】:Trace from user space code to kernel space从用户空间代码到内核空间的跟踪
【发布时间】:2018-03-26 14:59:45
【问题描述】:

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

现在我的疑问是在哪里设置断点?我们有内核代码以及程序的C 代码。这种情况怎么办?请举例说明。

谢谢!

【问题讨论】:

  • 如果我猜对了:您希望在内核空间的某个点上获得完整的堆栈跟踪用户+内核。 gdb 没有这样的功能。为了做你想做的事,gdb 应该了解内部内核结构以展开当前-> 应用程序的用户空间堆栈。但是您可以编写一个简单的代码,展开当前用户空间堆栈(知道任务->ptregs 的内容)。但是符号会有问题。
  • 谢谢!还有其他可以使用的工具吗?
  • 你可以玩 do_coredump();在特定时刻为用户空间应用程序制作核心转储。

标签: linux-kernel gdb


【解决方案1】:

我认为最简单的方法是将其分成两部分。

  1. 使用主机 gdb 在来宾内核中放置断点。
  2. 在用户代码中放置断点,在陷阱指令之前,使用 in-guest 目标 gdb,当命中时 - 使用目标 (in-qemu) gdb 打印堆栈。您将获得用户空间堆栈跟踪。
  3. 在来宾 gdb 中继续执行
  4. 内核断点(我们已在阶段 1 设置)将在主机 gdb 中命中。打印内核堆栈跟踪。

附: 如果你的内核会不断地命中断点(例如 write syscall 肯定被广泛使用),你可以使用条件断点来命中断点,只需要传递某些参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-26
    • 2011-10-22
    • 2014-02-01
    • 1970-01-01
    • 2012-04-29
    • 2016-06-26
    • 2012-06-23
    • 2014-08-18
    相关资源
    最近更新 更多