Eventualmente é necessário depurar um processo atualmente em execução sem que o processo seja iniciado através do gdb. Nem sempre é possível reiniciar um serviço atualmente ativo. Mas isso tem uma solução simples, o gdb permite que você anexe processos a ele, desta maneira permitindo gerar arquivos core, analisar a stack e um monte de outras coisas uteis. Este pequeno tutorial mostra como fazer isso.

Para gerar arquivos core de processos em execução você deve, primeiramente, saber o PID do processo. Uma vez tendo o PID do processo você pode executar o gdb e proceder da seguinte maneira (aqui, assumi que o PID do processo é 4411):
[code]
(gdb) attach 4411
Attaching to process 4411
Reading symbols from /home/otavio/projects/tmp/ex_daemon…done.
Reading symbols from /usr/lib/libssl.so.0.9.7…done.
Loaded symbols for /usr/lib/libssl.so.0.9.7
Reading symbols from /usr/lib/libstdc++.so.5…done.
Loaded symbols for /usr/lib/libstdc++.so.5
Reading symbols from /lib/libm.so.6…done.
Loaded symbols for /lib/libm.so.6
Reading symbols from /usr/lib/libgcc_s.so.1…done.
Loaded symbols for /usr/lib/libgcc_s.so.1
Reading symbols from /lib/libc.so.6…done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /usr/lib/libcrypto.so.0.9.7…done.
Loaded symbols for /usr/lib/libcrypto.so.0.9.7
Reading symbols from /lib/libdl.so.2…done.
Loaded symbols for /lib/libdl.so.2
Reading symbols from /lib/libpthread.so.0…done.
[New Thread 16384 (LWP 4411)]
Loaded symbols for /lib/libpthread.so.0
Reading symbols from /usr/lib/libz.so.1…done.
Loaded symbols for /usr/lib/libz.so.1
Reading symbols from /lib/ld-linux.so.2…done.
Loaded symbols for /lib/ld-linux.so.2
0xb7d7e4d6 in accept () from /lib/libc.so.6
[/code]

Uma vez com o processo anexado ao GDB é só gerar o core.
[code]
(gdb) generate-core-file
Saved corefile core.4411
[/code]

Depois de gerar o core, você já pode desanexar o processo usando o comando detach
[code]
(gdb) detach
Detaching from program: /home/otavio/projects/tmp/ex_daemon
[/code]

Por fim, basta carregar o core e uma tabela de símbolos válida (a partir do executável).
[code]
(gdb) core core.4411
Core was generated by `/home/otavio/projects/tmp/ex_daemon’.
# 0 0xb7d7e4d6 in ?? ()
(gdb) file /home/otavio/projects/tmp/ex_daemon
Reading symbols from /home/otavio/projects/tmp/ex_daemon…done.
[/code]

A partir de agora, você já pode analisar a stack no momento do travamento, verificar o código assembly gerado, etc, etc, etc. Esse tipo de informação é bastante útil quando para analisar dados de travamento quando ocorrem em servidores de produção, por exemplo.

Deixe uma resposta