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


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.

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


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`

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.


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}

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.


2

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

ps -ld | grep foo
gdb -p PID

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>
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.