¿Puedo usar GDB para depurar un proceso en ejecución?

110

En Linux, ¿puedo usar GDB para depurar un proceso que se está ejecutando actualmente?

Justin Ethier
fuente

Respuestas:

88

Si. Usa el attachcomando. Consulte este enlace para obtener más información. Escribir help attachen una consola GDB da lo siguiente:

(gdb) help attach

Adjuntar a un proceso o archivo fuera de GDB. Este comando se adjunta a otro objetivo, del mismo tipo que su último " target" comando (" info files" mostrará su pila de objetivos). El comando puede tomar como argumento un ID de proceso, un nombre de proceso (con un ID de proceso opcional como sufijo) o un archivo de dispositivo. Para una identificación de proceso, debe tener permiso para enviar una señal al proceso, y debe tener el mismo uid efectivo que el depurador. Cuando se usa " attach" para un proceso existente, el depurador encuentra el programa que se ejecuta en el proceso, buscando primero en el directorio de trabajo actual, o (si no se encuentra allí) usando la ruta de búsqueda del archivo fuente (ver el directorycomando " "). También puede utilizar el filecomando " " para especificar el programa y cargar su tabla de símbolos.


NOTA: Es posible que tenga dificultades para conectarse a un proceso debido a la seguridad mejorada en el kernel de Linux , por ejemplo, para adjuntar al hijo de un shell desde otro.

Es probable que deba configurarlo /proc/sys/kernel/yama/ptrace_scopesegún sus requisitos. Muchos sistemas ahora tienen valores predeterminados 1o superiores.

The sysctl settings (writable only with CAP_SYS_PTRACE) are:

0 - classic ptrace permissions: a process can PTRACE_ATTACH to any other
    process running under the same uid, as long as it is dumpable (i.e.
    did not transition uids, start privileged, or have called
    prctl(PR_SET_DUMPABLE...) already). Similarly, PTRACE_TRACEME is
    unchanged.

1 - restricted ptrace: a process must have a predefined relationship
    with the inferior it wants to call PTRACE_ATTACH on. By default,
    this relationship is that of only its descendants when the above
    classic criteria is also met. To change the relationship, an
    inferior can call prctl(PR_SET_PTRACER, debugger, ...) to declare
    an allowed debugger PID to call PTRACE_ATTACH on the inferior.
    Using PTRACE_TRACEME is unchanged.

2 - admin-only attach: only processes with CAP_SYS_PTRACE may use ptrace
    with PTRACE_ATTACH, or through children calling PTRACE_TRACEME.

3 - no attach: no processes may use ptrace with PTRACE_ATTACH nor via
    PTRACE_TRACEME. Once set, this sysctl value cannot be changed.
Carl Norum
fuente
8
El enlace está roto :( Desde mi punto de vista, me gustan respuestas como esta de J. Polfer . Saludos;)
olibre
He arreglado el enlace.
Attie
¿Esto también funciona para un pid de un proceso en un objetivo remoto?
Bionix1441
Entonces tienes que ejecutar un servidor de depuración en el destino remoto; después de eso debería ser el mismo.
Carl Norum
La bandera se puede cambiar usando echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope.
Daisuke Aramaki
108

Puede adjuntar a un proceso en ejecución con gdb -p PID.

Nikolai Fetissov
fuente
24

Si. Tu puedes hacer:

gdb program_name program_pid

Un atajo sería (suponiendo que solo se esté ejecutando una instancia):

gdb program_name `pidof program_name`
J. Polfer
fuente
No sé qué hace eso, pero seguro que no funciona para mí. Dice que <program_pid> no existe.
Búho
2
Encuentro que esto funciona mejor ya que carga la tabla de símbolos además de adjuntarla al proceso. Cabe señalar que program_namefunciona si está en el mismo directorio que el binario. Creo que una ruta al binario funcionaría si estás en un directorio diferente.
KarateSnowMachine
¿No te olvidaste del -pfrente program_id? Además, podría ser necesario ejecutar gdb con sudo para adjuntarlo a un proceso en ejecución.
mxmlnkn
15

El comando a usar es gdb attach piddonde pid es el ID de proceso del proceso al que desea adjuntar.

David Kanarek
fuente
3

Sí tu puedes. Suponga que se fooestá ejecutando un proceso ...

ps -elf | grep foo

busque el número PID

gdb -a {número PID}
t0mm13b
fuente
5
¿En qué distribución se está ejecutando? Usando una versión reciente de Fedora, 'gdb -a' imprime un error de "opción -a es ambigua".
Justin Ethier
1
el argumento oficial es -p / - pid
Mahmoud Al-Qudsi
3

Si se quiere adjuntar un proceso, este proceso debe tener el mismo propietario. La raíz se puede adjuntar a cualquier proceso.

Milán Kerslager
fuente
2

ps -elf no parece mostrar el PID. Recomiendo usar en su lugar:

ps -ld | grep foo
gdb -p PID
Nino Pereira
fuente
2

La forma más sencilla es proporcionar la identificación del proceso .

gdb -p `pidof your_running_program_name`

Obtenga la lista completa de opciones en man gdb mando.

En caso de que haya varios procesos para el mismo programa en ejecución, el siguiente comando enumerará los procesos.

ps -C program -o pid h
<number>

Luego, el ID del proceso de salida (número) se puede usar como argumento para gdb.

gdb -p <process id>
shuva
fuente