Kernel

/proc/self/stack 和 pstack 的輸出有什麼區別?

  • October 25, 2011

我一直在查看 /proc 的文件,並且“堆棧”對像是 proc 中的一個新對象,我還查看了核心送出以創建它——但是文件並沒有詳細說明 / proc/self/stack 文件——因為我直覺地期望它是程序的實際堆棧——但是舊pstack工具給出了不同的(更可信的)輸出。

以 bash 的堆棧為例

$ cat /proc/self/stack 
[<ffffffff8106f955>] do_wait+0x1c5/0x250
[<ffffffff8106fa83>] sys_wait4+0xa3/0x100
[<ffffffff81013172>] system_call_fastpath+0x16/0x1b
[<ffffffffffffffff>] 0xffffffffffffffff

並且,使用 pstack

$ pstack $$
#0  0x00000038cfaa664e in waitpid () from /lib64/libc.so.6
#1  0x000000000043ed42 in ?? ()
#2  0x000000000043ffbf in wait_for ()
#3  0x0000000000430bc9 in execute_command_internal ()
#4  0x0000000000430dbe in execute_command ()
#5  0x000000000041d526 in reader_loop ()
#6  0x000000000041ccde in main ()

地址不同,顯然符號根本不一樣……

是否有人對差異和/或描述 /proc-stack 中實際顯示的內容的文件有解釋?

該文件/proc/$pid/stacks顯示核心堆棧。在您的系統上,ffffffff8xxxxxxx 形式的記憶體地址位於為核心保留的空間中。文件不多,可以查看源碼。相反,該pstack程序顯示了使用者空間堆棧(使用它對可執行格式的了解)。

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