首页 > 解决方案 > 是否可以为使用 ptrace/gdb 停止的进程获取内核回溯?

问题描述

我在 Linux 上使用ptrace(2)andlibunwind从正在运行的进程中采样用户级堆栈,效果很好。但是,如果我尝试查看内核级堆栈,/proc/<pid>/stack我总是会看到以下内容:

[<0>] ptrace_stop+0x155/0x270
[<0>] get_signal+0x49e/0x730
[<0>] do_signal+0x34/0x6d0
[<0>] exit_to_usermode_loop+0x82/0xf0
[<0>] do_syscall_64+0x1a3/0x1b0
[<0>] entry_SYSCALL_64_after_hwframe+0x44/0xa9
[<0>] 0xffffffffffffffff

也就是说,该进程的当前内核级堆栈位于 中ptrace_stop(),而不是它之前所做的(以及我感兴趣的)。

有什么办法可以避免这种情况并读取停止的进程的原始内核级堆栈ptrace(2)?我观察到附加到调试器的进程的相同行为,例如gdb,所以我认为解决方案是相同的。

标签: gdbptracebacktracelibunwind

解决方案


推荐阅读