2P by neo 2023-11-12 | favorite | 댓글 1개

Spray 디버거 소개

  • Spray는 C 코드를 위한 간단하고 이해하기 쉬운 디버거임.
  • 실행 중인 프로그램의 실행을 제어하고 상태를 검사 및 수정하는 기능 제공.
  • 디버거의 내부 작동에 대한 호기심과 디버깅을 더 접근하기 쉽게 만드는 방법 탐구 목적으로 개발 시작.

주요 기능

  • 함수, 파일 내 라인, 주소에 대한 중단점 설정.
  • 변수, 메모리 주소, 레지스터의 값 출력 및 설정.
  • C 문법 하이라이팅, 백트레이스, 단계별 실행.
  • 명령어 출력 형식을 지정하는 필터 기능.

개발 로드맵

  • 복잡한 구조체의 출력 및 수정.
  • 복잡한 구조체에 대한 문법 하이라이팅.
  • 프레임 포인터가 아닌 DWARF 기반 백트레이스.
  • 인라인 함수, 외부 라이브러리 로딩, 디버깅 중인 프로그램으로 보내진 시그널 캐치.

설치 방법

  • Spray 프론트엔드의 일부는 Scheme으로 작성되어 CHICKEN Scheme을 통해 C로 컴파일됨.
  • CHICKEN 설치 필요, libdwarf에 의존성이 있으므로 먼저 설치해야 함.
  • 저장소를 클론하고 make 명령어로 Spray를 설치.
  • $PATH에 추가하여 일반 명령어처럼 사용 가능.

Spray 사용법

  • 디버깅할 바이너리에 디버그 정보가 활성화되어 있어야 하며, 최적화를 비활성화해야 함.
  • Clang을 사용하여 프로그램을 컴파일해야 함.
  • 첫 번째 인수로 디버깅할 바이너리 이름을, 그 후의 인수로 디버깅할 프로그램의 인수를 전달.

명령어

값 읽기 및 쓰기

  • 변수, 레지스터, 주소의 값을 출력하거나 설정.
  • 레지스터 이름은 AT&T 어셈블리 문법에 따라 % 접두사 사용.
  • 값은 10진수 또는 16진수로 지정 가능.

중단점

  • 함수, 파일 내 라인, 주소에 중단점 설정 및 삭제.
  • continue 명령어로 다음 중단점까지 실행 계속.

단계별 실행

  • 다음 라인으로 이동, 함수 내부로 들어가거나 현재 함수에서 벗어남.
  • 다음 명령어로 이동, 현재 위치에서 백트레이스 출력.

필터

  • 출력 형식을 변경하는 필터 사용 가능.
  • printset 명령어 뒤에 필터를 붙여 출력 형식 변경.

기여 방법

  • 모든 기여 환영, 풀 리퀘스트 전에 로컬 테스트 스위트 실행하여 기능 파손 여부 확인.
  • 특정 값에 대한 off-by-one 오류로 인한 테스트 실패는 무시 가능.

참고 문헌

  • Sy Brand의 블로그 시리즈 "Writing a Linux Debugger", DWARF 5 표준, libdwarf 문서, Eli Bendersky의 "How debuggers work" 포스트.

GN⁺의 의견

이 글에서 가장 중요한 것은 Spray가 C 코드를 위한 사용자 친화적인 디버거라는 점이며, 디버깅을 더 접근하기 쉽게 만드는 것에 초점을 맞추고 있다는 것입니다. 초급 소프트웨어 엔지니어에게도 이해하기 쉬운 구조와 명령어를 제공함으로써, 복잡한 디버깅 작업을 보다 쉽게 할 수 있도록 돕는 것이 매력적입니다. 또한, 개발 로드맵과 기여 방법이 명확히 제시되어 있어, 오픈 소스 프로젝트에 참여하고자 하는 개발자들에게 흥미로운 기회를 제공합니다.

Hacker News 의견
  • 청소년 프로그래머의 코드가 특히 깔끔하고 일관성 있으며 모듈화가 잘 되어 있음. 이러한 프로젝트는 이진 포맷과 커널 API에 대한 비일상적인 지식을 필요로 함. 많은 "고급" 프로그래머들도 개념적인 수준에서 이와 같은 것을 구축하는 데 어려움을 겪을 수 있음.

    • 17세가 이러한 지식을 어떻게 습득하는지 궁금함. 책, 동료, 프로그래밍 클럽, 프로그래머 부모 등을 통한 것일까?
  • 젊은 프로그래머들의 코드를 읽는 것은 흥미로움. 경험은 부족하지만 상당한 수준의 지식으로 설계하는 것을 볼 수 있음. 저자는 빠르게 배우는 것 같고, 6개월의 작업 결과가 훌륭함.

  • 이러한 헌신적인 수준에 감탄함. Google Summer of Code, KDE Season of Code, Linux Foundation LFX, X.org EVoC과 같은 프로그램에 참여할 것을 추천함. 흥미로운 문제들이 많이 있음. 학생일 때 이런 프로그램들을 알았더라면 좋았을 것임. 이제는 전일제 직업을 가지고 있어 오픈 소스에 기여할 시간이 없음.

  • 프로젝트를 처음 살펴보니 잘 조직되어 있음. 칭찬할 만함.

    • 얼마나 오랫동안 프로그래밍을 해왔는지, 어떤 언어로 시작했는지 궁금함. 여러분보다 수십 년 연장자인 개발자들 중에는 Makefile을 작성할 줄 모르는 사람들이 많음.
    • 소스 코드에 인라인 이모지를 사용하는 것은 최신 유행인지, 아니면 비 ASCII 입력에 대한 주의를 기울이기 위한 것인지 궁금함.
  • 프로젝트에 대한 축하와 행운을 빔. 컴파일러는 컴퓨팅에 관심을 가지게 한 첫 번째 주제 중 하나임.

    • 여러 번 반복해서 읽은 책이 있으며, 현재 무료로 제공되고 있음. 컴파일러 부분에 관한 책이지만 디버깅에도 흥미로울 수 있음.
  • 17세 아이들도 여전히 CD를 알고 있음을 보여줌. 플로피 디스크 저장 아이콘도 아직은 구식이 아닐 수 있음.

  • 17세의 나이에 보여준 지식과 성숙함이 인상적임. 연구하고 활용하는 주제들은 대학교 수준에서 기대되며, 이 프로젝트는 대학원 수준의 과정에 속할 것임. 성공적인 경력을 기원함.

  • 젊은 시절 Turbo Pascal을 사용하여 2D 그래픽 라이브러리를 작성한 기억이 있음. 인터넷을 발견하기 전이라 개인적인 즐거움으로 끝났지만, 다른 사람들이 볼 수 있도록 만든 것에 대해 잘했다고 생각함. 코드가 깔끔하고 주석이 잘 되어 있으며 README가 명확함.

    • 작업을 세상에 내보내는 것은 두려운 일이지만, 사람들이 하는 말은 종종 그들 자신에 대한 것이기도 하므로, 그들의 말을 너무 심각하게 받아들이지 않아도 됨.
  • 프로젝트와 함께 "디버거 작성하기" 튜토리얼을 만드는 것이 지루할 수도 있지만 매우 유용할 것임.

  • 함수 이름과 인수 사이에 공백을 넣는 이유가 궁금함. 18년 동안 C 코드를 읽어온 사람으로서 이는 다소 이질적으로 느껴짐.

    • BSD 스타일을 선호하며, BSD 시스템을 사용하는 경우 'man style'을 참고하여 그 스타일을 시도해볼 것을 제안함.