朋友们:
有时我们发现我们的程序运行不正常,也就是没有crash,而是没有按预期运行,是SLEEPING!
然后,我想找出它为什么是 SLEEPING,例如,某些套接字读取被阻塞?一些信号等待阻塞?或发生其他事情来阻止这个过程。
怎么做?我发现 ps 或 /proc/pid/stats 只能指示其状态和信号掩码。但我想知道更多细节,哪个插座、信号或其他东西阻止了它?
任何人都可以提供一些帮助信息吗?
在linux/android中,进程是普通进程,native或者java进程。
提前很多
如果您的进程在系统调用中被阻止,您可以使用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.