web-dev-qa-db-fra.com

Comment utiliser addr2line dans Android

Je suis coincé avec mon application, car je suis incapable de déboguer car il s'agit d'une application multithread et se bloque avec l'erreur SIGSEGV. Je reçois beaucoup d'informations de LogCat, qui me donne des adresses dans ma bibliothèque native. Ce serait utile si je pouvais convertir ces adresses dans mon code.

Quelqu'un a-t-il une idée de l'utilisation de addr2line, fourni avec Android-ndk?

73
Anil Arrabole

Supposons que logcat vous montre le journal des incidents suivant (celui-ci provient d'un de mes projets):

I/DEBUG   (   31): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG   (   31): Build fingerprint: 'generic/sdk/generic:2.3/GRH55/79397:eng/test-keys'
I/DEBUG   (   31): pid: 378, tid: 386  >>> com.example.gltest <<<
I/DEBUG   (   31): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000
I/DEBUG   (   31):  r0 001dbdc0  r1 00000001  r2 00000000  r3 00000000
I/DEBUG   (   31):  r4 00000000  r5 40a40000  r6 4051a480  r7 42ddbee8
I/DEBUG   (   31):  r8 43661b24  r9 42ddbed0  10 42ddbebc  fp 41e462d8
I/DEBUG   (   31):  ip 00000001  sp 436619d0  lr 83a12f5d  pc 8383deb4  cpsr 20000010
I/DEBUG   (   31):          #00  pc 0003deb4  /data/data/com.example.gltest/lib/libnativemaprender.so
I/DEBUG   (   31):          #01  pc 00039b76  /data/data/com.example.gltest/lib/libnativemaprender.so
I/DEBUG   (   31):          #02  pc 00017d34  /system/lib/libdvm.so

Regardez les 3 dernières lignes. ceci est votre pile d'appel. 'pc' est le compteur de programme, et le pc du cadre de pile # 00 vous donne l'adresse où le crash est survenu. C'est le numéro à passer à addr2line.

J'utilise NDK r5, donc l'exécutable que j'utilise est situé à l'adresse $NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin; assurez-vous que c'est dans votre $PATH. La commande à utiliser ressemble à

arm-linux-androideabi-addr2line -C -f -e obj/local/armeabi/libXXX.so <address>

Ou, pour le cas ci-dessus:

arm-linux-androideabi-addr2line -C -f -e obj/local/armeabi/libnativemaprender.so 0003deb4

Ce qui vous donne l'emplacement de l'accident.

Remarque:

  • Le drapeau -C consiste à démêler le code C++
  • Utilisez le fichier .so sous obj/local/armeabi, puisqu'il s'agit de la version non supprimée.

En outre, lorsque vous utilisez NDK r5 avec un AVD 2.3, il est en fait possible de déboguer du code multithread.

160
svdree

Il existe un moyen plus facile de faire cela maintenant (ndk-r7). Découvrez la commande ndk-stack. Les documents sont dans you_Android_ndk_path/docs/NDK-STACK.html

48
Byron