reiniciar usando libdvm.so recién construido da error fatal

Cambié la estructura de la tabla JIT (pJitEntryTable en /dalvik/vm/Globals.h) de una matriz encadenada (una especie de hash) a una combinación de tabla hash y árbol B. Encuentra el valor hash basado en la PC e ingresa el JitEntry correspondiente (dirección dalvik, dirección traducida) en el árbol b señalado por el índice hash. Desarrollé el código con éxito y presioné el archivo libdvm.so en el emulador y reinicié el emulador matando a zygote. Pero la pantalla de inicio muestra "android" por un tiempo infinito y cuando hice un logcat $adb encontré el siguiente registro

   I/DEBUG   (   33): *** *** *** *** *** *** *** *** *** *** *** *** 
*** *** *** *** 
I/DEBUG   (   33): Build fingerprint: 'generic/sdk/generic:4.0.3/ 
MR1/237985:eng/test-keys' 
I/DEBUG   (   33): pid: 491, tid: 520  >>> system_server <<< 
I/DEBUG   (   33): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault 
addr 002e0080 
I/DEBUG   (   33):  r0 002e0081  r1 4d685228  r2 00000014  r3 002e006d 
I/DEBUG   (   33):  r4 4d685228  r5 51669e38  r6 001de3b8  r7 000086f4 
I/DEBUG   (   33):  r8 407d9dc0  r9 00000002  10 00000000  fp 520a0e68 
I/DEBUG   (   33):  ip 00000030  sp 520a0da0  lr 00000000  pc 
002e0080  cpsr 20000030 
I/DEBUG   (   33):  d0  437000004382353f  d1  3ff0000043700000 
I/DEBUG   (   33):  d2  3ff0000000000000  d3  4197d78400000000 
I/DEBUG   (   33):  d4  3ff0000000000000  d5  4028000000000000 
I/DEBUG   (   33):  d6  43e0000000000000  d7  000000f000000000 
I/DEBUG   (   33):  d8  0000000000000000  d9  0000000000000000 
I/DEBUG   (   33):  d10 0000000000000000  d11 0000000000000000 
I/DEBUG   (   33):  d12 0000000000000000  d13 0000000000000000 
I/DEBUG   (   33):  d14 0000000000000000  d15 0000000000000000 
I/DEBUG   (   33):  scr 80000012 
I/DEBUG   (   33): 
D/dalvikvm(  491): in getCodeAddrCommon function 
D/dalvikvm(  491): searching in the JIT table 
I/DEBUG   (   33):          #00  pc 002e0080 
I/DEBUG   (   33):          #01  lr 00000000  <unknown> 
I/DEBUG   (   33): 
I/DEBUG   (   33): code around pc: 
I/DEBUG   (   33): 002e0060 ffffffff ffffffff ffffffff 
ffffffff  ................ 
I/DEBUG   (   33): 002e0070 ffffffff ffffffff ffffffff 
ffffffff  ................ 
I/DEBUG   (   33): 002e0080 ffffffff ffffffff ffffffff 
ffffffff  ................ 
I/DEBUG   (   33): 002e0090 ffffffff ffffffff ffffffff 
ffffffff  ................ 
I/DEBUG   (   33): 002e00a0 ffffffff ffffffff ffffffff 
ffffffff  ................ 
I/DEBUG   (   33): 
I/DEBUG   (   33): code around lr: 
I/DEBUG   (   33): 00000000 ffffffff ffffffff ffffffff 
ffffffff  ................ 
I/DEBUG   (   33): 00000010 ffffffff ffffffff ffffffff 
ffffffff  ................ 
I/DEBUG   (   33): 00000020 ffffffff ffffffff ffffffff 
ffffffff  ................ 
I/DEBUG   (   33): 00000030 ffffffff ffffffff ffffffff 
ffffffff  ................ 
I/DEBUG   (   33): 00000040 ffffffff ffffffff ffffffff 
ffffffff  ................ 
I/DEBUG   (   33): 
I/DEBUG   (   33): memory map around addr 002e0080: 
I/DEBUG   (   33): 0000b000-00237000 [heap] 
I/DEBUG   (   33): (no map for address) 
I/DEBUG   (   33): 10000000-10001000 
I/DEBUG   (   33): 
I/DEBUG   (   33): stack: 
I/DEBUG   (   33):     520a0d60  4d685228  /system/framework/ 
framework.odex 
I/DEBUG   (   33):     520a0d64  00000000 
I/DEBUG   (   33):     520a0d68  00000000 
I/DEBUG   (   33):     520a0d6c  407d9dc0  /system/lib/libdvm.so 
I/DEBUG   (   33):     520a0d70  00000002 
I/DEBUG   (   33):     520a0d74  00000000 
I/DEBUG   (   33):     520a0d78  520a0e68 
I/DEBUG   (   33):     520a0d7c  4083c78b  /system/lib/libdvm.so 
I/DEBUG   (   33):     520a0d80  4d685228  /system/framework/ 
framework.odex 
I/DEBUG   (   33):     520a0d84  51669e38 
I/DEBUG   (   33):     520a0d88  001de3b8  [heap] 
I/DEBUG   (   33):     520a0d8c  000086f4  /system/bin/app_process 
I/DEBUG   (   33):     520a0d90  407d9dc0  /system/lib/libdvm.so 
I/DEBUG   (   33):     520a0d94  4083c7e5  /system/lib/libdvm.so 
I/DEBUG   (   33):     520a0d98  df0027ad 
I/DEBUG   (   33):     520a0d9c  00000000 
I/DEBUG   (   33): #00 520a0da0  00000000 
I/DEBUG   (   33):     520a0da4  001de3b8  [heap] 
I/DEBUG   (   33):     520a0da8  4086ef90  /system/lib/libdvm.so 
I/DEBUG   (   33):     520a0dac  520a0dd8 
I/DEBUG   (   33):     520a0db0  44e6bb60  /dev/ashmem/dalvik- 
LinearAlloc (deleted) 
I/DEBUG   (   33):     520a0db4  520a0e1c 
I/DEBUG   (   33):     520a0db8  00000000 
I/DEBUG   (   33):     520a0dbc  fffffe60 
I/DEBUG   (   33):     520a0dc0  520a0e68 
I/DEBUG   (   33):     520a0dc4  407ef200  /system/lib/libdvm.so 
I/DEBUG   (   33):     520a0dc8  00000000 
I/DEBUG   (   33):     520a0dcc  00000000 
I/DEBUG   (   33):     520a0dd0  00000000 
I/DEBUG   (   33):     520a0dd4  520a0eb8 
I/DEBUG   (   33):     520a0dd8  00000000 
I/DEBUG   (   33):     520a0ddc  00000000 
I/DEBUG   (   33):     520a0de0  00000000 
I/DEBUG   (   33):     520a0de4  00000000 
I don't understand the error. Do i need to make any adjustments to the 
jit code cache size and heap size? Any help regarding this will be 
appreciated. 
Thanks

