如何查看进程的堆栈跟踪?

如何查看进程的堆栈跟踪?

我见过答案并根据堆栈跟踪可以看出:

$ cat /proc/<PID>/stack
[<ffffffff81012b72>] save_stack_trace_tsk+0x22/0x40
[<ffffffff81213abe>] proc_pid_stack+0x8e/0xe0
[<ffffffff81214960>] proc_single_show+0x50/0x90
[<ffffffff811cd970>] seq_read+0xe0/0x3e0
[<ffffffff811a6a84>] vfs_read+0x94/0x180
[<ffffffff811a7729>] SyS_read+0x49/0xb0
[<ffffffff81623ad2>] system_call_fastpath+0x16/0x1b
[<ffffffffffffffff>] 0xffffffffffffffff

据我猜测,符合

[<ffffffff81012b72>] save_stack_trace_tsk+0x22/0x40

save_stack_trace_tsk肯定是指函数名 其他参数表示什么? (也许0xffffffff81012b72指向起始地址的地址save_stack_trace_tsk+0x22)最重要的是 0x40 表示什么? 0x40 是否表示该特定函数占用的字节总数?

多谢!

答案1

其中save_stack_trace_tsk+0x22/0x400x22是函数内部的偏移量save_stack_trace_tsk0x40是函数的大小save_stack_trace_tsk。两个十六进制数字均以字节为单位。

%pB这是内核实现使用的格式说明符扩展的结果printf:有关详细信息,包括如何确定函数的结束(因此大小),您可以查看linux内核源代码中的lib/vsprintf.cand 。kernel/kallsyms.c

[<0xffffffff81012b72>]是相同的save_stack_trace_tsk+0x22内核地址,但采用原始形式。

这总是[<0>]在较新的内核中,因为改变。

相关内容