pstackコマンド

実行中のプロセスのスタックトレースを表示します。

概要

pstackは実行中のプロセスにアタッチし、そのプロセス内のすべてのスレッドのスタックトレースを表示するユーティリティです。特に、プロセスを再起動したり、事前にデバッガをセットアップしたりすることなく、ハングしたり誤動作しているプロセスをデバッグするのに役立ちます。

オプション

pstackはシンプルなコマンドで、多くのオプションはありません。主に引数としてプロセスID(PID)を取ります。

使用例

基本的な使い方

$ pstack 1234
Thread 1 (process 1234):
#0  0x00007f8e2d72dea3 in poll () from /lib64/libc.so.6
#1  0x00007f8e2c8b11d8 in ?? () from /lib64/libpulse.so.0
#2  0x00007f8e2c8a9e3c in pa_mainloop_poll () from /lib64/libpulse.so.0
#3  0x00007f8e2c8aa41c in pa_mainloop_iterate () from /lib64/libpulse.so.0
#4  0x00007f8e2c8aa49c in pa_mainloop_run () from /lib64/libpulse.so.0
#5  0x00007f8e2c8b1228 in ?? () from /lib64/libpulse.so.0
#6  0x00007f8e2c8a4259 in ?? () from /lib64/libpulse.so.0
#7  0x00007f8e2d6c1609 in start_thread () from /lib64/libpthread.so.0
#8  0x00007f8e2d7e7163 in clone () from /lib64/libc.so.6

複数のプロセス

$ pstack 1234 5678
==> 1234 <==
Thread 1 (process 1234):
#0  0x00007f8e2d72dea3 in poll () from /lib64/libc.so.6
#1  0x00007f8e2c8b11d8 in ?? () from /lib64/libpulse.so.0
...

==> 5678 <==
Thread 1 (process 5678):
#0  0x00007f9a3c45ea35 in nanosleep () from /lib64/libc.so.6
#1  0x000055d7e44f5b1a in main ()

ヒント:

プロセスIDの検索

pstackを使用する前に、プロセスIDを知る必要があります。pspidofを使用して見つけることができます:

$ ps aux | grep firefox
user     1234  2.5  1.8 2589452 298796 ?      Sl   09:15   0:45 /usr/lib/firefox/firefox

$ pidof firefox
1234

ハングしたプロセスのデバッグ

プロセスがフリーズしているように見える場合、pstackを使用して何をしているか確認できます:

$ pstack $(pidof frozen_app)

root権限

自分が所有していないプロセスの場合、sudoを使用する必要があります:

$ sudo pstack 1234

代替コマンド

一部のシステムでは、pstackが利用できない場合があります。以下の代替手段を使用できます:

よくある質問

Q1. pstackは実際に何をしているのですか?

A. pstackはデバッグ機能を使用して実行中のプロセスにアタッチし、そのプロセス内のすべてのスレッドの現在のコールスタックを抽出し、読みやすい形式で表示します。

Q2. pstackはすべてのUnixシステムで利用できますか?

A. いいえ、pstackは標準的なUnixコマンドではありません。主にRed Hat由来のLinuxシステムで一般的に利用できます。他のシステムでは、gdbなどの代替手段を使用する必要があるかもしれません。

Q3. pstackは実行中のプロセスに影響を与えますか?

A. pstackはスタックトレースを抽出している間、一時的にプロセスを停止しますが、この一時停止は通常非常に短く、通常の操作に影響を与えるべきではありません。

Q4. なぜ一部のスタックフレームで関数名の代わりに「??」が表示されるのですか?

A. これは通常、その特定のライブラリや実行可能ファイルのデバッグシンボルが利用できない場合に発生します。プロセスは正常に実行されていますが、pstackは正確な関数名を判断できません。

参考文献

https://man7.org/linux/man-pages/man1/pstack.1.html

改訂履歴