Kernel
/proc/self/stack 和 pstack 的輸出有什麼區別?
我一直在查看 /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
程序顯示了使用者空間堆棧(使用它對可執行格式的了解)。