web-dev-qa-db-ja.com

Linuxのどこでプログラムが動かなくなっているかを知る方法は?

私のubuntuサーバーで次のコマンドを実行しています

root@slot13:~# lxc-stop --name pavan --logfile=test1.txt --logpriority=trace

無期限にハングアップしているようです。これがAIXで起こったときはいつでも、私は単純に問題のプロセスのPIDを取得して言った

$ procstack <pid_of_stuck_process>

プロセスのコールスタック全体を表示するために使用されていました。 linux/ubuntuにprocstackに相当するものはありますか?

47
Pavan Manjunath

私の最初のステップは、プロセスでstraceを実行することです。

 strace -s 99 -ffp 12345

プロセスIDが12345の場合。これにより、プログラムが実行しているすべてのシステムコールが表示されます。 プロセスを追跡する方法 は詳細を示します。

あなたがスタックトレースを取得することを主張した場合、グーグルは同等のものはpstackであると教えてくれます。しかし、私はそれをインストールしていないので、gdbを使用します。

 tweedleburg:~ # sleep 3600 &
 [2] 2621
 tweedleburg:~ # gdb
 (gdb) attach 2621
 (gdb) bt
 #0  0x00007feda374e6b0 in __nanosleep_nocancel () from /lib64/libc.so.6
 #1  0x0000000000403ee7 in ?? ()
 #2  0x0000000000403d70 in ?? ()
 #3  0x000000000040185d in ?? ()
 #4  0x00007feda36b8b05 in __libc_start_main () from /lib64/libc.so.6
 #5  0x0000000000401969 in ?? ()
 (gdb)
45
Thorsten Staerk

プログラムのスタックトレースを見つけるために2つの回答が与えられました(最初にデバッグシンボルをインストールすることを忘れないでください!)。システムコールが行き詰まった場所を見つけたい場合は、/proc/PID/stack、カーネルスタックをリストします。例:

$ cat /proc/self/stack
[<ffffffff81012b72>] save_stack_trace_tsk+0x22/0x40
[<ffffffff81213abe>] proc_pid_stack+0x8e/0xe0
[<ffffffff81214960>] proc_single_show+0x50/0x90
[<ffffffff811cd970>] seq_read+0xe0/0x3e0
[<ffffffff811a6a84>] vfs_read+0x94/0x180
[<ffffffff811a7729>] SyS_read+0x49/0xb0
[<ffffffff81623ad2>] system_call_fastpath+0x16/0x1b
[<ffffffffffffffff>] 0xffffffffffffffff
34
Lekensteyn

ほとんどのUNIXシステムでは、 [〜#〜] gdb [〜#〜] を使用できます。

gdb -batch -ex bt -p 1234

pstack もあります(標準のユーティリティではないため、おそらく手動でインストールする必要があります)。これは、AIXのprocstackに相当します。しかし、私のDebian wheezy AMD64では、常にエラーが発生するようです。 i386では、デバッグシンボルなしでコンパイルされたプログラムの場合、デバッグシンボルが利用可能なライブラリからであっても、シンボルは出力されません。

strace -p1234を使用して、プロセスによって実行されるシステムコールを確認することもできます。

pstackは、実行中のプロセスのスタックトレースを出力します。 gstackは、pstackが使用できない場合、またはディストリビューション/ Archをサポートしていない場合によく使用されます。