From Amarok Wiki

Normalmente, Amarok funciona de forma correcta. Las versiones liberadas han pasado por betas y han sido probados por mucha gente, por lo que estas versiones estables rara vez necesitan depuración. Por otro lado las versiones beta, así como las versiones tomadas de GIT, es probable que se cierren inesperadamente en algún momento. Estos bloqueos (y otros fallos) son mucho más fáciles de resolver si los desarrolladores saben que lo causa, y es aquí donde comienza la depuración.


Contents

Preparando la depuración

Para depurar Amarok con efectividad, necesitas los paquetes de depuración tanto para el programa como para kdelibs y Qt. Si compilas desde las fuentes, necesitas decirle al compilador que conserve los símbolos de depuración (utilizando ciertas flags del compilador). Si estás usando los paquetes binarios de tu distribución, entonces necesitas instalar los paquetes "debugging" asociados.

Compilando desde las fuentes

Si estás compilando Amarok desde las fuentes, entonces necesitas decirle al compilador que incluya los símbolos de depuración en el programa (por defecto no se hace así). Al ejectutar cmake, incluye lo siguiente -DCMAKE_BUILD_TYPE=debugfull. Visita esto para obtener más información sobre la compilación.

Usando los paquetes de la distribución

Si estás usando los paquetes de tu distribución, normalmente la información para depuración se incluye en un paquete separado. Por ejemplo, si Amarok está en el paquete amarok, debe existir un paquete amarok-debug o amarok-dbg, el cual debes instalar.

Aparte de los paquetes de depuración de Amarok, debes instalar los de kdelibs y posiblemente los de Qt (probablemente llamados kdelibs-debug o kdelibs-dbg y qt-debug, qt4-debug, qt-dbg o qt4-dbg). Estos añadirán símbolos adicionales de depuración, haciendo que tus trazas inversas tengan más valor.

Estos paquetes pueden estar en un repositorio separado que no este activado por defecto. En la documentación de tu distribución encontrarás más información.

Al instalar estos paquetes no ralentizarás Amarok de ninguna manera. No tendrán ningún efecto hasta que intentes depurar Amarok en GDB, que será cuando conviertan una traza inversa formada por letras y números en algo que los desarrolladores puedan utilizar para encontrar y resolver el problema.

Gentoo

Si la instalación es desde un ebuild, haz lo siguiente mkdir -p /etc/portage echo "media-sound/amarok debug" >> /etc/portage/package.use FEATURES="nostrip" emerge media-sound/amarok

También asegúrate de que las CFLAGS son razonables y no incluyen -fomit-frame-pointer.

Para obtener mejores trazas inversas, deberías usar flags similares (así como la opción nostrip) para kdelibs y Qt 4.

Visita también la guía de Gentoo "Cómo obtener trazas íntegras en Gentoo" para ver más detallas sobre las compilaciones para depuración en Gentoo.

La salida de la depuración

Cuando Amarok es creado en modo depuración, puede mostrar mucha información en la consola sobre lo que está haciendo, pero aunque esto puede ser útil para rastrear los errores, ralentiza Amarok considerablemente, por lo que está desactivada por defecto.

Para generar la salida de depuración (por ejemplo si te pregunta un desarrollador), debes cerrar Amarok completamente (Salir en el menú de Amarok, o clic derecho en el icono de la bandeja del sistema y opción salir), y ejecutar lo siguiente en una terminal:

 amarok --debug

Deberías ver mucha salida de depuración. Esta salida (normalmenta las últimas 50 líneas más o menos después de reproducir un problema) pueden ser adjuntadas (como un archivo de texto) a un informe de fallo (según convenga).

Nota: por el simple hecho de instalar los paquetes asociados a depuración de tu distribución no conseguirás este tipo de salida de esta forma. Sin embargo, te permitirá producir trazas inversas útiles (ver abajo).

Generando una traza inversa

Una traza inversa es una lista de cosas que el programa ha intentado hacer antes de bloquearse. Como es posible que una de esas cosas sea la causante del problema, la traza inversa es una herramienta con un valor incalculable para los desarrolladores.

GDB

