Linuxでプログラムがスタックしている場所を知る方法は?


44

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

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

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

$ procstack <pid_of_stuck_process>

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

回答:


43

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

 strace -s 99 -ffp 12345

プロセスIDが12345の場合。これにより、プログラムが実行しているすべてのsyscallが表示されます。プロセスを追跡する方法がさらにわかります。

あなたがスタックトレースを取得することを主張する場合、Googleは同等のものが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)

33

プログラムのスタックトレースを見つけるために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

6
注記:per man7.org/linux/man-pages/man5/proc.5.html ... "/ proc / [pid] / stack(Linux 2.6.29以降)このファイルは、関数呼び出しのシンボリックトレースを提供します。このプロセスのカーネルスタック。このファイルは、カーネルがCONFIG_STACKTRACE設定オプションで構築された場合にのみ提供されています。 "
DocSalvager

また、そのファイルへのアクセスはスーパーユーザーまたはプロセス自体に制限されていることに注意してください(少なくとも私が試したシステムでは)。
ステファンシャゼル14

また、出力/proc/pid/wchanWCHANps -lまたはps -o wchanそのスタックの上部を参照してください。(このps部分は多くのUnicesで動作しますが、それ自体が常に(多くの場合)役立つとは限りません)。
ステファンシャゼル14

27

ほとんどのUNIXシステムでは、GDBを使用できます。

gdb -batch -ex bt -p 1234

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

またstrace -p1234、プロセスによって実行されたシステムコールを表示するために使用できます。


1
pstack毎回エラーを投げているようです。何かのようなroot@sarai:~# pstack 6312 6312: /usr/bin/python /usr/bin/twistd -n --uid=maas --gid=maas --pidfile=/run/maas-pserv.pid --logfile=/dev/null maas-pserv --conf... (No symbols found) crawl: Input/output error Error tracing through process 6312
パヴァンManjunath 14年

@PavanManjunath pstackはamd64で壊れているようですが、Debian wheezy amd64でも同じことがわかります。
ジル「SO-悪であるのをやめる」14年

1
pstackのREADMEには、32ビット、ELF、x86、GNU専用であると書かれています。
ステファンシャゼル14

1

pstack実行中のプロセスのスタックトレースを出力します。 gstackpstack使用できない場合、またはディストリビューション/アーキテクチャをサポートしていない場合は、一般的な同等のものです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.