【发布时间】:2018-03-26 14:59:45
【问题描述】:
我最近使用 qemu+gdb 为内核调试设置了我的系统。目前,我可以在例如__do_page_fault() 处设置断点并通过gdb 跟踪调用(使用win 命令)。现在我想要以下任务:一个简单的C 程序,它有一个“hello world”printfstatement。跟踪从用户空间开始到write() 系统调用(或在执行该特定用户空间程序期间调用的内核空间中的任何内容)的调用序列。我想具体了解用户空间程序如何陷入系统调用 w.r.t Linux 内核。
现在我的疑问是在哪里设置断点?我们有内核代码以及程序的C 代码。这种情况怎么办?请举例说明。
谢谢!
【问题讨论】:
-
如果我猜对了:您希望在内核空间的某个点上获得完整的堆栈跟踪用户+内核。 gdb 没有这样的功能。为了做你想做的事,gdb 应该了解内部内核结构以展开当前-> 应用程序的用户空间堆栈。但是您可以编写一个简单的代码,展开当前用户空间堆栈(知道任务->ptregs 的内容)。但是符号会有问题。
-
谢谢!还有其他可以使用的工具吗?
-
你可以玩 do_coredump();在特定时刻为用户空间应用程序制作核心转储。
标签: linux-kernel gdb