após a atualização, o gdb não será anexado ao processo

67

Acabei de atualizar recentemente do 10.04 para o 11.04 e o gdb não me permite mais me conectar aos processos, recebo o erro

Anexando ao processo 10144 Não foi possível anexar ao processo. Se o seu uid corresponder ao uid do processo de destino, verifique a configuração de / proc / sys / kernel / yama / ptrace_scope ou tente novamente como usuário root. Para mais detalhes, consulte /etc/sysctl.d/10-ptrace.conf ptrace: Operação não permitida.

Como faço para corrigir isso para poder depurar novamente sem o sudo?

Andrew Redd
fonte

Respostas:

107

No Maverick Meerkat (10.10), o Ubuntu introduziu um patch para impedir o rastreamento de processos não-filhos por usuários não-root - ie. somente um processo que é pai de outro processo pode rastrear para usuários normais - enquanto o root ainda pode rastrear todos os processos. Por isso, você pode usar o gdb para se conectar via sudo ainda.

Você pode desabilitar temporariamente essa restrição (e reverter para o comportamento antigo, permitindo que o usuário rastreie (gdb) qualquer outro processo):

echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

Para permitir permanentemente, edite /etc/sysctl.d/10-ptrace.conf e altere a linha:

kernel.yama.ptrace_scope = 1

Ler

kernel.yama.ptrace_scope = 0

Para mais informações sobre por que essa alteração foi feita, consulte o wiki do Ubuntu.

alexmurray
fonte
4
Obrigado. Eu adicionei o temporário a um comando no meu arquivo bin do usuário para que eu possa ativá-lo e desativá-lo.
Andrew Redd
Eu edito /etc/sysctl.d/10-ptrace.confarquivo. Funciona perfeitamente para mim. :)
soroosh
8
Se você fez algumas edições em arquivos em /etc/sysctl.d, então você pode aplicá-los automaticamente com "procps serviço sudo reiniciar"
frankster
@alexmurray - Sua resposta útil também deve observar que é necessário algum tipo de reinicialização para que as alterações /etc/sysctl.dsejam efetivadas. Para mim, uma reinicialização do sistema foi suficiente, mas pode ter sido um exagero - veja o comentário do frankster acima. Após a reinicialização, o valor de /etc/sysctl.dé copiado para /proc/sys/kernel/yama/ptrace_scope. (Além disso, no meu caso eu não poderia editar ptrace_scope diretamente, mesmo com sudo.)
Andy Thomas
Não é necessário reiniciar. Basta executar: sysctl -ppara aplicar as alterações de /etc/sysctl.confe /etc/sysctl.d/*. Para que essa alteração específica, no Ubuntu 15.04 Vivid, o arquivo é/etc/sysctl.d/10-ptrace.conf
Mircea Vutcovici
3

Se você preferir deixar /proc/sys/kernel/yama/ptrace_scopedefinido como seu valor padrão 1, então, como uma solução alternativa, você pode considerar usar gdbpara executar o programa que deseja depurar. Você pode abrir o depurador simplesmente pressionando ^C. Por exemplo, para depurar no programa (chato) sleep 60, faça o seguinte:

$ gdb -q sleep -ex 'run 60'

Aqui está um exemplo completo.

$ gdb -q sleep -ex 'run 60'
Reading symbols from sleep...(no debugging symbols found)...done.
Starting program: /bin/sleep 60
^C
Program received signal SIGINT, Interrupt.
0x00007ffff7ad5d60 in __nanosleep_nocancel () at ../sysdeps/unix/syscall-template.S:81
81      ../sysdeps/unix/syscall-template.S: No such file or directory.
(gdb) backtrace
#0  0x00007ffff7ad5d60 in __nanosleep_nocancel () at ../sysdeps/unix/syscall-template.S:81
#1  0x0000000000403cd7 in ?? ()
#2  0x0000000000403b88 in ?? ()
#3  0x00000000004016c9 in ?? ()
#4  0x00007ffff7a35ec5 in __libc_start_main (main=0x401540, argc=2, argv=0x7fffffffea08, init=<optimized out>, 
    fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffe9f8) at libc-start.c:287
#5  0x00000000004017d5 in ?? ()
(gdb) continue
Continuing.
[Inferior 1 (process 3531) exited normally]
(gdb) quit

Como /bin/sleepfoi (sem surpresa) compilado sem informações de depuração, o backtrace acima contém informações mínimas.

mpb
fonte
2
Você não anexou , você começou . É bem diferente, pois nesse caso gdbé o pai direto do depurador e tem todo o direito de depurá-lo, mesmo com ele ptrace_scope==1. Não funcionaria se você anexasse , ou seja, fiz algo parecido comsleep 60& gdb -ex "attach $!"
Ruslan
O exemplo proposto por Ruslan (contador?) sleep 60& gdb -ex "attach $!"Não está "usando o gdb para executar o programa" e, portanto, não é uma refutação da minha solução alternativa. O exemplo de Ruslan é usar o shell para primeiro executar sleepe depois executar gdb. Minha solução funciona , que é o que me interessa. Eu não sei, nem me importo realmente, se é ou não gdbrealmente apegado ao seu filho. Eu me preocupo em poder depurar a criança. Minha solução alternativa realiza isso. No entanto, reformulei minha resposta para maior clareza.
mpb