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.
Post le code pour le service. –
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
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. –