Cómo utilizar addr2line en Android
-
24-10-2019 - |
Pregunta
Estoy atascado con mi aplicación, como soy incapaz de depurar, ya que es una multiproceso uno y se bloquea con el error SIGSEGV.Puedo obtener mucha información de LogCat, lo que me da direcciones en mi biblioteca nativa.Sería de gran ayuda si me pudieran convertir estas direcciones en mi código.
¿Alguien tiene alguna idea de cómo utilizar addr2line, que se proporciona con android-ndk?
Solución
Digamos que logcat mostrará la siguiente registro de bloqueo (esto 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 los últimos 3 líneas;esta es su pila de llamadas.'pc' es el contador de programa, y el equipo de marco de pila #00 le da la dirección donde ocurrió el accidente.Este es el número para pasar a addr2line.
Estoy usando el NDK r5, por lo que el ejecutable que estoy usando está situado en la $NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin
;asegúrese de que está en su $PATH
.El comando a utilizar se parece a
arm-linux-androideabi-addr2line -C -f -e obj/local/armeabi/libXXX.so <address>
O, para el caso anterior:
arm-linux-androideabi-addr2line -C -f -e obj/local/armeabi/libnativemaprender.so 0003deb4
Que le da la ubicación del accidente.
Nota:
- La opción-C es para demangle código C++
- El uso de la .así que el archivo bajo obj/local/armeabi, ya que esta es la no versión reducida
También, cuando se utiliza NDK r5 con un 2.3 AVD, en realidad, es posible depurar código multiproceso.
Otros consejos
Hay una manera más fácil de hacer esto ahora (NDK-R7). Echa un vistazo al comando NDK-Stack. Los documentos están en You_Android_NDK_Path/Docs/Ndk Stack.html