Gerando arquivos core de processos em execução
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):
-
(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
Uma vez com o processo anexado ao GDB é só gerar o core.
-
(gdb) generate-core-file
-
Saved corefile core.4411
Depois de gerar o core, você já pode desanexar o processo usando o comando detach
-
(gdb) detach
-
Detaching from program: /home/otavio/projects/tmp/ex_daemon
Por fim, basta carregar o core e uma tabela de símbolos válida (a partir do executável).
-
(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.
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.
Comentar