1

鉴于 Linux 机器上的一个进程似乎被卡住,我如何判断它是否由于 STDOUT 或 STDERR 缓冲区已满而被卡住?

在我的特殊情况下,我有一个进程没有执行 CPU 活动,但在我希望它在几秒钟内退出时仍然运行。我的怀疑是该进程已经填满了 STDOUT 或 STDERR 的缓冲区,并且应该从缓冲区读取的进程由于某种原因已经停止这样做。

有什么办法可以证实这个怀疑吗?

4

3 回答 3

3

附加 gdb 并运行回溯几乎证实了我的理论......

$ 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 进程,一个专门安装的 3rd 方包还是自定义编写的代码?

标准 linux 进程应该没有这样的问题,而自定义代码最有可能是罪魁祸首。调试这种情况的最简单方法是添加特殊的调试代码。

否则,请查看您的 std 实用程序或 3rd-party 包是否具有详细模式,通常是-v, or -vv, or -vvv.

truss (for solaris)最后,对于某些 Linux 版本,您可以使用操作系统的版本strace来查看它挂在哪里。

IHTH

于 2013-01-21T03:50:42.827 回答
0

关于您的替代理论,请查看SO。我发现很有趣,我希望这里的东西有用。干杯

于 2013-01-21T03:53:56.340 回答