Android DDMS查看Threads情況

 有時候程序運行出現死鎖或者信號量卡死是很糾結的問題,單看代碼很難分析定位問題,這時候可以藉助DDMS來查看threads的運行情況,一目瞭然。

    手機連接上USB,確保adb連通,然後啓動Eclipse裏的DDMS,這時候應該手機就正常連接上了

  就如上圖中顯示的,只要連接上了就可以查看某個進程裏的所有線程的活動了; 下面具體解釋下Threads標籤頁裏給出的每個字段的意思:

ID:   虛擬機分配的唯一的線程ID,在Dalvik裏,它們是從3開始的奇數。 
TidLinux的線程ID號 
Stauts:線程狀態,比較多,有下面的一些 
            running:  正在執行程序代碼 
            sleeping:執行了Thread.sleep() 
            monitor:等待接受一個監聽鎖。 
            wait::Object.wait(),等待被其他線程喚醒 
            native:正在執行native代碼, 
            vmwait:等待虛擬機,(這個不是很懂,高手指教,這個狀態在什麼情況下發生) 
            zombie:線程在垂死的進程 
            init:線程在初始化(我們不可能看到) 
            starting:線程正在啓動(我們不可能看到) 
utime:執行用戶代碼的累計時間 
stime:執行系統代碼的累計時間 
name:線程的名字


另外,右側每個Thread選中之後可以在下面看到Refresh按鈕,這個點了之後,可以看到線程的函數執行,結合Status可以知道目前情況;而出現問題時某個線程一般會變爲monitor狀態,這時候就要特別留意他,並refresh下,檢查他的執行情況 ,再回頭結合代碼,一般都能找到問題出在什麼地方;


大家可以看到一般一個虛擬機實例進程都包含有如下7個通用的線程,下面大致講一下這些線程的作用和創建流程。
1. main
這個就是主線程了。具體流程待細述。
2. HeapWorker
一個異步的工作線程,處理那些需要在單獨線程裏面做的避免同步問題的堆操作。其源代碼在dalvik/vm/alloc/HeapWorker.*部分。
3. Signal Catcher
這個線程是用來捕獲linux信號和做一些後續處理的。比如說,當一個SIGQUIT (Ctrl-\)信號到達後,這個線程就會掛起虛擬機,並且將所有線程的狀態信息輸出到log。其源代碼在dalvik/vm/SignalCatcher.*部分。
4. JDWP
這個線程是用來實現Java Debug Wire Protocol的。如果命令行調試器的參數爲"suspend=y",這樣會暫停虛擬機。這個估計和eclipse的調試和ddms等調試工具相關。其源代碼在dalvik/vm/jdwp/*部分。
5. Stdio Converter
這個線程從標準輸出和標準錯誤輸出讀取信息並將它們轉換爲log信息。其源代碼在dalvik/vm/StdioConverter.*部分。
6. Compiler
Android's Jit獨立於目標平臺的部分。其源代碼在dalvik/vm/compiler/Compiler.*和dalvik/vm/interp/Jit.*等部分。
7. Binder Thread #%d
使用binder進行通訊時用到的線程。其源代碼在frameworks/base/libs/binder/*等部分。
以下的線程屬於system_server和應用程序專有線程,視具體應用的需求而定。
8. system_server專有
android.server.ServerThread
ActivityManager
ProcessStats
PackageManager
FileObserver
AccountManagerService
SyncHandlerThread
UEventObserver
PowerManagerService
AlarmManager
WindowManager
InputDeviceReader
WindowManagerPolicy
InputDispatcher
ConnectivityThread
WifiService
WifiWatchdogThread
LocationManagerService
AudioService
GpsEventThread
GpsNetworkThread
android.hardware.SensorManager$SensorThread
watchdog
Wallpaper
com.android.server.MountListener
9. misc
其他部分線程由java層的api提供,Thread等。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章