私は/ 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に実際に表示される内容を説明する文書を持っている人はいますか?
答え1
このファイルは/proc/$pid/stacks
カーネルスタックを示しています。システムでは、ffffffff8xxxxxxx形式のメモリアドレスはカーネル用に予約されたスペースにあります。書類が多くないので確認してくださいソースコード。代わりにpstack
、プログラムは実行可能な形式に関する知識を使用してユーザー空間スタックを表示します。