Depurar B2G usando gdb

by 1 contributor:

Borrador
Esta página no está completa.

Depurar Firefox OS usando gdb es fácil. Este artículo lo ayudará a hacerlo aún más fácil.

Iniciar el depurador en modo proceso único

Nota: Antes de ejecutar el depurador, podría configurar un archivo .userconfig para personalizar ciertas cosas. Vea Personalización con el archivo .userconfig para más detalles.

Para reiniciar Firefox OS y ejecutarlo bajo el control de gdb, simplemente use el script run-gdb.sh:

./run-gdb.sh

Nota: Si desea depurar en el emulador, asegúrese de no tener teléfonos conectados; esto puede causar conflctos con la habilidad de gdb de conectarse al emulador.

Si ya se está ejecutando Firefox OS y desea adjuntarlo sin reiniciarlo, puede hacer algo como:

./run-gdb.sh attach

Depurar tareas fuera del proceso

Because of the threaded nature of Firefox OS, you often need to be able to debug tasks other than the main B2G task. To do this, the simplest way is to use the b2g-ps command to find out the PID of the process that you need to debug:

$ adb shell b2g-ps
b2g              root      106   1     189828 56956 ffffffff 40101330 S /system/b2g/b2g
Browser          app_0     4308  106   52688  16188 ffffffff 400db330 S /system/b2g/plugin-container

Aquí, Browser es el proceso hijo usado como el "proceso contenido" para la aplicación navegador. Así que si quiere depurar el proceso contenido, en este ejemplo, debería hacer:

$ ./run-gdb attach 4308

A veces es útil ser notificado inmediatamente de la creación de cualquier proceso hijo. Esto puede lograrse iniiando run-gdb.sh con la variable de entorno MOZ_DEBUG_CHILD_PROCESS:

MOZ_DEBUG_CHILD_PROCESS=1 ./run-gdb.sh

Habiendo hecho esto, lanzar una aplicación OOP en Firefox OS mostrará el PID de plugin-container para la nueva tarea y esperará 30 segundos, tiempo suficiente para hacer

$ ./run-gdb attach <pid>

como se mencionaba anteriormente.

Si está tratando de depurar algo que ocurre durante el booteo, deberá lanzar la instancia del depurador para la nueva aplicación con bastante rapidez. Una vez que el nuevo depurador fue lanzado, debería presionar inmediatamente "c" para continuar ejecutando la nueva tarea.

Soporte

Que nivel de funcionalidad se espera

Al menos las siguientes caracterísiticas de depuración deberían funcionar definitivamente. Si no lo hacen, lo más probable es que un simple ajuste a la configuración las haga funcionar:

  • Símbolos para todas las librerías (excepto quizás algunos drivers en ciertos teléfonos con Android)
  • Backtraces with full debug info (except for optimized-away argument values)
  • Breakpoints: you should be able to break on a symbol, or on a file:line, or on an address. All should work.
  • Single-stepping ('s' and 'n' should both work)

Las siguientes características de depuración not están soportadas. No intente usarlas.

  • Watchpoints.

Solución de problemas

Hay unas pocas cosas que intentar cuando GDB no está funcionando como se describe anteriormente.

Asegúrese que el clon de B2G está actualizado

Siempre tenga en mente que para actualizar su clon de B2G debe ejecutar estos dos comandos:

git pull
./repo sync

Olvidarse de git pull aquí es una típica razón por la que se terminará con un run-gdb.sh viejo y no se beneficiará de las mejoras recientes.

Asegúrese de adjuntarse al proceso correcto

Adjuntarse al proceso equivocado (ej. proceso principal de B2G en lugar del proceso Browser) podría explicar por que los breakpoints no se alcanzan.

Asegúrese que los símbolos se leyeron correctamente

En gdb, use info shared para verificar que los símbolos se leyeron correctamente:

(gdb) info shared
From        To          Syms Read   Shared Object Library
0xb0001000  0xb0006928  Yes         out/target/product/otoro/symbols/system/bin/linker
0x40051100  0x4007ed74  Yes         /hack/b2g/B2G/out/target/product/otoro/symbols/system/lib/libc.so
0x401ab934  0x401aba2c  Yes         /hack/b2g/B2G/out/target/product/otoro/symbols/system/lib/libstdc++.so
...

La columna Syms Read debería decir Yes en todas partes. Quizás en algún teléfono android podría ver Yes (*) para algunas librerías del sistema o drivers; eso debería estar bien. No se debería ver ningún No.

Si se ve un No, ese es el primer problema y debe resolverlo antes de buscar otra cosa.

Busque cualquer mensaje de error en la salida de terminal justo después de tipear el comando run-gdb.sh.

También verifique en esa salida de terminal output que el comando GDB esté correcto. En particular, el último argumento de la línea de comando debería ser la ruta al ejecutable de b2g. Aquí hay un ejemplo correcto:

prebuilt/linux-x86/toolchain/arm-linux-androideabi-4.4.x/bin/arm-linux-androideabi-gdb -x /tmp/b2g.gdbinit.bjacob /hack/b2g/B2G/objdir-gecko/dist/bin/b2g

Verifique el valor de estas variables de GDB: solib-search-path y solib-absolute-prefix:

(gdb) show solib-search-path
The search path for loading non-absolute shared library symbol files is /hack/b2g/B2G/objdir-gecko/dist/bin:out/target/product/otoro/symbols/system/lib:out/target/product/otoro/symbols/system/lib/hw:out/target/product/otoro/symbols/system/lib/egl:out/target/product/otoro/symbols/system/bin:out/target/product/otoro/system/lib:out/target/product/otoro/system/lib/egl:out/target/product/otoro/system/lib/hw:out/target/product/otoro/system/vendor/lib:out/target/product/otoro/system/vendor/lib/hw:out/target/product/otoro/system/vendor/lib/egl.
(gdb) show solib-absolute-prefix
The current system root is "out/target/product/otoro/symbols".

Si necesita ayuda, intente el canal de IRC #b2g. Si piensa que encontró un error, infórmelo en B2G issue tracker.

Etiquetas y colaboradores del documento

Contributors to this page: MPoli
Última actualización por: MPoli,
Ocultar la barra lateral