gdbgui에서 사용자 정의 변수 포맷터 개발 가이드

gdbgui는 C, C++, Go, Rust, Fortran 등의 언어를 위한 브라우저 기반 GDB 프론트엔드로, 중단점 설정, 스택 확인, 데이터 구조 시각화 등의 기능을 제공한다. 복잡한 데이터 구조를 디버깅할 때 기본 출력은 종종 비직관적이다. 이때 사용자 정의 변수 포맷터를 통해 가독성 있는 형태로 변수를 표시할 수 있으며, 디버깅 효율을 크게 향상시킬 수 있다.

사용자 정의 포맷터의 필요성

예를 들어 연결 리스트나 트리와 같은 커스텀 자료구조는 기본 GDB 출력으로는 메모리 주소나 16진수 값만 보여주기 때문에 문제 분석에 어려움이 있다. 포맷터를 통해 이러한 값을 계층적이고 의미 있는 형태로 변환하면 디버깅 속도가 향상된다.

작동 원리

gdbgui의 포맷팅 기능은 GDB의 Python API를 기반으로 한다. 특정 타입의 변수에 대해 Python 클래스를 정의하고, 이를 GDB 시작 시 로드함으로써 해당 타입의 변수가 나타날 때마다 자동으로 포맷팅 규칙을 적용한다.

포맷터 개발 단계

1. 환경 준비

다음 도구들이 설치되어 있어야 한다:

  • Python 3.6 이상
  • GDB 7.11 이상
  • 최신 버전의 gdbgui

2. 포맷터 스크립트 작성

프로젝트 내에 custom_formatters 디렉터리를 만들고, 예제 스크립트 my_formatters.py를 생성한다:

import gdb

class CustomTypePrinter:
    def __init__(self, value):
        self.value = value

    def to_string(self):
        active_status = "active" if int(self.value["active"]) else "inactive"
        return f"CustomType(value={self.value['value']}, status={active_status})"

def build_pretty_printer():
    pp = gdb.printing.RegexpCollectionPrettyPrinter("my_library")
    pp.add_printer("CustomType", "^CustomType$", CustomTypePrinter)
    return pp

gdb.printing.register_pretty_printer(gdb.current_objfile(), build_pretty_printer())

3. GDB 설정 파일 구성

홈 디렉터리의 .gdbinit 파일에 다음 줄을 추가하여 스크립트를 로드한다:

source /path/to/custom_formatters/my_formatters.py

4. gdbgui에서 확인

다음 명령으로 gdbgui를 실행하고 대상 프로그램을 로드한다:

gdbgui --args ./your_program

디버깅 중 CustomType 인스턴스가 등장하면, 정의한 포맷터에 따라 가독성 높은 형태로 표시된다.

복잡한 자료구조 처리

연결 리스트나 트리와 같은 재귀적 구조는 children() 메서드를 구현해 계층적으로 표현할 수 있다:

class ListNodePrinter:
    def __init__(self, val):
        self.val = val

    def to_string(self):
        return "ListNode"

    def children(self):
        node = self.val
        idx = 0
        while node and int(node):
            yield (f"[{idx}]", node["data"])
            node = node["next"]
            idx += 1

테스트 방법

포맷터를 즉시 테스트하려면 다음과 같이 GDB를 실행할 수 있다:

gdb -ex "source my_formatters.py" -ex "break main" -ex "run" your_program

gdbgui에서는 "Locals" 또는 "Expressions" 패널을 통해 실시간으로 포맷팅 결과를 확인할 수 있다.

배포 및 공유

완성된 포맷터는 다음 방법으로 공유할 수 있다:

  • gdbgui 저장소에 PR 제출
  • 별도의 GDB pretty-printer 플러그인으로 배포
  • 팀 내부 문서에 포함

태그: gdb gdbgui pretty-printer debugging C++

9월 11일 02:53에 게시됨