본문 바로가기
IT

리눅스에서 DDD 또는 GDB 디버거가 동작하지 않을 때 - ptrace: Operation not permitted 에러

by eddy's warehouse 2024. 1. 29.

C/C++ 프로그램을 디버깅하려고하는데 “ptrace: Operation not permitted” 에러가 발생했습니다. 이 에러는 주로 두 가지 원인으로 발생합니다. 이 에러의 발생 원인과 처리 방법에 대해서 알아보겠습니다. 

리눅스에서 DDD 또는 GDB 디버거가 동작하지 않을 때 - ptrace: Operation not permitted 에러 썸네일

보안 제한으로 인한 ptrace에러

Linux 시스템에서는 보안상의 이유로 ptrace 작업을 제한할 수 있습니다. 이는 /proc/sys/kernel/yama/ptrace_scope 설정을 통해 조정할 수 있습니다. 이 설정이 0이 아닌 경우, ptrace 작업은 제한될 수 있습니다. 이를 해결하기 위해선, root 사용자로 로그인하여 해당 설정을 0으로 변경하거나, 프로그램을 root 사용자로 실행해야 합니다.

 

제가 사용하는 리눅스의 ptrace_scope를 찾아보니 다음과 같이 1로 되어있습니다.

% cat /proc/sys/kernel/yama/ptrace_scope
1

이 값은 sudo로 수행해도 권한 에러가 발생합니다. 

$ sudo echo "0" > /proc/sys/kernel/yama/ptrace_scope
-bash: /proc/sys/kernel/yama/ptrace_scope: Permission denied


root로 로그인해서 수정해 주었습니다. 

$ sudo su
[sudo] password for admin:
# echo "0" > /proc/sys/kernel/yama/ptrace_scope
# cat /proc/sys/kernel/yama/ptrace_scope
0

 

저의 경우 위와 같이 수정해주니 DDD와 gdb에서 정상적으로 디버깅이 가능해 졌습니다. 

 

이 문제가 발생한 이유는 얼마전 정전으로인해 리눅스 서버가 재부팅 되었기 때문인 것으로 보입니다. 

/proc/sys/kernel/yama/ptrace_scope 파일의 값은 리눅스가 재부팅되면 초기화됩니다. 이 파일은 RAM에 저장되므로 영구적이지 않습니다.

그러므로, 이 값을 영구적으로 변경하려면 /etc/sysctl.d/xxx-sysctl.conf 파일을 수정하여 초기값을 설정할 수 있습니다. 이 파일에서 kernel.yama.ptrace_scope 값을 원하는 값(예: 0)으로 설정하면, 시스템이 재부팅된 후에도 이 설정이 유지됩니다. 이렇게 하면 ptrace 작업에 대한 제한을 조정할 수 있습니다.

제 리눅스의 경우 아래와 같이 99-sysctl.conf가 있어서 해당 파일의 끝에 다음과 같이 지정해 주었습니다. 

# vi /etc/sysctl.d/99-sysctl.conf

kernel.yama.ptrace_scope 값 지정 예시

중복 추적 시 에러

 

ptrace를 사용하여 프로세스를 추적할 때, 이미 추적 중인 프로세스를 다시 추적하려고 하면 이 에러가 발생할 수 있습니다. 예를 들어, PTRACE_TRACEME를 호출한 후에 PTRACE_ATTACH를 호출하면, 이미 추적 중인 프로세스를 다시 추적하려고 하므로 에러가 발생합니다. 이를 해결하기 위해서는, PTRACE_ATTACH 대신 waitpid를 사용해야 합니다.

결론적으로 디버거나 다른 디버깅 관련 툴을 특정 프로세스에 붙여 놓고 있다면 다시 디버거를 거는 것은 이와 같은 에러가 나타날 수 있습니다. 

참고로 valgrind를 실행중에는 디버거를 함께 실행하지 못합니다. 

이러한 문제를 해결한 후에도 여전히 문제가 발생한다면, 프로그램의 권한, SELinux 설정, AppArmor 프로파일 등을 확인해 봐야 한다고 합니다. 

facebook twitter kakaoTalk kakaostory naver band shareLink