No Linux, posso usar o GDB para depurar um processo que está em execução?
No Linux, posso usar o GDB para depurar um processo que está em execução?
Respostas:
Sim. Use o attach
comando. Confira este link para mais informações. Digitar help attach
em um console GDB fornece o seguinte:
(gdb) help attach
Anexe a um processo ou arquivo fora do GDB. Este comando se conecta a outro alvo, do mesmo tipo que seu último "
target
" comando ("info files
" mostrará sua pilha alvo). O comando pode ter como argumento um id de processo, um nome de processo (com um id de processo opcional como sufixo) ou um arquivo de dispositivo. Para uma identificação de processo, você deve ter permissão para enviar um sinal ao processo, e ele deve ter o mesmo uid efetivo que o depurador. Ao usar "attach
" em um processo existente, o depurador encontra o programa em execução no processo, procurando primeiro no diretório de trabalho atual ou (se não for encontrado lá) usando o caminho de pesquisa do arquivo de origem (consulte odirectory
comando " "). Você também pode usar ofile
comando " " para especificar o programa e para carregar sua tabela de símbolos.
NOTA: Você pode ter dificuldade para anexar a um processo devido à segurança aprimorada no kernel do Linux - por exemplo, anexar ao filho de um shell de outro.
Você provavelmente precisará definir /proc/sys/kernel/yama/ptrace_scope
dependendo de seus requisitos. Muitos sistemas agora têm como padrão 1
ou superior.
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.
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
.
Você pode anexar a um processo em execução com gdb -p PID
.
Sim. Você pode fazer:
gdb program_name program_pid
Um atalho seria (supondo que apenas uma instância esteja em execução):
gdb program_name `pidof program_name`
program_name
funciona se você estiver no mesmo diretório que o binário. Acho que um caminho para o binário funcionaria se você estiver em um diretório diferente.
-p
na frente de program_id
? Além disso, pode ser necessário executar gdb com sudo para anexar a um processo em execução.
O comando a ser usado é gdb attach pid
onde pid é o id do processo ao qual você deseja anexar.
Sim você pode. Suponha que um processo foo
esteja em execução ...
ps -elf | grep foo procure o número PID gdb -a {número PID}
Se quisermos anexar um processo, esse processo deve ter o mesmo dono. A raiz pode ser anexada a qualquer processo.
ps -elf não parece mostrar o PID. Eu recomendo usar em seu lugar:
ps -ld | grep foo
gdb -p PID
A maneira mais fácil é fornecer a identificação do processo .
gdb -p `pidof your_running_program_name`
Obtenha a lista completa de opções no man gdb
comando.
Caso haja vários processos para o mesmo programa em execução, o seguinte comando listará os processos.
ps -C program -o pid h
<number>
Em seguida, o id (número) do processo de saída pode ser usado como argumento para gdb.
gdb -p <process id>