업그레이드 후 gdb는 프로세스에 연결되지 않습니다


67

방금 최근 10.04에서 11.04로 업그레이드했으며 gdb에서 더 이상 프로세스에 연결할 수 없으므로 오류가 발생합니다.

프로세스 10144에 첨부 프로세스에 첨부 할 수 없습니다. uid가 대상 프로세스의 uid와 일치하면 / proc / sys / kernel / yama / ptrace_scope의 설정을 확인하거나 루트 사용자로 다시 시도하십시오. 자세한 내용은 /etc/sysctl.d/10-ptrace.conf ptrace : 작업이 허용되지 않음을 참조하십시오.

sudo없이 다시 디버깅 할 수 있도록이 문제를 어떻게 해결합니까?

답변:


106

Maverick Meerkat (10.10)에서 우분투는 루트가 아닌 사용자가 자식 프로세스가 아닌 프로세스를 추적 할 수 없도록하는 패치를 도입했습니다. 다른 프로세스의 부모 인 프로세스 만 일반 사용자를 위해 프로세스를 추적 할 수 있지만 루트는 여전히 모든 프로세스를 ptrace 할 수 있습니다. 따라서 왜 gdb를 사용하여 sudo를 통해 첨부 할 수 있습니까?

다음을 수행하여이 제한을 일시적으로 비활성화하고 사용자가 다른 프로세스를 ptrace (gdb) 할 수 있도록하는 이전 동작으로 되돌릴 수 있습니다.

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

/etc/sysctl.d/10-ptrace.conf를 영구적으로 편집하고 행을 변경하려면 다음을 수행하십시오.

kernel.yama.ptrace_scope = 1

읽다

kernel.yama.ptrace_scope = 0

이 변경이 이루어진 이유에 대한 배경 지식은 우분투 위키를 참조하십시오.


4
감사. 사용자 bin 파일의 명령에 임시를 추가하여 켜고 끌 수 있습니다.
Andrew Redd

/etc/sysctl.d/10-ptrace.conf파일을 편집 합니다. 그것은 나를 위해 완벽하게 작동합니다. :)
soroosh

8
/etc/sysctl.d 파일을 약간 수정했다면, "sudo service procps restart"
Frankster

@alexmurray-도움이되는 답변은 변경 사항을 적용하기 위해 어떤 종류의 재시작이 필요하다는 점도 알아야합니다 /etc/sysctl.d. 저에게는 시스템을 다시 시작하는 것이 충분했지만 너무 과도했을 수 있습니다. 위의 Frankster의 의견을 참조하십시오. 다시 시작한 후의 값 /etc/sysctl.d이에 복사됩니다 /proc/sys/kernel/yama/ptrace_scope. (또한 내 경우에는 sudo로도 ptrace_scope를 직접 편집 할 수 없습니다.)
Andy Thomas

재부팅이 필요하지 않습니다. 를 실행 sysctl -p하여 /etc/sysctl.conf및의 변경 사항을 적용하십시오 /etc/sysctl.d/*. Ubuntu 15.04 Vivid에서는 이러한 특정 변경 사항에 대한 파일은 다음과 같습니다./etc/sysctl.d/10-ptrace.conf
Mircea Vutcovici

3

당신이 떠나 선호하는 경우 /proc/sys/kernel/yama/ptrace_scope의 디폴트 값으로 설정 1한 다음 해결 방법으로는 사용을 고려할 수 gdb디버깅 할 프로그램을 실행합니다. 그런 다음을 눌러 간단히 디버거를 불러올 수 있습니다 ^C. 예를 들어, (지루한) 프로그램으로 디버그 sleep 60하려면 다음을 수행하십시오.

$ gdb -q sleep -ex 'run 60'

다음은 완전한 예입니다.

$ 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

이후 /bin/sleep(당연히) 디버깅 정보없이 컴파일하고, 상기 역 추적 최소 정보를 포함한다.


2
당신은하지 않았다 부착 당신이 시작 을. 이 경우 디 gdb버기의 직접적인 부모이므로로도 디버깅 할 수있는 모든 권한 이 있기 때문에 상당히 다릅니다 ptrace_scope==1. 그것은 당신이 아닌 경우 작동하지 않을 것입니다 부착 , 즉 같은 한sleep 60& gdb -ex "attach $!"
루슬란

Ruslan의 제안 된 (카운터?) 예 sleep 60& gdb -ex "attach $!"는 "gdb를 사용하여 프로그램을 실행하는"것이 아니기 때문에 제 작업에 대한 반박이 아닙니다. Ruslan의 예제는 을 사용 하여 먼저 실행 sleep한 다음 실행하는 것 gdb입니다. 내 해결 방법이 효과 가 있습니다. 나는 gdb실제로 아이에게 붙어 있는지 여부를 모릅니다 . 나는 아이를 디버깅 할 수있는 것에 관심이 있습니다. 내 해결 방법은 그것을 달성합니다. 그럼에도 불구하고, 나는 명확성을 위해 나의 대답을 바꾸었다.
mpb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.