# C/C++용 rr – 기록 및 재생 디버거

> Clean Markdown view of GeekNews topic #15952. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=15952](https://news.hada.io/topic?id=15952)
- GeekNews Markdown: [https://news.hada.io/topic/15952.md](https://news.hada.io/topic/15952.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-07-22T09:53:24+09:00
- Updated: 2024-07-22T09:53:24+09:00
- Original source: [rr-project.org](https://rr-project.org/)
- Points: 1
- Comments: 1

## Topic Body

- # 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가 있음

## Comments



### Comment 27442

- Author: neo
- Created: 2024-07-22T09:53:25+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=41023547) 
- GDB는 이미 역디버깅 기능을 제공하고 있음
- rr은 더 많은 기능과 유연성을 제공함
- rr을 사용하여 큰 코드베이스를 역공학하는 데 성공적이었음
- 디버거는 심볼 목록과 시스템 호출 이해가 필요함
- rr이 Rust, Zig, Odin, Nim과 같은 언어에서도 작동하는지 궁금함
- Python, JS, C#과 같은 관리 메모리 언어에서는 작동하지 않을 것임
- Rust로 포팅을 시도한 프로젝트가 있었으나 중단되었음
- C++에서 Rust로의 재작성의 영향과 이점에 대한 비교 연구가 흥미로울 것임
- rr은 매우 유용하지만 동시성 버그를 재현하지 못하는 경우가 많음
- 일부 언어가 rr을 도구에 직접 통합하면 매우 유용할 것임
- rr을 사용한 C/C++ 디버깅은 매우 강력하며 디버깅 과정을 크게 개선함
- Pernosco는 rr을 기반으로 하여 전체 프로그램 실행의 쿼리 가능한 데이터베이스를 추가함
  - 잘못된 값을 클릭하면 그 값이 어디서 왔는지 즉시 설명해줌
  - 코드 이해 없이 디버거에게 실제로 무슨 일이 일어났는지 물어볼 수 있음
- C/C++ 코드가 Python에서 호출되는 dll/so로 컴파일된 경우에도 사용할 수 있는지 궁금함
- rr의 Ryzen CPU 관련 문제가 해결되었는지 궁금함
