Proporcionando una Traza de la Pila (Stack Trace)

Michael Schwendt, Rahul Sundaram, Ankur Sinha Version unspecified Last review: 2014

Esta página ha sido tomada de la documentación anterior de Fedora Wiki.

Se ha limpiado para publicarla aquí en el Portal Fedora Docs, pero todavía no se ha revisado su precisión técnica.

Es probablemente

  • Contenga problemas de formato

  • Fuera de fecha

  • Necesite un poco de amor

Se agradecen mucho las revisiones de precisión técnica. Si desea ayudar, consulte el archivo README en el repositorio fuente para obtener instrucciones.

Solicitudes de extracción aceptadas en https://pagure.io/fedora-docs/quick-docs

Una vez haya corregido esta página, borre este anuncio.

Una traza de pila (stack trace) es uno de los recursos más importantes que puede proporcionar para ayudar a otros a depurar el fallo de una aplicación. Esta página detalla la importancia de las trazas de pila y describe varios métodos para obtenerlas.

Si experimenta un fallo, los pasos básicos para generar una traza de pila útil para aplicaciones estándar del entorno de escritorio Gnome son:

  • Instale los paquetes RPM -debuginfo apropiados antes del fallo (consulte la sección "¿Qué son los RPM de información de depuración y cómo los obtengo?" a continuación).

  • Espere a que se produzca el fallo o realice los pasos necesarios para reproducirlo.

  • En Fedora, ABRT (Automatic Bug Reporting Tool o Herramienta de Informe Automático de Errores en español) detectará automáticamente el fallo y obtendrá la traza de pila.

  • Incluya la traza de pila en su informe de error (consulte el documento "Cómo Presentar un Error" para obtener instrucciones completas).

Si ABRT no se inicia automáticamente, deberá iniciar el programa de un modo especial, utilizando un depurador (como gdb). Vea la sección Obtener una traza de pila utilizando solo GDB a continuación.

Se aplican instrucciones especiales para programas Java y Firefox.

¿Qué es una traza de pila?

Una traza de pila es una lista de las llamadas a funciones que conducen a algún punto del programa. Herramientas de depuración como gdb o bug-buddy pueden obtener trazas de pila de aplicaciones fallidas para que los desarrolladores puedan descubrir qué salió mal.

¿Qué aspecto tiene una traza de pila?

Una traza de pila típica es parecida a lo siguiente:

[New Thread 8192 (LWP 15167)]

0x420ae169 in wait4 () from /lib/i686/libc.so.6
.
.
.

Una mejor traza de pila, con símbolos de información de depuración (ver más abajo) se ve así:

0x000000350a6c577f in *__GI___poll (fds=0xe27460, nfds=9, timeout=-1) at ../sysdeps/unix/sysv/linux/poll.c:83
83          return INLINE_SYSCALL (poll, 3, CHECK_N (fds, nfds), nfds, timeout);

.
.
.

Observe que aparecen los nombres de archivos y los números de línea donde se llaman las funciones.

¿Qué son los símbolos de depuración y por qué son importantes?

Cuando un programa se compila con modificaciones especiales para generar símbolos de depuración (el modificador -g del compilador), almacena información adicional en el archivo del programa. Esta información puede ser utilizada para generar una traza de pila que contenga mucha más información, como el número de línea exacto del archivo fuente donde algo salió mal. Sin esta información, es muy difícil determinar qué salió mal observando la traza de pila.

¿Qué son los RPM de información de depuración y cómo los obtengo?

Fedora incluye un tipo especial de RPM llamados RPMs de información de depuración (debuginfo). Estos RPM creados automáticamente que contienen la información de depuración de los archivos del programa pero almacenados en un archivo externo. Todas las herramientas que manejan información de depuración saben cómo buscar automáticamente en estos archivos. Esto le permite instalar fácilmente información de depuración cuando la necesite. Debe instalar la versión y arquitectura exactas de debuginfo correspondientes a la aplicación que está intentando depurar.

Ejemplo: Verificando Versión y Arquitectura Coincidentes

