web-dev-qa-db-fra.com

Comment faire fonctionner ndk-gdb sur Android?

J'essaie de faire fonctionner le débogueur NDK mais sans succès jusqu'à présent.

Pour m'assurer que mes symboles de débogage sont présents et valides, j'utilise les options du compilateur -O0 et -g, et le paramètre ndk-build NDK_DEBUG = 1.

Le script ndk-gdb s'exécute sans problème et lance GDB. Quand je fais une commande "sharedlibrary", j'obtiens ceci:

Symbols already loaded for /bla/bla/libMySharedLib.so

Cependant, lorsque j'essaie de casser l'exécution ou par exemple en ajoutant un segfault à tester, je n'obtiens aucun des symboles de cette bibliothèque dans la pile des appels. Les seuls symboles que j'ai obtenus proviennent de libc, si je romps l'exécution en attendant un mutex par exemple. A également essayé d'ajouter des points d'arrêt sans succès. GDB me permet d'ajouter les points d'arrêt et le code fonctionne correctement, mais les points d'arrêt ne sont jamais déclenchés.

J'utilise l'API niveau 8 car j'ai besoin de prendre en charge Android 2.2 (Froyo).

36
Simplex

Vous n'avez pas besoin d'utiliser les commutateurs -O0 ou -g. Vous devez effectuer l'une des opérations suivantes:

  1. mettre Android:debuggable="true" à la <application> faire AndroidManifest.xml fichier
  2. utilisation NDK_DEBUG=1 après ndk-build
  3. mettre APP_OPTIM := debug dans le fichier Application.mk

Faire n'importe laquelle de ces trois choses utilisera automatiquement les commutateurs -O0 et -g.

Pouvez-vous essayer d'exécuter gdb manuellement, sans script gdb? Cela implique les étapes suivantes:

  1. en poussant le fichier gdbserver vers /data/local dossier sur l'appareil
  2. exécution de votre application en appelant dans adb Shell commande suivante gdbserver :5055 --attach PID, où PID est l'ID de votre processus de demande.
  3. fonctionnement adb forward tcp:5055 tcp:5055 sur l'hôte
  4. fonctionnement arm-linux-androideabi-gdb.exe depuis le dossier de votre application
  5. saisie des commandes suivantes dans gdb
  6. set solib-search-path obj/local/armeabi
  7. file obj/local/armeabi/libMySharedLib.so
  8. target remote :5055

Et voyez si vous pouvez déboguer alors.

Si vous voulez voir les symboles des autres bibliothèques partagées que votre bibliothèque utilise comme libc.so, puis retirez-les de l'appareil (de /system/lib dossier) dans votre obj/local/armeabi dossier.

66