web-dev-qa-db-fra.com

Comment obtenir des points d'arrêt dans le code natif NDK et déboguer du code natif dans Android Studio?

Je développe une application Android à l'aide de NDK. J'ai deux projets. L'un est pour ma bibliothèque native qui utilise NDK et génère un fichier .so.

J'utilise Android Studio mais je désactive la construction automatique et la construction activée à l'aide de ndk-build. J'utilise Windows 7. 

Maintenant, après avoir généré le fichier .so, je les copie dans mon projet d'application principal qui utilise également ndk-build pour compiler les fonctions JNI dans lesquelles j'appelle les fonctions de ma bibliothèque. J'espère que je suis propre jusqu'à ce point. Sinon, je donnerai plus de détails sur demande. 

Maintenant, j'exécute mon application dans un appareil utilisant Android Studio et je peux mettre un point d'arrêt dans le code Java et le déboguer, mais je ne suis pas en mesure de déboguer les appels JNI et le code natif que j'ai dans un projet séparé. J'ai besoin de déboguer à l'intérieur de mon code de bibliothèque. Alors, y a-t-il un moyen d'y parvenir?

J'ai vu VisualGDB mais c'est payé. Alors laissez-moi savoir s'il existe une alternative pour remplir pleinement mes exigences de débogage. J'ai cherché beaucoup mais n'ai pas trouvé de solution concrète.

Je peux voir une option dans Android Studio pour la connexion au processus Android où je peux voir mon périphérique en cours d'exécution, mais je ne sais pas comment l'utiliser pour pouvoir déboguer par le code de la bibliothèque native (qui est dans un projet séparé sans aucune activité). 

Faites-moi savoir si plus de détails sont requis

19
Premal

Dans Android Studio 2.0, le processus est un peu différent (plus simple, je pense):

  1. Installez "LLDB" : Allez dans Outils-> Android-> Gestionnaire de SDK, puis allez dans l'onglet "Outils de SDK" et assurez-vous de cocher "LLDB" (généralement près de la fin de la liste)
  2. Sélectionnez une/la variante "Debug" : Dans le coin inférieur gauche de AS, cliquez sur "Build Variants", la variante de débogage par défaut s'appelle "Debug".
  3. Sélectionnez une configuration native : côté gauche du bouton Exécuter (triangle vert), la configuration native par défaut s'appelle "app-native".
  4. Définir un point d'arrêt
  5. Lancez votre application en mode débogage en cliquant sur le petit bogue situé à droite du bouton Exécuter.

Si cela ne fonctionne pas, vérifiez que votre configuration native a le type de débogage "Hybrid" selected: à droite du bouton de lecture, cliquez sur le petit triangle, sélectionnez "Edit Configurations", sélectionnez votre "app-native" configuration, allez dans l'onglet "Débogueur" et sélectionnez "Type de débogage: Hybride".

10
Sistr

Android Studio 1.3+ prend en charge le débogage natif.

Pour le configurer, procédez comme suit:

  1. Modifiez votre fichier gradle-wrapper.properties, local.properties et les deux fichiers build.gradle, comme indiqué dans ce guide .
  2. Graduation de synchronisation
  3. Créez et sélectionnez une nouvelle configuration de construction:

    Cliquez sur le menu déroulant à côté du bouton Exécuter) -> Modifier les configurations, cliquez sur le signe plus, choisissez Android Native, indiquez les options à droite (j'ai utilisé LLDB dans l'onglet du débogueur natif), et vous devriez être défini.

  4. Définir des points d'arrêt en C++

  5. Appuyez sur le bouton de débogage et soyez patient (le débogueur prend parfois un certain temps)

J'ai pu déboguer du code natif sous Lubuntu 14.04 avec Android Studio 1.3 (canal stable). Bien que d'autres aient soi-disant réussi sous Windows, je n'ai pas été en mesure de déboguer de manière native sous Windows 8.1 (j'ai essayé avec Android Studio 1.3, 1.3.2 et 1.4 preview 3).

Mise à jour Android Studio 1.4 Beta vient de sortir. Je l'ai testé et j'ai pu déboguer nativement sous Windows 8.1.

4
Nate

J'ai pu définir des points d'arrêt et entrer dans le code natif, mais uniquement lorsque toutes les conditions suivantes étaient remplies:

  1. Les fichiers .so de la bibliothèque native générés ont conservé leurs symboles de débogage
  2. Les sources ont été fournies (voir le menu "Propriétés de la bibliothèque")
  3. Je règle la configuration run/build pour utiliser un débogueur natif (comme décrit ici )

Cela fonctionne pour moi en ce moment dans Android Studio 1.5, en utilisant le Gradle Experimental Plugin

2
Jeff Trull

Un autre point de contrôle si les points d'arrêt dans les codes natifs ne fonctionnent pas:

  • supprimez la ligne Android:extractNativeLibs="false" ou donnez-lui la valeur true dans AndroidManifest.xml

extractNativeLibs="false" provoque 1 ou 2, occasionnellement.

  1. L'installation échouera avec le message "INSTALL_FAILED_INVALID_APK"
  2. Les points d'arrêt dans les codes natifs ne fonctionnent pas
1
Toris

Si votre point d'arrêt natif ne peut toujours pas être touché après avoir tout essayé ET que, par hasard, votre bibliothèque native ait été référencée sur plusieurs projets AS, il existe une solution simple.

Il suffit de renommer votre bibliothèque native dans setting.gradle et votre build.gradle

Avant:

//in setting.gradle
include ":myNativeLib"
project(":myNativeLib").projectDir = new File("...")
//in app's build.gradle
api project(':myNativeLib')

Après:

//in setting.gradle
include ":myNativeLib2"
project(":myNativeLib2").projectDir = new File("...")
//in app's build.gradle
api project(':myNativeLib2')
0
wdanxna