[warren@computer ~] $ rpm -q --qf '%{name}-%{version}-%{release}.%{arch}\n' gaim gaim-debuginfo
gaim-2.0.0-0.26.beta5.i386
gaim-debuginfo-2.0.0-0.26.beta5.i386

Cada paquete que contenga binarios en su distribución tiene un paquete debuginfo correspondiente.

Instalando RPMs debuginfo usando DNF.

debuginfo-install es un útil complemento, perteneciente al paquete dnf-plugins-core, que habilita automáticamente los repositorios de debuginfo y descarga todos los paquetes de debuginfo necesarios . Usted puede hacer:

$ dnf debuginfo-install <pkg-spec>

para instalar todos los paquetes debuginfo necesarios para el paquete <pkg-spec>.

Para instalar únicamente el conjunto mínimo de paquetes debuginfo, use la lista de paquetes del comando (sin instalar nada) para obtener los nombres de los paquetes debuginfo y sus respectivos repositorios. Luego, construya el comando de instalación de acuerdo con el siguiente ejemplo:

$ dnf --enablerepo=fedora-debuginfo --enablerepo=updates-debuginfo install <pkg-spec>-debuginfo

Esto es útil cuando no desea instalar paquetes debuginfo para todas las dependencias del paquete a depurar, ya que a menudo no se requieren.

Instalando RPMs debuginfo usando yum.

El comando debuginfo-install es una herramienta útil, perteneciente al paquete yum-utils, que habilita automáticamente los repositorios de debuginfo y descarga los paquetes debuginfo necesarios. Usted puede hacer:

$ debuginfo-install foo

para instalar todos los paquetes debuginfo necesarios para el paquete foo.

Para instalar únicamente el conjunto mínimo de paquetes debuginfo, use la salida de debuginfo-install (sin instalar nada) para obtener los nombres de los paquetes debuginfo y sus respectivos repositorios. Luego, construya el comando de instalación de acuerdo con el siguiente ejemplo:

$ yum --enablerepo fedora-debuginfo,updates-debuginfo install foo-debuginfo

Esto es útil cuando no desea instalar paquetes debuginfo para todas las dependencias del paquete a depurar, ya que a menudo no se requieren.

Instalando RPMs debuginfo manualmente.

Estos paquetes pueden descargarse desde los espejos normales de Fedora en el subdirectorio "debug" del directorio de la arquitectura. Por ejemplo, los paquetes debuginfo para la última versión de desarrollo están disponibles en http://mirrors.fedoraproject.org/publiclist/Fedora/development/ . Utilice el espejo más cercano a usted para realizar la descarga.

Empaquetadores.

Si usted es un empaquetador buscando información acerca de los RPMs debuginfo, consulte el documento Debuginfo packages.

¿Cómo genero un traza?

Primero compruebe que tiene instalados los paquetes debuginfo para la aplicación que está depurando y todas las librerías relacionadas. Un desarrollador a menudo le dice que instale paquetes debuginfo específicos porque puede saber a través de un traza de la pila que librerías están involucradas en la caída. Vea abajo paquetes recomendados para algunos tipos comunes de aplicaciones.

Hay diversas maneras de obtener un traza de la pila:

¿Qué paquetes debuginfo debería instalar?

Como mínimo usted necesitará instalar el paquete debuginfo para la aplicación que está cayendo. Puede averiguar en que paquete se encuentra esta aplicación tecleando rpm -qf path-of-program.

Para ciertos tipos de programas es también muy útil instalar un par de paquetes predeterminados que son útiles para casi todas las trazas de la pila:

  • Aplicaciones Gnome y aplicaciones que utilizan Gtk+: glib2-debuginfo, pango-debuginfo, gtk2-debuginfo

  • Aplicaciones KDE: qt-debuginfo, kdelibs-debuginfo

Obtener una traza de pila utilizando solo GDB

Si usted está ejecutando un programa Java como Eclipse o Tomcat, la situación es un poco más complicada – vea detalles en programas Java Java programs.

Primero, ejecute el siguiente comando para iniciar gdb:

gdb name-of-program

Donde name-of-program es el nombre del programa que ha caído (por ejemplo: /usr/bin/gnome-panel).

Después, en el símbolo de gdb, teclee:

