2013-06-22 66 views
-1

朋友:如何找出爲什麼這個過程是睡眠/阻塞在linux

一段時間後,我們發現我們的程序運行不正常,也就是說,它沒有崩潰,但並沒有如我們預期運行,它正在睡覺!

那麼,我想知道爲什麼它是睡覺,如一些插座讀取被阻止?有些信號等待被阻止?或其他事情發生阻止這一進程。

如何做?我發現ps或/ proc/pid/stats只能表示它的狀態和它的信號掩碼。但我想知道更多的細節,哪個套接字,信號或其他東西阻止了它?

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

它是在linux/android中,進程是普通進程,native或java進程。

THX很多提前

+0

正常的Android進程的主線程通常應該在平臺代碼的某處被阻止,因爲它應該是事件驅動的,並且只會調用你的代碼來傳遞一個事件。您創建的其他一些線程應該運行,除非您進行阻止呼叫,否則Android會殺死您的進程。如果這樣做,它可能會在以後重新創建它,但不一定會導致線程被重新創建(取決於您在程序中的位置)。 –

回答

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有更好的運氣。

+0

你不*需要root權限。儘管如此,啓動ndk gdb可能會更容易,因爲有指示。 –