/proc/self/stack 和 pstack 的输出有什么区别?

/proc/self/stack 和 pstack 的输出有什么区别?

我一直在查看 /proc 的文档,并且“stack”对象是 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 中实际显示内容的文档吗?

答案1

该文件/proc/$pid/stacks显示了内核堆栈。在您的系统上,格式为 ffffffff8xxxxxxx 的内存地址位于为内核保留的空间中。文档不多,你可以查一下源代码。相反,该pstack程序显示用户空间堆栈(使用其可执行格式的知识)。

相关内容