1P by neo 2달전 | favorite | 댓글 1개
  • 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가 있음
Hacker News 의견
  • 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 관련 문제가 해결되었는지 궁금함