GDB (GNU's Debugger) es una herramienta de depuración que puede ser usada para generar una traza inversa. Está empaquetado para muchas distribuciones, y puede ser instalado de esa forma, o puede ser compilado e instalado desde las fuentes. Si deseas usar el binario proporcionado por tu distribución, el paquete se suele llamar "gdb" y se puede instalar desde la herramienta de gestión de paquetes de tu distribución (apt-get para Debian/Ubuntu, yum para Redhat, etc.).

Una vez que GDB esté instalado, se puede ejecutar en Amarok:

 gdb amarok

(En Amarok 2, no existe el binario amarokapp por separado, así que puedes depurar directamente amarok.)

Deberías ver información como esta:

Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu"...Using host libthread_db library "/lib/libthread_db.so.1".
(gdb)

De forma predeterminada, las aplicaciones KDE se separán de su terminal asociada. Sin embargo, cuando esto ocurre, GDB es incapaz de rastrear la aplicación. Para prevenir este comportamiento (llamado "forking"), las aplicaciones KDE vienen con la opción --nofork. Esta opción necesita ser indicada antes de ejecutar Amarok:

(gdb) set args --nofork

Amarok puede ser ejecutado con:

(gdb) run

Ahora, intenta repetir lo que causó el bloqueo de Amarok. En ese punto, GDB congelará Amarok. Vuelve a la consola en la que se ejecutaba GDB, y teclea

(gdb) bt

Esto hará que GDB muestre una traza inversa. Ten en cuenta que hace referencia a funciones específicas, archivos y números de línea. Estas trazas inversas deben ser adjuntadas al informe de fallo asociado. Si en lugar de ver algo como lo siguiente ves un montón de signos de interrogación, seguramente no tengas instalados los símbolos de depuración necesarios

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread -1236346144 (LWP 1654)]
0xb6f6179b in QString::latin1ToUnicode () from /usr/lib/libqt-mt.so.3
(gdb) bt
#0  0xb6f6179b in QString::latin1ToUnicode () from /usr/lib/libqt-mt.so.3
#1  0xb6f62056 in QString::QString () from /usr/lib/libqt-mt.so.3
#2  0xb50adb6a in HelixConfigDialog (this=0x881aea8, engine=0x86924a8, p=0x0) at helix-configdialog.cpp:215
#3  0xb50a7acc in HelixEngine::configure (this=0x86924a8) at helix-engine.cpp:96
#4  0x080c0177 in AmarokConfigDialog::soundSystemChanged (this=0x88a3660) at configdialog.cpp:307
#5  0x080bfe34 in AmarokConfigDialog::updateWidgets (this=0x88a3660) at configdialog.cpp:235
#6  0xb7684399 in KConfigDialog::show () from /usr/lib/libkdeui.so.4
#7  0x0808f051 in App::slotConfigAmarok (this=0xbffff960, page=@0xbfffed20) at app.cpp:788
#8  0x0808fc0d in App::qt_invoke (this=0xbffff960, _id=20, _o=0xbfffedb0) at app.moc:108
#9  0xb6cae067 in QObject::activate_signal () from /usr/lib/libqt-mt.so.3
#10 0xb6cadeae in QObject::activate_signal () from /usr/lib/libqt-mt.so.3
#11 0xb754d88b in KAction::activated () from /usr/lib/libkdeui.so.4
#12 0xb754cffa in KAction::slotActivated () from /usr/lib/libkdeui.so.4
#13 0xb754d2be in KAction::slotButtonClicked () from /usr/lib/libkdeui.so.4
#14 0xb754dba1 in KAction::qt_invoke () from /usr/lib/libkdeui.so.4
#15 0xb6cae067 in QObject::activate_signal () from /usr/lib/libqt-mt.so.3
#16 0xb75f7bc5 in KToolBarButton::buttonClicked () from /usr/lib/libkdeui.so.4
#17 0xb75f63ba in KToolBarButton::mouseReleaseEvent () from /usr/lib/libkdeui.so.4
#18 0xb6ce17e9 in QWidget::event () from /usr/lib/libqt-mt.so.3
#19 0xb6c56370 in QApplication::internalNotify () from /usr/lib/libqt-mt.so.3
#20 0xb6c55ac7 in QApplication::notify () from /usr/lib/libqt-mt.so.3
#21 0xb7270ab5 in KApplication::notify () from /usr/lib/libkdecore.so.4
#22 0xb6bef12f in QETWidget::translateMouseEvent () from /usr/lib/libqt-mt.so.3
#23 0xb6bece1c in QApplication::x11ProcessEvent () from /usr/lib/libqt-mt.so.3
#24 0xb6c02ec2 in QEventLoop::processEvents () from /usr/lib/libqt-mt.so.3
#25 0xb6c6774c in QEventLoop::enterLoop () from /usr/lib/libqt-mt.so.3
#26 0xb6c6760e in QEventLoop::exec () from /usr/lib/libqt-mt.so.3
#27 0xb6c5657b in QApplication::exec () from /usr/lib/libqt-mt.so.3
#28 0x081a6e55 in main (argc=1, argv=0xbffffae4) at main.cpp:92


Depuración de una instancia de Amarok que esté en ejecución

Puede ser dificil reproducir algunos fallos, de forma que es más fácil depurar simplemente cuando Amarok se cuelga la primera vez. Para hacer esto, prueba lo siguiente en una terminal cuando Amarok se bloquea:

 gdb `which amarok` -p `pidof amarok`
 (gdb) thread apply all bt

Entonces verás una traza inversa que deberás adjuntar en tu informe de fallo.