preguntado el 26 de abril de 12 a las 08:04

1 Respuestas

Este es un fallo de segmento. Algo está tratando de acceder a un segmento de memoria que no ha sido asignado, o no tiene permiso para hacerlo. Lo más probable es que esto indique un error en los cambios que realizó en libdvm.

La depuración será complicada. Lo que intentaría es construir un binario libdvm_new.so y dalvikvm_new que se vincule contra él, y enviarlos a un dispositivo/emulador (en lugar de reemplazar los libdvm.so y dalvikvm existentes) y luego usar gdb-server y gdb para depurar dalvikvm_new , en un programa de tipo de línea de comandos (el típico programa de tipo static void main(String[] args)).

Respondido 26 Abr '12, 18:04

Buena idea: si bien la mayoría de los procesos de DVM se bifurcan de zygote y usan automáticamente lo que esté instalado como "el" dvm, en realidad es posible iniciar uno por separado desde la línea de comando, y para probar eso sería preferible ya que deja el resto del plataforma que se ejecuta en dvm sin modificar. - chris stratton

Hola, gracias por la respuesta. Me gustaría probar este método, pero desconozco por completo el uso de gdb, ¿podría indicarme un enlace donde pueda comenzar? - user1262185

Realmente no es tan difícil encontrar esta información. Una búsqueda rápida conduce a stackoverflow.com/questions/5945086/… - JesúsFreke

¿Necesito agregar el indicador -g en el archivo Android.mk para habilitar la depuración de gdb o se soluciona? Pregunto esto porque en la discusión aquí groups.google.com/group/android-platform/browse_thread/thread/… no especificaron agregar la bandera -g - user1262185

¿podría decirme cómo crear un binario que se vincule a libdvm.so y cómo ejecutamos un programa usando ese binario? - user1262185

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.