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.