-
rr 소개
- rr은 Linux에서 C/C++ 디버깅 도구로, gdb를 보완하고자 함
- 실패를 한 번 기록하고, 그 기록을 반복적으로 디버깅할 수 있음
- 동일한 실행을 매번 재현하여 디버깅 가능
- gdb를 통해 효율적인 역방향 실행 제공
-
rr 기능
- 낮은 오버헤드
- 다양한 애플리케이션 기록 및 재생 지원 (Firefox, Chrome, QEMU, LibreOffice 등)
- 다중 프로세스 워크로드 기록, 재생 및 디버깅 가능
- gdb 스크립팅 및 IDE 통합 지원
- 내구성 있고 압축된 추적 파일, 기계 간 이동 가능
- 간헐적 버그를 재현하기 위한 혼돈 모드 제공
-
rr 디버깅 경험
- 애플리케이션 기록:
rr record /your/application --args...
- 기록된 실행을 디버깅:
rr replay
- 기록된 추적을 결정론적으로 디버깅
- 일반적인 gdb 명령어 사용 가능
- 역방향 실행을 통해 빠르게 문제 지점으로 이동 가능
-
비디오
- Firefox 기록 및 재생 데모 비디오
- rr의 기본 기능을 자세히 설명하는 비디오
- Robert O'Callahan의 고급 기술 강연 비디오
-
시작하기
- 소스에서 빌드: 패키지가 작동하지 않을 경우 권장
- Fedora 및 Ubuntu에서 설치 방법 제공
-
배경 및 동기
- 간헐적 실패 디버깅을 쉽게 하기 위해 개발
- 결정론적 재생을 통해 디버깅 과정에서 얻은 정보가 유효하게 유지됨
- 역방향 실행을 통해 디버깅 과정이 더 쉬워짐
- rr은 많은 대형 및 소형 프로젝트에서 정기적으로 사용됨
-
rr의 작동 방식
- Linux 사용자 공간 프로세스를 기록하고 커널로부터의 모든 입력을 캡처
- 재생 시 명령어 수준의 제어 흐름, 메모리 및 레지스터 내용 보장
- 메모리 레이아웃, 객체 주소, 레지스터 값 등이 동일하게 유지됨
- 퍼저 및 무작위 결함 주입기와 함께 사용 시 더욱 강력해짐
-
rr의 맥락
- 기록 및 재생 디버깅은 오래된 아이디어
- Firefox에 중점을 둔 설계 목표
- 배포 가능성: 일반 Linux 커널에서 실행, 시스템 구성 변경 불필요
- 낮은 런타임 오버헤드
- 단순한 설계: 복잡한 기술 회피
-
제한 사항
- 단일 코어 머신을 에뮬레이트
- 기록 트리 외부와 메모리를 공유하는 프로세스 기록 불가
- 현대적인 x86 CPU 또는 특정 ARM CPU 필요
- 기록된 프로세스가 실행하는 모든 시스템 호출에 대한 지식 필요
- 커널 변경, 시스템 라이브러리 업데이트, 새로운 CPU 패밀리에 대응 필요
-
추가 참고 자료
- 확장 기술 보고서
- rr 위키
- 메일링 리스트 또는 chat.mozilla.org의 #rr에서 질문 가능
GN⁺의 정리
- rr은 Linux에서 C/C++ 디버깅을 위한 강력한 도구로, 결정론적 재생을 통해 디버깅 효율성을 크게 향상시킴
- 다양한 애플리케이션과 다중 프로세스 워크로드를 지원하며, 낮은 오버헤드로 실용적임
- 역방향 실행 기능을 통해 디버깅 과정이 더욱 용이해짐
- Firefox와 같은 복잡한 애플리케이션을 디버깅할 수 있어 일반적으로 유용함
- 비슷한 기능을 가진 도구로는 gdb와 Valgrind가 있음