一段時間後,我們發現我們的程序運行不正常,也就是說,它沒有崩潰,但並沒有如我們預期運行,它正在睡覺!
那麼,我想知道爲什麼它是睡覺,如一些插座讀取被阻止?有些信號等待被阻止?或其他事情發生阻止這一進程。
如何做?我發現ps或/ proc/pid/stats只能表示它的狀態和它的信號掩碼。但我想知道更多的細節,哪個套接字,信號或其他東西阻止了它?
任何人都可以提供一些幫助信息?
它是在linux/android中,進程是普通進程,native或java進程。
THX很多提前
一段時間後,我們發現我們的程序運行不正常,也就是說,它沒有崩潰,但並沒有如我們預期運行,它正在睡覺!
那麼,我想知道爲什麼它是睡覺,如一些插座讀取被阻止?有些信號等待被阻止?或其他事情發生阻止這一進程。
如何做?我發現ps或/ proc/pid/stats只能表示它的狀態和它的信號掩碼。但我想知道更多的細節,哪個套接字,信號或其他東西阻止了它?
任何人都可以提供一些幫助信息?
它是在linux/android中,進程是普通進程,native或java進程。
THX很多提前
如果你的進程被阻塞在系統調用,您可以使用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
有更好的運氣。
你不*需要root權限。儘管如此,啓動ndk gdb可能會更容易,因爲有指示。 –
正常的Android進程的主線程通常應該在平臺代碼的某處被阻止,因爲它應該是事件驅動的,並且只會調用你的代碼來傳遞一個事件。您創建的其他一些線程應該運行,除非您進行阻止呼叫,否則Android會殺死您的進程。如果這樣做,它可能會在以後重新創建它,但不一定會導致線程被重新創建(取決於您在程序中的位置)。 –