web-dev-qa-db-ja.com

/ 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に実際に表示される内容を説明するドキュメントはありますか?

5
Soren

ファイル /proc/$pid/stacksはカーネルスタックを示しています。システムでは、ffffffff8xxxxxxxの形式のメモリアドレスは、カーネル用に予約されているスペースにあります。ドキュメントはあまりありません。 ソースコード を確認できます。対照的に、pstackプログラムは、ユーザースペーススタックを表示します(実行可能形式の知識を使用)。