run

Si usted necesita darle cualquier argumento al programa, déselos después del comando run, como:

run --argument

Una vez que el programa está corriendo, reproduzca la caída y vuelva al terminal donde está ejecutando gdb. El símbolo de gdb debería estar mostrando – si no, pulse Control+C para entrar en el depurador. En el símbolo del depurador gdb, teclee:

thread apply all bt full

Si esto no funciona (lo que significa que no obtiene ningún resultado—este puede ser el caso en programas que no son multiproceso), teclee en su lugar <code>bt</code>. Si aún no tiene ninguna salida, lea [[#special| esta nota]] sobre la obtención de una traza de pila bajo circunstancias especiales. La salida es la traza de pila. Corte y pegue todo en un archivo de texto.

Usted puede salir de gdb tecleando quit.

Algunas veces, la traza puede ser muy larga y dificultar el copia y pega. En dichas situaciones, es conveniente guardar la traza en un archivo:

gdb
> run
# program crashes
> set logging file backtrace.log
> set logging on
> thread apply all bt full
> set logging off
> quit

Obtener una traza de pila desde un volcado de núcleo

Si el programa que falla deja un volcado de núcleo, usted puede usar GDB para obtener una traza de pila. Los volcados de núcleo se guardan en un archivo en su disco duro y generalmente reciben un nombre similar a "core" o "core.3124". Para obtener una traza de pila de uno de estos archivos, ejecute el siguiente comando:

gdb name-of-program core-file-name

Donde name-of-program es el nombre del programa que ha fallado (por ejemplo: /usr/bin/gnome-panel) y core-file-name es el nombre del archivo core que contiene el volcado de núcleo (por ejemplo: core.7812).

Después, en el símbolo de gdb, teclee:

thread apply all bt full

Si esto no funciona (lo que significa que no obtiene ningún resultado—esto puede ser el caso en programas que no son multiproceso), teclee en su lugar bt. Si aún no tiene ninguna salida, lea esta nota sobre la obtención de una traza de pila bajo circunstancias especiales. La salida es la traza de pila. Corte y pegue todo en un archivo de texto.

Usted puede salir de gdb tecleando quit.

Tenga en cuenta que la creación de archivos core está deshabilitada en Fedora de forma predeterminada (en /etc/profile). Para habilitarlo para una sesión de shell, teclee en el indicador de shell:

ulimit -c unlimited

Como instalar ABRT

Si usted instaló Fedora por medio de una imagen LiveCD image, ABRT debería estar ya instalado. Usted debería ser capaz de iniciarlo en Aplicaciones → Herramientas del Sistema → Automatic Bug Reporting Tool. Si ABRT no está instalado, por cualquier razón, usted puede instalarlo manualmente haciendo lo siguiente en una línea de comandos:

$ su -c 'dnf install abrt'

o ir a SistemaAdministraciónAñadir/Quitar Software en Gnome y teclear abrt en la caja de búsqueda y seleccionar Buscar. Seleccione el paquete abrt y aplique los cambios.

Configurar ABRT para Bugzilla

Vaya a AplicaciónHerramientas del SistemaABRT y selecciónelo para arrancarlo manualmente. Una vez que aparece la ventana GUI, elija EditarComplementos y de la ventana Ajustes, desplace hacia abajo, resalte Bugzilla y elija Configurar Complemento. La URL de Bugzilla debería ser https://bugzilla.redhat.com e introduzca su clave y contraseña de acceso a Bugzilla en las cajas apropiadas.

Si no tiene una cuenta Bugzilla todavía, ahora es el momento de obtener una, solo vaya a la URL que se muestra en esa página y cree una nueva cuenta.

La próxima vez que tenga un programa que falla y dispare ABRT, cuando usted pulse Informar, ABRT será capaz de acceder automáticamente a Bugzilla y enviar el Informe de Error por usted.

Usar ABRT

(Lo siguiente asume que tiene Gnome como escritorio … tendrá que actualizar algo más para KDE/Otros)

Si ABRT detecta un programa que falle, usted tendrá una alerta ABRT. Esto será indicado visualmente por una luz roja parpadeante en la bandeja del sistema. Pulse con el botón izquierdo en la luz de alerta y debería arrancar la Automatic Bug Reporting Tool (Herramienta Automática de Informe de Error), mostrando todas las caídas registradas. Para informar del error, pulse con el botón derecho y elija informar. ABRT obtendrá los registros que necesita enviar con el error y luego le informará que enviará el error en su nombre. Si usted tiene configurado ABRT como en la sección anterior, le pedirá que verifique sin quiere incluir o no los diversos registros, después irá automáticamente a Bugzilla y abre el error, agregando los registros al error. Después le mostrará el número de error para que usted pueda hacer un seguimiento de lo que se está trabajando.

Configurar ABRT cuando falta Información de Depuración

Cuando usted pulsa con el botón derecho en ABRT y elige Informar, ABRT intentará salir y recuperar los registros que deberá enviar como parte del informe de error. Los desarrolladores han añadido código para detectar si se incluyen o no trazas simbólicas dentro de la traza inversa y si detecta que no hay ninguna, ABRT le alertará de esto y le mostrará el comando que debe ejecutar. Esto es lo mismo que se muestra en la sección debuginfo.

Casos especiales

Programs running as another user

If you do not get any output from gdb after typing thread apply all bt or bt, it may be because the program is run as root or as another user. In GNOME for example, this is the case when running gnome-games. In such cases, you will need to be root in order to capture a trace. So, quit gdb, login as root, and then repeat the steps to obtain a stack trace.

Firefox

  • Install Firefox and Xulrunner debug info packages - run ebuginfo-install firefox xulrunner as root on the command line.

  • Run firefox -g on the command line. That will start firefox running inside of gdb debugger.

  • In gdb, you should see gdb prompt (gdb). Issue the command run -safe-mode. A dialog window will pop up, disable all add-ons here and continue in safe mode.

  • Do whatever is necessary to make firefox crash and follow the instructions above for gdb usage.

  • When Firefox crashes, obtain the backtrace and attach it to bugzilla.

Thunderbird

It’s almost the same as for Firefox, just the debug info packages are different. Install them by "debuginfo-install thunderbird" command as root on the console.

Java programs

See document Troubleshooting Java Programs for info on getting stack traces from programs running in Java.

Daemons and their spawn

You will need to gather the backtrace from the core file.

Make sure your daemon’s initscript isn’t forbidding dumping core files to the disk. Add the line DAEMON_COREFILE_LIMIT=unlimited to its configuration file in /etc/sysconfig. For example, the Bluetooth daemon (hcid) uses /etc/sysconfig/bluetooth.

Then setup the kernel so that the core dump is written to a known location such as /tmp. As root, run:

echo /tmp/core > /proc/sys/kernel/core_pattern

To make this change permanent, add that line to /etc/sysctl.conf:

kernel.core_pattern = /tmp/core

And run sysctl -p to apply it straight away.

A full list of possible patterns for the core file are available at in the sysctl/kernel.txt kernel Documentation .

Finally, after reproducing your problem, you can double-check which binary created the core file with file /tmp/core.1234. Then run gdb on the file to create a post-mortem stack trace:

gdb /path/to/binary/file /tmp/core.1234

and follow the instructions above for gdb usage.

you can test whether dumping a core file would work by running kill -SEGV 1234 where 1234 is the PID of the program you’re testing.

Other tools

Valgrind

The brilliant tool valgrind is often able to say more about what is going wrong; it can give a strack trace to the point where things start to go wrong, which might be long time before the program actually crashes. Programs run through valgrind will run an order of magnitude slower and use more memory, but it will be buddyamazingly usable.

With valgrind installed (`dnf install valgrind) you can use it on a program:

valgrind name-of-program program-arguments

With debuginfo installed stacktraces will use symbolic names. See [http://valgrind.org/ valgrind.org] for more info and tips and tricks.

strace

strace can track all system calls made by a program, which can also be helpful in debugging, though it cannot produce stack traces. Install with dnf install strace, and see man strace for details.

The situation is a bit improved. Now stack trace feature is implemented (strace -k). Though it is disabled when building because the implementation is not stable on i386.

References