Posso usar o GDB para depurar um processo em execução?

110

No Linux, posso usar o GDB para depurar um processo que está em execução?

Justin Ethier
fonte

Respostas:

88

Sim. Use o attachcomando. Confira este link para mais informações. Digitar help attachem 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 o directorycomando " "). Você também pode usar o filecomando " " 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_scopedependendo de seus requisitos. Muitos sistemas agora têm como padrão 1ou 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.
Carl Norum
fonte
8
O link está quebrado :( Do meu ponto de vista, gosto de respostas como esta de J. Polfer . Saúde;)
olibre
Eu consertei o link.
Attie
isso também funciona para um pid de um processo em um destino remoto?
Bionix1441
Você deve executar um servidor de depuração no destino remoto; depois disso, deve ser o mesmo.
Carl Norum
A bandeira pode ser alterada usando echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope.
Daisuke Aramaki
108

Você pode anexar a um processo em execução com gdb -p PID.

Nikolai Fetissov
fonte
24

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`
J. Polfer
fonte
Eu não sei o que isso faz, mas com certeza não funciona para mim. Diz que <program_pid> não existe.
Coruja de
2
Acho que isso funciona melhor, pois carrega a tabela de símbolos além de anexar ao processo. Deve-se notar que program_namefunciona 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.
KarateSnowMachine
Você não esqueceu o -pna frente de program_id? Além disso, pode ser necessário executar gdb com sudo para anexar a um processo em execução.
mxmlnkn
15

O comando a ser usado é gdb attach pidonde pid é o id do processo ao qual você deseja anexar.

David Kanarek
fonte
3

Sim você pode. Suponha que um processo fooesteja em execução ...

ps -elf | grep foo

procure o número PID

gdb -a {número PID}
t0mm13b
fonte
5
Em qual distribuição você está executando? Usando uma versão recente do Fedora, 'gdb -a' exibe um erro "opção -a é ambígua".
Justin Ethier
1
o argumento oficial é -p / - pid
Mahmoud Al-Qudsi
3

Se quisermos anexar um processo, esse processo deve ter o mesmo dono. A raiz pode ser anexada a qualquer processo.

Milan Kerslager
fonte
2

ps -elf não parece mostrar o PID. Eu recomendo usar em seu lugar:

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

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

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>
shuva
fonte