trazar - ¿Cómo funciona ndk-gdb en Android?
wikiloc (1)
Intento que funcione el depurador NDK pero hasta ahora no ha tenido éxito.
Para asegurarme de que mis símbolos de depuración están presentes y son válidos, utilizo las opciones de compilación -O0 y -g, y el parámetro ndk_DEBUG = 1 de ndk-build.
La secuencia de comandos ndk-gdb se ejecuta sin problemas y ejecuta GDB. Cuando hago un comando "sharedlibrary", obtengo esto:
Symbols already loaded for /bla/bla/libMySharedLib.so
Sin embargo, cuando intento interrumpir la ejecución o, por ejemplo, agregar una segfault para probar, nunca obtengo ninguno de los símbolos de esa biblioteca en la pila de llamadas. Los únicos símbolos que he obtenido son de libc, si rompo la ejecución mientras está esperando un mutex, por ejemplo. También intenté agregar puntos de interrupción sin suerte. GDB me permite agregar los puntos de interrupción, y el código funciona bien, pero los puntos de interrupción nunca se disparan.
Estoy usando API nivel 8 ya que necesito para soportar Android 2.2 (Froyo).
No necesita usar los modificadores -O0 o -g. Necesitas hacer uno de los siguientes:
- ponga
android:debuggable="true"
en la etiqueta<application>
en el archivoAndroidManifest.xml
- use
NDK_DEBUG=1
después de ndk-build - poner
APP_OPTIM := debug
en el archivo Application.mk
Al hacer cualquiera de estas tres cosas, se usarán automáticamente los interruptores -O0 y -g.
¿Puedes intentar ejecutar gdb manualmente, sin script gdb? Implica los siguientes pasos:
- empujar el archivo
gdbserver
carpeta/data/local
en el dispositivo - ejecutar su aplicación e invocar en
adb shell
siguiendo el comandogdbserver :5055 --attach PID
, donde PID es su ID de proceso de la aplicación. - ejecutando
adb forward tcp:5055 tcp:5055
en el host - ejecutando
arm-linux-androideabi-gdb.exe
desde su carpeta de aplicaciones - ingresando los siguientes comandos en gdb
-
set solib-search-path obj/local/armeabi
-
file obj/local/armeabi/libMySharedLib.so
-
target remote :5055
Y mira si puedes depurar entonces.
Si desea ver símbolos para otras bibliotecas compartidas que su biblioteca utiliza como libc.so
, extráigalas del dispositivo (desde /system/lib
folder) a su carpeta obj/local/armeabi
.