-1

朋友们:

有时我们发现我们的程序运行不正常,也就是没有crash,而是没有按预期运行,是SLEEPING!

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

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

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

在linux/android中,进程是普通进程,native或者java进程。

提前很多

4

1 回答 1

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.

于 2013-06-25T12:25:18.290 回答