Comment utiliser addr2line dans Android

Je suis coincé avec mon application, car je suis incapable de déboguer car c’est un multithread et se bloque avec l’erreur SIGSEGV. Je reçois beaucoup d’informations de LogCat, qui me donnent des adresses dans ma bibliothèque native. Il serait utile que je puisse convertir ces adresses dans mon code.

Est-ce que quelqu’un a une idée de comment utiliser addr2line, fourni avec android-ndk?

Disons que logcat vous montre le journal des pannes suivant (ceci est de l’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. c'est votre stack d'appel. 'pc' est le compteur de programme et le PC pour le frame de stack # 00 vous donne l'adresse où le crash s'est produit. C'est le numéro à passer à addr2line.

J'utilise NDK r5, donc l'exécutable que j'utilise est situé à $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 

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:

  • L'indicateur -C est de démangle le code C ++
  • Utilisez le fichier .so sous obj / local / armeabi, puisqu'il s'agit de la version non dépouillée

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

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