android android-ndk shared-libraries native-code addr2line

Cómo usar addr2line en Android



android-ndk shared-libraries (2)

Digamos que logcat te muestra el siguiente registro de bloqueo (este es de uno de mis proyectos):

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

Mira las últimas 3 líneas; esta es tu lista de llamadas. ''pc'' es el contador del programa, y ​​la pc para el stack frame # 00 le proporciona la dirección donde ocurrió el bloqueo. Este es el número para pasar a addr2line.

Estoy usando NDK r5, por lo que el ejecutable que estoy utilizando se encuentra en $NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin ; asegúrese de que esté en su $PATH . El comando a usar se ve como

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

O, para el caso de arriba:

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

Lo que le da la ubicación del choque.

Nota:

  • La bandera de C es demangle código de C ++
  • Utilice el archivo .so en obj / local / armeabi, ya que esta es la versión no eliminada

Además, cuando se usa NDK r5 con un 2.3 AVD, en realidad es posible depurar el código multiproceso.

Estoy atascado con mi aplicación, ya que no puedo depurar porque es multiproceso y se bloquea con el error SIGSEGV. Recibo mucha información de LogCat, que me da direcciones en mi biblioteca nativa. Sería útil si pudiera convertir estas direcciones en mi código.

¿Alguien tiene alguna idea de cómo usar addr2line, que se proporciona con android-ndk?


Hay una manera más fácil de hacer esto ahora (ndk-r7). Mira el comando ndk-stack. Los documentos están en you_android_ndk_path / docs / NDK-STACK.html