2011-03-16 3 views
2

Je reçois parfois une ANR lorsque je cours mon service Android. Je soupçonne que cela se produit à cause d'une impasse.Android trouver une impasse

Existe-t-il un moyen facile de surveiller un interblocage dans Android ou Eclipse. Tels qu'un utilitaire pour montrer quel thread détient quel verrou, etc.?

Et est-il un moyen de comprendre un blocage en regardant le fichier traces.txt?

Mon DDMS connecter ressemble à ceci au moment de l'accident

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

Post le code pour le service. –

+2

Pouvez-vous voir les traces de la pile dans /data/anr/traces.txt? Si deux threads sont verrouillés sur les moniteurs, vous pourrez le voir. (Recherchez les threads dans l'état MONITOR.) Si votre périphérique est root, vous pouvez faire "kill -3 " pour obtenir une trace de pile dans le journal à tout moment. – fadden

+2

En fait, je découvre que depuis ddms je peux regarder la liste des threads pour un processus sélectionné. Je cherche les threads dans l'état "monitor". Je peux même voir la pile d'appel de ddms comprenant des dossiers et des numéros de ligne. C'est ce que j'utilise maintenant. –

Répondre

0

fixation sur toute plate-forme serrures à pêne dormant est difficile. La seule façon que je connaisse sur android est d'ajouter un enregistrement (par exemple en utilisant Log.d) avant et après chaque verrouillage/déverrouillage/otherExpensiveFunctions

+0

C'était mon plan pour demain matin. Je suppose que je n'ai plus beaucoup d'options. –