tutorial subaru online how commands gdb

subaru - how to use gdb



¿Hay alguna manera de decirle a gdb que espere a que se inicie un proceso y se adjunte a él? (5)

Aquí está mi script llamado gdbwait:

#!/bin/sh progstr=$1 progpid=`pgrep -o $progstr` while [ "$progpid" = "" ]; do progpid=`pgrep -o $progstr` done gdb -ex continue -p $progpid

Uso:

gdbwait my_program

Claro que se puede escribir mejor, pero la sintaxis del script de shell Bourne es dolorosa para mí, así que si funciona, entonces lo dejo solo. :) Si el nuevo proceso se inicia y muere demasiado rápido, agregue 1 segundo de retraso en su propio programa para la depuración ...

Tengo un proceso que es llamado por otro proceso que es llamado por otro proceso y así sucesivamente hasta la saciedad. Es un proceso hijo en una larga cadena de herramientas.

Este proceso se está estrellando.

Me gustaría capturar este proceso en gdb para entender por qué se está estrellando. Sin embargo, la única forma en que puedo pensar es:

  1. iniciar el proceso padre original en la línea de comandos.
  2. poll ps -C <name process I want to catch> y obtener el PID.
  3. lance gdb, adjunto al PID de ese proceso.

Esto es engorroso, pero generalmente hace el trabajo. El problema es que la falla actual se ejecuta muy rápidamente, y cuando capturo el PID y lanzo gdb, ya pasó el punto de falla.

Me gustaría lanzar gdb y en lugar de:

(gdb) attach <pid>

Me gustaría hacer:

(gdb) attach <process name when it launches>

¿Hay alguna manera de hacer esto?

Estoy usando gdb 7.1 en linux



He estado enfrentando un problema similar con algo que estoy tratando de depurar, y se me ocurrió una solución usando ldpreload, pero después de ver la respuesta de Joeys, creo que lo intentaré primero. En caso de que sea útil para alguien más, aquí está la idea:

Cree una biblioteca LD_PRELOAD para enlazar las llamadas exec * (hay muchas guías sobre cómo hacer esto, pero si hago esto, actualizaré mi respuesta con el código), verificará la ruta utilizada al pasar por la llamada exec *. si es nuestro objetivo, envíe un mensaje con el PID a stderr y entre en un bucle infinito (con el modo de espera para evitar el uso masivo de la CPU). Luego puede adjuntar con gdb y modificar el registro utilizado en el bucle para continuar la ejecución.

Esto puede involucrar cierto ASM en línea para asegurarse de que el compilador no optimice el bucle infinito de tal manera que sea difícil salir de él. Una forma más elocuente de hacerlo sería encontrar una manera de detectar que gdb se ha adjuntado y luego desencadenar un punto de interrupción ("asm (" int3 ");" debería hacer el truco en este último).


No es exactamente lo que esperas, pero podría ayudarte en la depuración.

valgrind --trace-children=yes your_program

revisará e imprimirá los errores de memoria en todos los elementos secundarios del proceso, con seguimiento de pila y algunos detalles sobre el error (por ejemplo, en caso de doble liberación, obtendría el seguimiento de pila de la primera descarga).

Además, puede hacer que el proceso de falla genere un volcado de núcleo y depure este post-mortem. Vea esta respuesta para más detalles .


Puede adjuntar a un proceso padre y establecer el modo de seguimiento de modo fork . Esto hará que el proceso hijo de depuración gdb en lugar del padre después del bifurcación. También será útil la horquilla de captura . Esto hará que gdb se detenga después de cada horquilla. Ver docs .