web-dev-qa-db-fra.com

Débogage d'applications natives NDK Android

J'essaie de déboguer et de passer en revue une application Android segfaults. J'ai essayé ndk-gdb, mais avec peu de chance. J'ai également fait référence à Débogage NDK Android sans pouvoir déboguer mon application.

Quand j'essaie ndk-gdb --start, et j'obtiens:

$ ndk-gdb --start --verbose
Android NDK installation path: /opt/Android-ndk-r7
Using default adb command: /opt/Android-sdk-linux/platform-tools/adb
ADB version found: Android Debug Bridge version 1.0.29
Using final ADB command: '/opt/Android-sdk-linux/platform-tools/adb'
Using auto-detected project path: .
Found package name: com.example.native_plasma
ABIs targetted by application: armeabi armeabi-v7a
Device API Level: 10
Device CPU ABIs: armeabi-v7a armeabi
Compatible device ABI: armeabi-v7a
Found debuggable flag: true
Found device gdbserver: /data/data/com.example.native_plasma/lib/gdbserver
Using gdb setup init: ./libs/armeabi-v7a/gdb.setup
Using toolchain prefix: /opt/Android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-
Using app out directory: ./obj/local/armeabi-v7a
Found data directory: '/data/data/com.example.native_plasma'
Found first launchable activity: Android.app.NativeActivity
Launching activity: com.example.native_plasma/Android.app.NativeActivity
## COMMAND: /opt/Android-sdk-linux/platform-tools/adb Shell am start -n com.example.native_plasma/Android.app.NativeActivity
Starting: Intent { cmp=com.example.native_plasma/Android.app.NativeActivity }
## COMMAND: /opt/Android-sdk-linux/platform-tools/adb Shell sleep 2
Found running PID: 0
ERROR: Could not extract PID of application on device/emulator.
       Weird, this probably means one of these:

         - The installed package does not match your current manifest.
         - The application process was terminated.

       Try using the --verbose option and look at its output for details.

Cela indique que l'application segfault plus plus moins, mais je ne sais pas comment définir un point d'arrêt ici car gdb ne donne jamais réellement une invite.

J'ai aussi essayé cette commande:

$ ../../toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-addr2line -f -e  libs/armeabi/libnative-plasma.so 
bedb2330
??
??:0

J'ai des symboles de débogage je crois.

  • ndk-build -B V=1 APP_OPTIM=debug
  • Android.mk dans jni/ a LOCAL_CFLAGS := -g
  • ant debug

J'ai aussi ndk-build NDK_DEBUG=1 mais j'arrive toujours là où il semble que je n'ai pas de symboles de débogage.

Voici une image de la trace de la pile. Cela ne devient pas plus informatif:

Traceback

15
Scott

Eh bien, NDK_DEBUG = 1 et l’indicateur debuggable du manifeste défini sur true sont requis. Lorsque vous créez l'application, dans votre projet/libs/armeabi, il devrait y avoir un fichier gdb.setup. Il y a un chemin de recherche de symbole à cet endroit, vérifiez s'il est valide. Et avez-vous essayé ceci: 

ndk-gdb --start --verbose --force

Et on dirait que vous obtenez une exception de pointeur nul.

11
realrocker

Dans les dernières versions de NDK et du plug-in Eclipse, vous pouvez cliquer avec le bouton droit de la souris sur le paquet et choisir Déboguer en tant que -> Application native Android

7
shul

Assurez-vous de charger votre bibliothèque native dans une activité pouvant être lancée ou dans votre classe Application. Sinon, cela ne fonctionnerait pas et vous obtiendrez l'erreur suivante No symbol table is loaded. Use the "file" command..

Par exemple dans la classe d'application:

import Android.app.Application;

public class MyApp extends Application {

    static {
        System.loadLibrary("Name");
    }

    public static native int doSomething();
}

Nom est le nom de votre bibliothèque (fichier .so) sans la partie lib.

1
DeathlessHorsie

J'ai résolu de mettre --nowait option à la commande Shell:

ndk-gdb --start --verbose --nowait
0
Bemipefe