Question

Je suis coincé avec mon application, je suis incapable de debug car il est un multithread et tombe en panne avec SIGSEGV d'erreur. Je reçois beaucoup d'informations de LogCat, qui me donne des adresses dans ma bibliothèque native. Il serait utile si je pouvais convertir ces adresses dans mon code.

Est-ce que quelqu'un a une idée comment utiliser addr2line, qui est fourni avec Android NDK?

Était-ce utile?

La solution

Le mot Let que logcat vous montrer le journal accident suivant (ce qui est 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 callstack. « Pc » est le compteur de programme, et le PC pour le cadre de pile # 00 vous donne l'adresse où l'accident est survenu. Ceci est le nombre de passer à addr2line.

J'utilise NDK r5, de sorte que l'exécutable j'utilise est situé à $NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin; assurez-vous que dans votre $PATH. La commande de regards d'utilisation comme

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.

Note:

  • Le drapeau C est le code C ++ demangle
  • Utilisez le sous fichier .so obj / local / armeabi, puisque c'est la Version non dénudée

En outre, lors de l'utilisation NDK r5 avec un 2.3 AVD, il est effectivement possible de déboguer le code multithread.

Autres conseils

Il y a un moyen plus facile de le faire maintenant (NDK-r7). Consultez la commande NDK-pile. Les documents sont en you_android_ndk_path / docs / NDK-STACK.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top