我在 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
,所以我认为解决方案是相同的。