2011-07-09 4 views
-1

J'écris une application Android, et il y a un tableau que je scanne à quelques endroits. Pour une raison quelconque, il se bloque parfois dans l'un de ces endroits avec une exception ArrayIndexOutOfBoundsException. Quand je le débogue, les indices au moment des crashs sont toujours parfaitement raisonnables et dans les limites du tableau (bien que différents indices à chaque fois). Plus agaçante, je ne peux pas regarder le contenu du tableau, car chaque fois que je fais défiler les variables, le débogueur se déconnecte juste avant que j'arrive au tableau. Je place le tableau dans un tableau que je crée dans une fonction C et retourne (en utilisant le NDK Android et cetera) et ma meilleure estimation est que parfois le tableau que je reçois est sérieusement foiré, mais ça fonctionne très bien le plus souvent , et quand il plante, il ne plante généralement pas sur l'index 0, donc tout ce que je reçois du code C doit dans ces cas fonctionner assez bien pour être lu par certains. L'information potentiellement pertinente est aussi que si j'arrête l'application quand elle n'a pas planté, le débogueur n'a aucun problème à regarder le tableau.Bizarre ArrayIndexOutOfBoundsException

+1

pouvez-vous inclure du code? Logcat? – IamAlexAlright

+0

Quel est le type de la matrice? –

+0

Il me semble qu'il y a un bogue dans votre code natif qui entraîne la corruption du tableau d'une manière ou d'une autre. Cela peut être suffisant pour planter le débogueur. –

Répondre

0

Chaque fois que les choses deviennent vraiment étranges (comme quand i et j sont « s et après j = i * iintj a une valeur de 35), je cherche un problème multi-threading. (J'ai vu des problèmes similaires avec un processeur qui exécute des opérations dans le désordre, pas de threads multiples, mais il pourrait tout aussi bien l'être.) Obtenez votre référence de tableau dans une variable locale et travaillez avec cela. D'autres threads peuvent ensuite modifier les valeurs dans le tableau, mais ils ne peuvent pas changer sa longueur. Ensuite, vous voudrez peut-être jeter un coup d'œil sur les threads que vous avez en cours d'exécution, ce qu'ils font, et ce que vous faites pour les empêcher de déchiqueter vos données.

En outre: votre débogueur ne peut pas arrêter tous vos threads lorsqu'il rencontre l'exception. (Il y a probablement une option pour ceci quelque part.) Le fil coupable peut alors enlever toute la preuve et s'échapper au-dessus de la frontière au moment où vous jetez un coup d'oeil aux choses.

Questions connexes