•     
  •     
  •     
  • Chuletas
  • News
  • PVPC
  • Detalles útiles usando gdb

    1. Ubicación de los cores

    Esto tiene su miga: normalmente, por defecto, el kernel no crea cores, pero hay herramientas para indicarle cómo lo debe hacer (como corekeeper). Todo se le indica a traves de /proc/sys/kernerl/core_*. Concretamente /proc/sys/kernerl/core_pattern es muy potente, admite incluso empiparle el core a un comnando. Aparte, hay cosas en relación a esto en /etc/security/limits.conf (y /etc/security/limits.d, lo que suelen utilizar paquetes como corekeeper.

    Para simplemente permitir que se generen cores, basta habilitarlo en una línea en algún fichero dentro de /etc/security/limits.d/ ( man limits.conf ). Por defecto se generan en el directorio de trabajo del programa, a no ser que se manipule /proc/sys/kernerl/core_* para que lo haga de otra manera.

    No parece buena decisión que los cores se generen con la id del proceso en el nombre del core, porque en caso de que un servicio con restarting automático los generase contínuamente, podrían fácilmente llenar el disco. Y de todas formas tampoco sirve de mucho tener mas de un core: normalmente son de algo que estas depurando y el motivo del crash va a ser el mismo o bien los mas antiguos fueron generados con un ejecutable que ya es diferente y no sirven de nada.

    2. Símbolos de librería que no aparecen inspeccionando cores

    Hay que indicarle el ejecutable mediante:

    file <path>

    Y, no sé por qué, en algunos sistemas, gdb no es capaz de encontrar librerías compartidas en sitios estándar como /usr/local/lib. El resultado es, por ejemplo, que back no te proporciona nombres de funciones. Entonces hay que hacer:

    sharedlibrary <path>

    3. Depurando programas con mas de una hebra.

    Normalmente, gdb avisa cuando se inicia y termina una hebra adicional a la principal.

    Según el manual, cuando una hebra encuentra un punto de ruptura por defecto se paran todas y cuando se establecen puntos de ruptura también se hace para todas ellas.

    El comando info threads proporciona lista de las existentes. Siempre hay una hebra activa, en la que se aplican los comandos ejecutados, que se puede cambiar con thread <num>.

    4. Haciendo que se muestre la cadena completa con p <cadena>.

    En .gdbinit, incluir: set print elements 0.