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

66

Eu recentemente atualizei de 10.04 para 11.04 e o gdb não me permitirá mais anexar aos processos. Recebo o erro

Attaching to process 10144 Could not attach to process. If your uid matches the uid of the target process, check the setting of /proc/sys/kernel/yama/ptrace_scope, or try again as the root user. For more details, see /etc/sysctl.d/10-ptrace.conf ptrace: Operation not permitted.

Como faço para corrigir isso para que eu possa depurar novamente sem o sudo?

    
por Andrew Redd 10.05.2011 / 00:52

2 respostas

105

No Maverick Meerkat (10.10) o Ubuntu introduziu um patch para proibir o rastreamento de processos não-filhos por usuários não-root - ie. somente um processo que é pai de outro processo pode rastreá-lo para usuários normais - enquanto o root ainda pode rastrear cada processo. Daí porque você pode usar o gdb para anexar via sudo ainda.

Você pode desativar temporariamente esta restrição (e reverter para o comportamento antigo, permitindo que seu usuário ptrace (gdb) qualquer um dos seus outros processos):

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

Para ler

kernel.yama.ptrace_scope = 0

Para entender o motivo da mudança, veja o wiki do Ubuntu

    
por alexmurray 10.05.2011 / 04:08
3

Se você preferir deixar /proc/sys/kernel/yama/ptrace_scope definido para seu valor padrão de 1 , como alternativa, considere usar gdb para executar o programa que deseja depurar. Você pode então abrir o depurador simplesmente pressionando ^C . Por exemplo, para depurar o 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/sleep foi (sem surpresa) compilado sem informações de depuração, o backtrace acima contém informações mínimas.

    
por mpb 24.06.2014 / 01:17