Débogage Android NDK dans Eclipse – Comment arrêter segfaults / SIGILL qui ne se produit que lors de la progression dans le code natif

J’ai configuré le débogage dans Eclipse pour le code natif en utilisant le NDK Android (sous Windows XP, avec Cygwin) au stade où je peux définir des points d’arrêt en Java et en code natif et le débogueur les endommagera correctement. Mon problème est que lorsque je traverse le code natif, j’obtiens souvent des erreurs de segmentation / SIGILL qui ne se produisent pas au-delà du point d’arrêt.

  • Mon application peut être déboguée comme défini dans AndroidManifest.xml
  • J’ai modifié le (NDK) /build/core/build-binary.mk pour l’empêcher de supprimer les symboles de débogage lorsque APP_OPTIM est défini comme débogage, ce qui se trouve dans le fichier Application.mk de 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 est dû au code optimisé généré, mais désactiver l’optimisation avec -O0 n’a aucun impact sur mon problème. J’ai également trouvé utiliser l’ NDK_BUILD=1 lors de la construction, mais définir debuggable=true dans AndroidManifest.xml semble avoir le même effet.

Je l’ai essayé à la fois sur un émulateur (exécutant la version 2.3.3) et sur un périphérique (exécutant la version 2.2 – ce qui, étonnamment, n’avait pas les problèmes de threads escomptés), avec des résultats similaires (même si points dans le code).

Est-ce que quelqu’un a un aperçu des correctifs / étapes possibles que je pourrais essayer et / ou ai réussi à parcourir le code natif sans problème?

Merci beaucoup


Edit: Cela n’a jamais été vraiment résolu, mais pour ceux qui veulent consulter mon guide pour le débogage NDK, vous pouvez le trouver ici .

Edit 2: Les réponses à cette question sont venues une fois que les nouvelles versions du NDK sont sorties et que cette question est peut-être désormais redondante. Mon guide peut encore fonctionner, mais je n’utilise pas le NDK depuis un moment, je ne peux donc pas garantir sa validité. J’ai accepté la réponse que j’ai, car tous trois disent fondamentalement la même chose, et c’était le premier à être soumis.

Si cela fonctionne pour armeabi et non 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 dans armeabi et armeabi-v7a sont identiques.

Une chose que j’ai remarquée est que armeabi-v7a ne fonctionne pas bien pour déboguer du code natif sur certains périphériques. Essayez de construire pour seulement armeabi et voyez si cela aide.

comstackr les fichiers source c ++ avec -march = armv4

Dans build / core / combo / arm / yourarch.mk mettez -march = armv4, puis faites les commandes show-mm pour vérifier si elles ont été utilisées.

Alors gdbserver peut le gérer.