2013-04-11 6 views
2

J'essaie de déboguer ma bibliothèque native depuis un certain temps maintenant et cela ne fonctionnera tout simplement pas. Le code natif fonctionne et se compile mais à des fins d'optimisation, il me faudrait vraiment déboguer le code natif.Débogage Android NDK: le périphérique ne peut pas être ouvert

J'ai lu et suivi de nombreux tutoriels (par exemple tutorial1, tutorial2) étape par étape, mais je reçois des erreurs pour lesquelles je ne trouve pas de solution.

J'ai configuré la configuration de débogage Android et C++ et après avoir débogué avec la configuration de débogage Android, il atteint le point d'arrêt après le chargement de la bibliothèque (un seul). Je vais à cygwin et voir si mon appareil est détecté (ce qu'il est). Ensuite, exécutez:

$ ndk-gdb --start --verbose 

Ce qui me donne le résultat suivant:

Android NDK installation path: /cygdrive/c/Android/android-ndk/android-ndk-r8 
Using default adb command: /cygdrive/c/Android/android-sdk/platform-tools/adb 
ADB version found: Android Debug Bridge version 1.0.29 
Using ADB flags: 
Using auto-detected project path: . 
Found package name: com.mypackage 
ABIs targetted by application: armeabi-v7a 
Device API Level: 15 
Device CPU ABIs: armeabi-v7a armeabi 
Compatible device ABI: armeabi-v7a 
Using gdb setup init: ./libs/armeabi-v7a/gdb.setup 
Using toolchain prefix: /cygdrive/c/Android/android-ndk/android-ndk-r8/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/arm-linux-androideabi- 
Using app out directory: ./obj/local/armeabi-v7a 
Found debuggable flag: true 
Found device gdbserver: /data/data/com.mypackage/lib/gdbserver 
Found data directory: '/data/data/com.mypackage' 
Found first launchable activity: .MainActivity 
Launching activity: com.mypackage/.MainActivity 
## COMMAND: /cygdrive/c/Android/android-sdk/platform-tools/adb shell am start -n com.mypackage/.MainActivity 
Starting: Intent { cmp=com.mypackage/.MainActivity } 
## COMMAND: /cygdrive/c/Android/android-sdk/platform-tools/adb shell sleep 2 
Found running PID: 6907 
Launched gdbserver succesfully. 
Setup network redirection 
## COMMAND: /cygdrive/c/Android/android-sdk/platform-tools/adb shell run-as com.mypackage lib/gdbserver +debug-socket --attach 6907 
## COMMAND: /cygdrive/c/Android/android-sdk/platform-tools/adb forward tcp:5039 localfilesystem:/data/data/com.mypackage/debug-socket 
Attached; pid = 6907 
Could not open remote device: Invalid argument. 
Detaching process(es): 6907 
## COMMAND: /cygdrive/c/Android/android-sdk/platform-tools/adb pull /system/bin/app_process obj/local/armeabi-v7a/app_process 
2405 KB/s (9852 bytes in 0.004s) 
Pulled app_process from device/emulator. 
## COMMAND: /cygdrive/c/Android/android-sdk/platform-tools/adb pull /system/lib/libc.so obj/local/armeabi-v7a/libc.so 
4994 KB/s (286412 bytes in 0.056s) 
Pulled libc.so from device/emulator. 

[email protected] /cygdrive/c/Development/MyAppAndroid/trunk/MyApp 
$ 

je peux voir que le gdbserver a été lancé avec succès, ce qui est bon, mais je ne sais pas pourquoi cela se produit:

Could not open remote device: Invalid argument 

car adb peut se connecter au périphérique (comme testé auparavant). Après cela, il me semble (je ne suis pas trop familier avec cygwin) que gdb ferme juste tout et que ça ferait échouer aussi le débogage C++ en eclipse. Lorsque je l'exécute, l'erreur suivante:

76-target-select remote localhost:5039 
&"Remote communication error: Bad file descriptor.\n" 
Remote communication error: Bad file descriptor. 
76^error,msg="Remote communication error: Bad file descriptor." 

Y at-il quelque chose qui pourrait empêcher mon périphérique d'être détecté par l'adb? J'utilise cet appareil pour tester (sans débogage C++) tout le temps sans problème.

Ou le problème réside-t-il dans l'erreur de port?

+0

J'utilise la méthode dans votre lien et il fonctionne très bien (modifié pour armeabi-V7A) "tutoriel 1". J'ai remarqué que vous appelez ndk-gdb et non ndk-gdb-eclipse et que vous utilisez gdp.setup au lieu de gdb2.setup. Je suppose que vous avez abandonné la méthode dans le tutoriel? Quelle partie ne fonctionnait pas pour vous? – foo64

+0

J'ai juste copié ndk-gdb et l'ai nommé ndk-gdb-original et utilisé le nom tel qu'il était pour mon nouveau fichier. même chose avec gdb.setup. Je soupçonnais ces changements de causer un problème mais ce n'était pas ça. donc ive a suivi toutes les étapes comme dans les tutoriels. La partie qui ne fonctionne pas est ** Impossible d'ouvrir le périphérique distant: Argument invalide ** et je ne sais pas pourquoi il ne se connecte pas car avant d'exécuter ndk-gdb je peux détecter le périphérique avec _adb devices_ – user1937376

Répondre

3

J'ai eu même problème donc je remplacer les lignes suivantes dans le fichier NDK-gdb:

Original:

run adb_cmd shell run-as $PACKAGE_NAME lib/gdbserver +$DEBUG_SOCKET --attach $PID & 

REMPLACÉ:

run adb_cmd shell run-as $PACKAGE_NAME lib/gdbserver tcp:5888 --attach $PID & 

Original:

run adb_cmd forward tcp:$DEBUG_PORT localfilesystem:$DATA_DIR/$DEBUG_SOCKET 

Remplacé:

run adb_cmd forward tcp:5039 tcp:5888 

corrigé le problème "Argument invalide".

P.

+0

Après avoir martelé la tête contre le écran pendant des semaines, cette solution a travaillé avec une autre suggestion pour changer awk to gawk dans le script ndk-gdb.Merci à vous deux pour votre aide. – user330844

Questions connexes