1

Linux マシン上のプロセスがスタックしているように見える場合、STDOUT または STDERR バッファがいっぱいであるためにプロセスがスタックしているかどうかを確認するにはどうすればよいですか?

私の特定のケースでは、CPU アクティビティを実行していないプロセスがありますが、数秒以内に終了すると予想されるときに実行を続けています。私の疑いは、プロセスがSTDOUTまたはSTDERRのバッファをいっぱいにして、そのバッファから読み取るはずのプロセスが何らかの理由で停止したことです。

この疑いを確認する方法はありますか?

4

3 に答える 3

3

gdb をアタッチして backtrace を実行すると、私の理論がほぼ裏付けられます...

$ gdb /opt/our_process pid
...blah blah blah...
(gdb) bt
#0  0x0000003f27adae60 in __write_nocancel () from /lib64/libc.so.6
#1  0x0000003f27a71583 in _IO_new_file_write () from /lib64/libc.so.6
#2  0x0000003f27a7144a in _IO_new_file_xsputn () from /lib64/libc.so.6
#3  0x0000003f27a49531 in buffered_vfprintf () from /lib64/libc.so.6
#4  0x0000003f27a4449e in vfprintf () from /lib64/libc.so.6
#5  0x0000003f27a4f03a in printf () from /lib64/libc.so.6
...out process's stack...

そして、シェルターが提案したように、straceもうまくいくようです...

$ strace -p 27689
Process 27689 attached - interrupt to quit
write(1, "some_text"..., 293
于 2013-01-21T03:57:26.103 に答える
1

これは標準の Linux プロセスですか、特別にインストールされたサードパーティ パッケージですか、それともカスタム コードですか?

標準の Linux プロセスにはこのような問題はありませんが、カスタム コードが原因である可能性が最も高いです。この状況をデバッグする最も簡単な方法は、特別なデバッグ コードを追加することです。

それ以外の場合は、std ユーティリティまたはサードパーティ パッケージに冗長モードがあるかどうかを確認してください-v, or -vv, or -vvv

最後に、一部の Linux バージョンでは、OS のバージョンの を使用して、truss (for solaris)ハングstraceしている場所を確認できます。

IHTH

于 2013-01-21T03:50:42.827 に答える
0

別の理論については、SOをご覧ください。これは興味深いと思いました。ここで何かが役立つことを願っています。乾杯

于 2013-01-21T03:53:56.340 に答える