SIGILL en el código Android NDK
Tengo una aplicación NDK en el mercado y obtuvo un informe de falla nativa sobre una señal SIGILL
. (Yo uso google breakpad para generar informes de fallos nativos.) Aquí están los detalles:
- Mi aplicación se compila para
armeabi-v7a
, con soporte NEON. - Se estrelló en un procesador NVIDIA Tegra 2, que es ARM-7 (Cortex-A9).
- Sucede cada vez. (Contacto con el usuario)
- La dirección del accidente estaba en
0x399cc
, la señal eraSIGILL
, y está en mi código.
Registros y desmontaje:
- ¿Cómo incluir correctamente una biblioteca estática pre-construida en el archivo Android.mk de Android NDK?
- Casting un tipo largo de C ++ a un jlong de JNI
- Android.mk: Extensiones de archivo fuente no soportadas para archivos C
- Zero-copia de procesamiento de la cámara y la prestación de tuberías en Android
- No se puede emitir desde el tipo de origen al tipo de destino (JNIEnv.GetArray <Java.Lang.Object> (pudis.Handle);)
r4 = 0x001d50f0 r5 = 0x001d50f0 r6 = 0x598e2a3c r7 = 0x00000000 r8 = 0x00000001 r9 = 0x001c22b0 r10 = 0x00000000 fp = 0x81216264 sp = 0x598e2a18 lr = 0x816399cb pc = 0x816399cc 0x000399c6 <_ZN8Analyzer15setExpAvgFactorEi+22>: blx 0x30508 0x000399ca <_ZN8Analyzer15setExpAvgFactorEi+26>: fconstd d16, #7 0x000399ce <_ZN8Analyzer15setExpAvgFactorEi+30>: vldr d17, [pc, #32] ; 0x399f2 <_ZN8Analyzer15setExpAvgFactorEi+66>
Fuente completa y ensamblador disponible aquí (es corto, básicamente 2 líneas de C ++.)
Puede ver que 0x399cc
está en el centro de la instrucción fconstd
. De acuerdo con arm.com esta instrucción se añadió en VFP-v3
, que debería (creo) estar disponible en cualquier procesador moderno.
¿Qué podría estar pasando? ¿El hecho de que la dirección está en el centro de una instrucción apunta a un puntero corrupto en alguna parte? (Tenga en cuenta que el backtrace tiene sentido, por lo que no es como si esta función fuera de alguna manera llamada accidente). ¿O es algo más?
- ¿Cómo puedo agregar un archivo a un proyecto de Android y luego cargarlo usando el NDK
- Cómo inflar una vista en expansión con una vista de relación de aspecto fija
- Detección del navegador Android Phone
- Qt - Compilation for Linux no es compilación para Android? ¿Por qué?
- Llamar a un método java desde c ++ en Android
- Errores en la compilación NDK
- Confusión entre OPEN GL ES y EGL library
- ¿Puedo crear aplicaciones de Windows Phone usando java?
Ok, lo tengo: el NVIDIA Tegra 2 sólo tiene 16 registros de GPU de 64 bits, y por lo tanto, para -mfpu=vfpv3-d16
debe compilar con -mfpu=vfpv3-d16
. La instrucción en cuestión utiliza el registro d16
, que es "demasiados". 🙁
Aquí está una referencia a un foro de NVIDIA donde un empleado menciona esta limitación: http://developer.nvidia.com/tegra/forum/optimal-performance-guidelines
Trate de poner * .so en una carpeta llamada 'externallibs' y usarlo para construir por ndk-build, después de copiar y pegar * .so en la carpeta armeabi-v7a. Me ayuda. Otra solución es quitar el Neon Support si es posible
- Phonegap ejecutar android no funciona y no hay mensaje de error
- Android 4: no se puede descartar la notificación de swiping