Artigo
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.
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.