Linux

如何查看程序的堆棧跟踪?

  • January 7, 2020

我已經看到了這個答案,根據 Stack Trace 可以看出:

$ 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 是否表示該特定函式佔用的字節總數?

非常感謝!

其中save_stack_trace_tsk+0x22/0x40,是函式0x22內部的偏移量,是函式的大小。兩個十六進制數字都以字節為單位。save_stack_trace_tsk``0x40``save_stack_trace_tsk

這是%pB核心實現使用的格式說明符擴展的結果printf:有關詳細資訊,包括如何確定函式的結尾(因此大小),您可以查看 linux 核心原始碼中的lib/vsprintf.cand kernel/kallsyms.c

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

自從這種變化以來,這總是[<0>]在較新的核心中。

引用自:https://unix.stackexchange.com/questions/560877