2011-01-30 11 views
14

Tengo un segfault pero no tengo ni idea de cómo localizarlo.¿Cómo puedo depurar con eficacia el código C que está envuelto con JNI en Eclipse? (Android Dev)

¿Consejos? enter image description here

+0

Intenté seguir este http://stackoverflow.com/questions/3902066/how-to-call-java-methods-from-c- in-jni/3902495#3902495 pero estoy segfaulting incluso antes de obtener un posibilidad de hacer una llamada a logcat:/ –

+0

Las variables privadas no se pueden pasar a la función nativa. D'oh. –

+0

Manera fácil y no tan rápida: intente aislar las llamadas en su capa nativa paso a paso y verifique qué llamada está fallando. Además, vale la pena intentarlo es: /docs/NDK-GDB.HTML - describe cómo usar el depurador de código nativo – TheCottonSilk

Respuesta

10

Puede obtener la ubicación de la función C que causó el bloqueo usando el Android NDK Stacktrace Analyzer.

Los pasos están en the wiki, pero básicamente necesita obtener el seguimiento de pila de logcat en un archivo (adb logcat > mycrash.log), luego volcar su biblioteca a un archivo de texto, luego ejecutar el programa en los dos. Aquí está el script que utilizo para hacer el lote:

#!/bin/sh 
if test $# -lt 2 ; then 
    echo "Extract readable stack trace from Android logcat crash" 
    echo "Usage $0 lib.so crash.log" 
    exit 1 
fi 
of=$(mktemp) 
echo "Disassemble $1" 
~/tools/android-ndk-r5/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-objdump -S $1 > $of 
echo "Parse stack trace in $2" 
~/bin/parse_stack.py $of $2 

Cambiar las rutas de acceso al Android NDK y archivo parse_stack.py como sea necesario.

+0

Así que me complace finalmente encontrar algo como esto. Estaba cansado de ir a través del gremio de gdbserver solo para obtener un rastro de segfault. –

+0

Acabo de enviar un parche al proyecto que muestra el segmento de código donde también se produjo el bloqueo: http://code.google.com/p/android-ndk-stacktrace-analyzer/issues/detail?id=1 –

+0

Son ¿Me sigues, Jason LeBrun? Jaja. Gracias richq. Eso es genial. –

6

Cómo Efectivamente depuración Android JNI código C/C++ en Eclipse:

  1. de configuración que su proyecto sea un mixto de Java, C y C++ proyecto:

    http://mhandroid.wordpress.com/2011/01/23/using-eclipse-for-android-cc-development/

  2. Configuración su proyecto para habilitar la depuración:

    http://mhandroid.wordpress.com/2011/01/23/using-eclipse-for-android-cc-debugging/#more-23

Nota: El autor del sitio utilizó Eclipse (Galileo) en Ubuntu. Encontré algunas diferencias cuando usando Eclipse (Helios) en MacOS (especialmente con la configuración de depuración). Una vez que se configuran las cosas, Eclipse funciona muy bien como un IDE para el desarrollo de JNI.

+4

Bien, ¿pueden hacer eso más difícil de configurar? Todavía no puedo hacer que funcione para la depuración. – JPM

Cuestiones relacionadas