43 votes

Débogage Android NDK dans Eclipse - comment arrêter les segfaults/SIGILL qui ne se produisent que lors de l'exécution du code natif ?

J'ai configuré le débogage dans Eclipse pour le code natif utilisant le NDK Android (sur Windows XP, avec Cygwin) jusqu'au stade où je peux définir des points d'arrêt à la fois dans le code Java et dans le code natif et le débogueur s'y arrête correctement. Le problème est que, lorsque j'avance dans le code natif, j'obtiens souvent des défauts de segmentation/SIGILL qui ne se produisent pas lorsque je continue au-delà du point d'arrêt.

  • Mon application est débuggeable comme défini dans AndroidManifest.xml
  • J'ai modifié le fichier (NDK)/build/core/build-binary.mk afin d'éviter qu'il ne supprime les symboles de débogage lorsque APP_OPTIM est défini comme debug, ce qu'il est dans le fichier Application.mk dans mon répertoire jni
  • J'ai défini LOCAL_CFLAGS := -g -O0 dans le fichier Android.mk, et j'ai également essayé chacun de ces drapeaux individuellement

J'ai lu que ce problème était lié au code optimisé généré, mais désactiver l'optimisation à l'aide de la commande -O0 n'a aucun impact sur mon problème. J'ai également rencontré l'utilisation de l'option NDK_BUILD=1 lors de la construction, mais en définissant debuggable=true dans AndroidManifest.xml a apparemment le même effet.

J'ai essayé cela à la fois sur un émulateur (fonctionnant en 2.3.3) et sur un appareil (fonctionnant en 2.2 - qui, étonnamment, n'a pas eu les problèmes de threads auxquels je m'attendais), avec des résultats similaires (bien que, si je me souviens bien, les échecs se sont produits à différents points du code).

Est-ce que quelqu'un a une idée des corrections/étapes possibles que je pourrais essayer, et/ou a été capable de passer avec succès le code natif sans problème ?

Merci beaucoup.


Edit : Ce problème n'a jamais été vraiment résolu, mais pour ceux qui veulent jeter un coup d'œil à mon guide de débogage du NDK, vous pouvez le trouver à l'adresse suivante ici .

Edit 2 : Les réponses que j'ai obtenues à cette question sont arrivées après la sortie de nouvelles versions du NDK, et cette question peut maintenant être redondante. Mon guide peut encore fonctionner, mais je n'ai pas utilisé le NDK depuis un certain temps et je ne peux donc pas me porter garant de son exactitude. J'ai accepté la réponse que j'ai, car les trois disent essentiellement la même chose, et c'était la première à être soumise.

2voto

user973743 Points 164

Si cela fonctionne pour armeabi et pas pour armeabi-v7a, cela devrait être un problème de construction. Décompressez le fichier apk dans le répertoire bin et vérifiez que les fichiers de bibliothèque sont les mêmes dans armeabi et armeabi-v7a.

0voto

JonnyBoy Points 1036

Une chose que j'ai remarquée est que armeabi-v7a ne fonctionne pas bien pour le débogage du code natif sur certains appareils. Essayez de construire uniquement pour armeabi et voyez si cela aide.

0voto

Adam Michnik Points 1

Compiler les fichiers sources c++ avec -march=armv4

Dans build/core/combo/arm/yourarch.mk mettez -march=armv4 et ensuite faites mm -B showcommands pour vérifier si elle a été utilisée.

Alors gdbserver peut s'en charger.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X