C/C++ 프로그램을 디버깅하려고하는데 “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
중복 추적 시 에러
ptrace를 사용하여 프로세스를 추적할 때, 이미 추적 중인 프로세스를 다시 추적하려고 하면 이 에러가 발생할 수 있습니다. 예를 들어, PTRACE_TRACEME를 호출한 후에 PTRACE_ATTACH를 호출하면, 이미 추적 중인 프로세스를 다시 추적하려고 하므로 에러가 발생합니다. 이를 해결하기 위해서는, PTRACE_ATTACH 대신 waitpid를 사용해야 합니다.
결론적으로 디버거나 다른 디버깅 관련 툴을 특정 프로세스에 붙여 놓고 있다면 다시 디버거를 거는 것은 이와 같은 에러가 나타날 수 있습니다.
참고로 valgrind를 실행중에는 디버거를 함께 실행하지 못합니다.
이러한 문제를 해결한 후에도 여전히 문제가 발생한다면, 프로그램의 권한, SELinux 설정, AppArmor 프로파일 등을 확인해 봐야 한다고 합니다.
'IT' 카테고리의 다른 글
클라우드 라이선스 정책 BYOL과 Pay As You Go란? - 오라클 클라우드 (2) | 2024.01.30 |
---|---|
리눅스 네트워크 수신 패킷만 drop하도록 시뮬레이션하는 방법 (2) | 2024.01.29 |
구글 코랩에서 스테이블 디퓨전 실행하고 접속하기 (1) | 2024.01.27 |
github private repository clone에러 시 문제 해결하기 (0) | 2024.01.27 |
C/C++ 프로그래밍 오류 검출 툴 - valgrind 메모리 오류 상세히 보기 (0) | 2024.01.25 |