如何找出linux中进程暂停/阻塞的原因

时间:2013-06-22 13:46:27

标签: android linux process

朋友:

有段时间我们发现我们的程序运行异常,也就是说,它没有崩溃,但没有像我们预期的那样运行,它是SLEEPING!

然后,我想找出为什么它是SLEEPING,比如一些套接字读取被阻止了?一些信号等待被阻止?或其他事情阻止这个过程。

怎么做?我发现ps或/ proc / pid / stats只能指示其状态及其信号掩码。但我想知道更多细节,哪个套接字,信号或其他东西阻止了它?

任何人都可以提供一些帮助信息吗?

它在linux / android中,该过程是常见的进程,本机或java进程。

提前很多

1 个答案:

答案 0 :(得分:0)

如果您的进程在系统调用中被阻止,您可以使用strace找出它是什么。请注意,strace二进制文件可能未安装在您的Android系统上,但在busybox的最新版本中有一个版本。此外,您可能需要root访问权限,因此您需要越狱您的Android设备。

这是一个人为的例子。

$ mkfifo /tmp/foo
$ cat /tmp/foo &       # blocks
$ ps                   # note pid of the blocked "cat" process; in my case it's 29739
$ sudo strace -p 29739 # attach to the process

在这种情况下,strace的输出是:

Process 29739 attached - interrupt to quit
open("/tmp/foo", O_RDONLY^C <unfinished ...>
然后,strace会随着你的过程而挂起;点击ctrl-c打破。

这是另一个例子:

$ nc -l  8888 &
[2] 31087
$ sudo strace -p 31087
Process 31087 attached - interrupt to quit
accept(3, 

在这种情况下,您可能想知道它正在尝试accept的内容;你可以使用/ proc文件系统:

$ ls -l /proc/31087/fd/3
lrwx------ 1 abliss abliss 64 Jun 25 12:22 /proc/31087/fd/3 -> socket:[2265625]

如果你的进程在java线程中被阻止,你可能会更好运使用android工具来附加像jdb这样的调试器。