2012-01-19 9 views
15

Sto provando a eseguire il debug e passare attraverso un'applicazione Android che segfaults. Ho provato ndk-gdb, ma con un po 'di fortuna. Ho anche fatto riferimento a Android NDK Debugging senza poter eseguire il debug della mia app.Debug di app native NDK per Android

Quando provo ndk-gdb --start, e ottengo:

$ 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. 

Ciò indica che l'applicazione segfaulted altro meno, ma non so come impostare un punto di interruzione qui dal gdb mai realmente dà un prompt.

Ho provato anche questo comando:

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

ho simboli di debug credo.

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

ho anche ndk-build NDK_DEBUG=1 ma ho ancora arrivare dove sembra che non ho simboli di debug.

Ecco un'immagine della traccia dello stack. Non c'è niente di più informativo:

Traceback

+0

non so se vi aiuterà, ma se siete in cerca di un po 'di documentazione (è fuori moda, mente , come si parla di NDK r5b), poi ho scritto una guida alcuni mesi fa che puoi trovare [qui] (http://www.doc.ic.ac.uk/~cb908/AndroidNDK.html).Temo di non poter offrire ulteriori informazioni sul problema, tranne il fatto di controllare che il nome del pacchetto emesso in quel log sia lo stesso di manifest (ma immagino lo sia, dato che ha trovato la directory dei dati e altro) –

+0

Grazie. Sembra che tu abbia usato Eclipse. Sto usando le righe di comando. Spero di non dover usare Eclipse. : \ – Scott

+0

Ah, sì, non ci ho pensato. I principi dovrebbero essere gli stessi - per quanto ne so Eclipse mostra solo l'output gdb e dà a gdb i comandi corretti (ad esempio quando fai clic sul pulsante del passaggio) - quindi no, non devi usarlo. Potresti provare a disattivare le ottimizzazioni in "LOCAL_CFLAGS" (-O0 penso), ma dubito che farà molto. Quanto è lontana nell'app il tuo primo breakpoint? –

risposta

11

Bene NDK_DEBUG = 1 e bandiera debuggable nel set manifesta true sono obbligatori. Quando costruisci l'app, nel tuo progetto/libs/armeabi, dovrebbe esserci un file gdb.setup. C'è un percorso di ricerca dei simboli lì, controlla se è valido. E avete provato questo:

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

e si presenta come hai trovato un'eccezione di puntatore nullo.

+0

dopo aver trascorso quasi la metà del bel giorno soleggiato di San Francisco, ho finalmente trovato la tua risposta e voilà, i miei breakpoint sono stati colpiti da juno dopo aver iniziato a gdb come da te prescritto. Molte molte grazie!! – Viren

7

Nelle ultime versioni di NDK ed Eclipse plug-in è possibile fare clic destro sul pacchetto e scegliere Debug come ->Android Native Application

1

Assicurarsi che si carica la libreria nativa sia un'attività launchable o nella tua classe di applicazione. Altrimenti non funzionerebbe e riceverai il seguente errore No symbol table is loaded. Use the "file" command..

Per esempio in classe di applicazione:

import android.app.Application; 

public class MyApp extends Application { 

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

    public static native int doSomething(); 
} 

Name è il nome della libreria (.so file) senza la parte lib.

+0

Grazie mille, lo ha fatto dopo 4 ore! – marcus

0

ho risolto mettendo --nowait opzione al comando shell:

ndk-gdb --start --verbose --nowait