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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top