2011-03-16 70 views
2

我有時在運行Android服務時收到ANR。我懷疑這是因爲僵局而發生的。Android發現死鎖

有沒有簡單的方法來監控Android或Eclipse中的死鎖。比如一個實用程序來顯示哪個線程擁有哪個鎖等?

有沒有辦法通過查看traces.txt文件找出死鎖?

我DDMS記錄看起來像這樣的碰撞

02-15 18:09:01.046: INFO/Process(90): Sending signal. PID: 450 SIG: 3 
02-15 18:09:01.046: INFO/dalvikvm(450): threadid=3: reacting to signal 3 
02-15 18:09:01.056: INFO/dalvikvm(450): Wrote stack traces to '/data/anr/traces.txt' 
02-15 18:09:01.076: INFO/Process(90): Sending signal. PID: 10548 SIG: 9 
02-15 18:09:01.076: ERROR/ActivityManager(90): ANR in com.abc.cm.core 
02-15 18:09:01.076: ERROR/ActivityManager(90): Reason: Executing service com.abc.cm.core/.WorkOrderManager 
02-15 18:09:01.076: ERROR/ActivityManager(90): Load: 1.46/1.16/1.05 
02-15 18:09:01.076: ERROR/ActivityManager(90): CPU usage from 19462ms to 1067ms ago: 
02-15 18:09:01.076: ERROR/ActivityManager(90): abc.cm.core: 13% = 12% user + 1% kernel/faults: 1360 minor 
02-15 18:09:01.076: ERROR/ActivityManager(90): mmcqd: 4% = 0% user + 4% kernel 
02-15 18:09:01.076: ERROR/ActivityManager(90): system_server: 3% = 2% user + 1% kernel/faults: 473 minor 
02-15 18:09:01.076: ERROR/ActivityManager(90): zygote: 2% = 2% user + 0% kernel/faults: 90 minor 
02-15 18:09:01.076: ERROR/ActivityManager(90): adbd: 1% = 0% user + 1% kernel/faults: 1042 minor 
02-15 18:09:01.076: ERROR/ActivityManager(90): m.abc.unten: 0% = 0% user + 0% kernel/faults: 203 minor 
02-15 18:09:01.076: ERROR/ActivityManager(90): ndroid.launcher: 0% = 0% user + 0% kernel/faults: 802 minor 
02-15 18:09:01.076: ERROR/ActivityManager(90): droid.wallpaper: 0% = 0% user + 0% kernel/faults: 109 minor 
02-15 18:09:01.076: ERROR/ActivityManager(90): ndroid.settings: 0% = 0% user + 0% kernel/faults: 44 minor 
02-15 18:09:01.076: ERROR/ActivityManager(90): dhd_dpc: 0% = 0% user + 0% kernel 
02-15 18:09:01.076: ERROR/ActivityManager(90): events/0: 0% = 0% user + 0% kernel 
02-15 18:09:01.076: ERROR/ActivityManager(90): logcat: 0% = 0% user + 0% kernel 
02-15 18:09:01.076: ERROR/ActivityManager(90): +andisk.api.test: 0% = 0% user + 0% kernel 
02-15 18:09:01.076: ERROR/ActivityManager(90): +iTestFwService1: 0% = 0% user + 0% kernel 
02-15 18:09:01.076: ERROR/ActivityManager(90): +sh: 0% = 0% user + 0% kernel 
02-15 18:09:01.076: ERROR/ActivityManager(90): TOTAL: 40% = 23% user + 16% kernel + 0% iowait + 0% softirq 
02-15 18:09:01.096: INFO/ActivityManager(90): Process com.abc.cm.core (pid 10548) has died. 
+0

發佈服務的代碼。 – 2011-03-16 02:41:04

+2

您可以在/data/anr/traces.txt中看到堆棧跟蹤嗎?如果兩個線程被鎖定在監視器上,您將能夠看到它。 (在MONITOR狀態下查找線程。)如果您的設備是root用戶,則可以執行「kill -3 」以隨時在日誌中獲取堆棧跟蹤。 – fadden 2011-03-16 23:51:25

+2

其實我從ddms中發現,我可以查看選定進程的線程列表。我在「監視」狀態下尋找線程。我甚至可以看到來自ddms的調用堆棧,包括文件和行號。這就是我現在使用的。 – 2011-03-17 06:20:33

回答

0

固定死鎖在任何平臺上是很難的時間。我知道的唯一方法就是在每個鎖定/解鎖/其他函數之前和之後添加一些日誌記錄(例如,使用Log.d)。

+0

這是我明天早上的計劃。我想我沒有太多選擇。 – 2011-03-16 05:27:32