본문으로 건너뛰기
cccskills
무료GitHub에 공개

dwarf-debug-format

Use when inspecting .debug_info or .debug_line sections with dwarfdump or readelf, working with split-DWARF .dwo files, setting up debuginfod, or checking how LTO and stripping affect debug info.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

설치 방법 보기

포함된 파일(2)

  • SKILL.md6.6 KB
  • agents/openai.yaml267 B

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

DWARF debug format

Contract

FieldBound contract
TriggerDWARF sections in an ELF binary need listing or reading, .dwo split files need producing or packaging, debuginfod needs configuring, or LTO and stripping change what debug info survives.
AuthorityRead-only. Emits analysis and commands for the operator to run on the target; no file writes, no rollback needed. No remote mutation.
Side effectInspection commands and a verdict in chat. Nothing is written.
DoneThe debug info question is answered from the binary's own sections, or the missing piece (.dwo, debug package, build ID) is named.

Inputs

  1. Binary or object file (required): the ELF file whose debug info is in question.
  2. Toolchain (optional): readelf and llvm-dwarfdump cover most queries; dwarfdump and eu-strip come from libdwarf and elfutils packages.
  3. Build ID (optional): needed for debuginfod lookups.

Procedure

  1. List the DWARF sections.

    readelf -S prog | grep "\.debug"
    
    SectionContents
    .debug_infoDIEs: types, variables, functions
    .debug_abbrevAbbreviation table for .debug_info
    .debug_lineSource line to address mapping
    .debug_strIdentifier strings
    .debug_loc / .debug_loclistsVariable location expressions (DWARF 4 / DWARF 5)
    .debug_ranges / .debug_rnglistsNon-contiguous address ranges (DWARF 4 / DWARF 5)
    .debug_arangesAddress to compilation unit lookup
    .debug_pubnames / .debug_namesGlobal name index (DWARF 4 / DWARF 5)
    .debug_frameDWARF call frame information; .eh_frame is the runtime unwinding variant
    .debug_addrAddress table (DWARF 5)
    .debug_line_strLine-table strings (DWARF 5)

    Done when: the present sections are listed and named.

  2. Inspect the contents.

    readelf --debug-dump=info prog      # DIEs
    readelf --debug-dump=lines prog     # line table
    llvm-dwarfdump --debug-info prog    # more readable DIE dump
    llvm-dwarfdump --statistics prog    # debug info size and quality metrics
    dwarfdump prog                      # full dump, when libdwarf's dwarfdump is installed
    

    Done when: the target section's contents are on screen.

  3. Read the DIE structure. Debug info is a tree of Debug Information Entries. Each DIE has a tag (DW_TAG_*) and attributes (DW_AT_*).

    DW_TAG_compile_unit
      DW_AT_producer  : "GNU C17 13.2.0"
      DW_AT_name      : "main.c"
      DW_AT_comp_dir  : "/home/user/project"
      DW_TAG_subprogram
        DW_AT_name    : "add"
        DW_AT_low_pc  : 0x401130        # function start
        DW_AT_high_pc : 0x401150        # function end
        DW_TAG_formal_parameter
          DW_AT_name     : "a"
          DW_AT_location : DW_OP_reg5   # x86-64 register rdi
    

    Common tags: compile_unit, subprogram, variable, formal_parameter, typedef, structure_type, member, array_type, pointer_type, base_type. Common attributes: name, type, location, low_pc, high_pc, byte_size, encoding, file, line. Done when: the DIE of interest is located and its attributes are read.

  4. Work with split DWARF. -gsplit-dwarf writes debug info to .dwo sidecars so the linker never processes it.

    gcc -g -gsplit-dwarf -O2 -c main.c -o main.o   # main.o plus main.dwo
    gcc main.o -o prog                             # prog references main.dwo
    dwarfdump prog | grep dwo_name                 # DW_AT_GNU_dwo_name holds the path
    dwp -o prog.dwp prog                           # GNU: pack .dwo files into one .dwp
    llvm-dwp -o prog.dwp prog                      # LLVM equivalent
    

    GDB resolves .dwo and .dwp files placed next to the binary. Done when: the binary links without debug input and GDB still resolves symbols.

  5. Configure debuginfod for remote symbols.

    export DEBUGINFOD_URLS="https://debuginfod.elfutils.org/"
    gdb /usr/bin/git                     # fetches missing debug info over HTTP
    debuginfod-find debuginfo <build-id-or-path>
    debuginfod-find source <build-id> /path/to/source.c
    
    (gdb) set debuginfod enabled on
    (gdb) set debuginfod verbose 1
    

    Run a private server with debuginfod -d /var/cache/debuginfod -p 8002 /path/to/binaries/ and point DEBUGINFOD_URLS at http://localhost:8002. Done when: GDB fetches symbols for a stripped system binary.

  6. Judge LTO's effect. -flto generates DWARF after link-time optimization, so merged, inlined, or eliminated entities lose their debug entries. -flto=thin (Clang) keeps more. For maximum debug info, build a separate -Og -g binary without LTO. In Rust, the dev profile already defaults to lto = "off"; enabling lto in a release profile trades debug detail for optimization. Done when: the LTO/debug tradeoff is stated for the build in question.

  7. Strip binaries while keeping symbols.

    objcopy --only-keep-debug prog prog.debug
    strip --strip-debug prog
    objcopy --add-gnu-debuglink=prog.debug prog   # GDB finds prog.debug automatically
    eu-strip -f prog.debug prog                   # elfutils: split in one step
    readelf -n prog | grep -i debug               # verify the link
    llvm-dwarfdump --statistics prog              # check what debug info remains
    size --format=SysV prog                       # section sizes
    

    Done when: the stripped binary resolves symbols through its debug link or a symbol store.

Failure and recovery

  • readelf -S shows no .debug_* sections: the binary was built without -g or was stripped. Rebuild with -g or locate the matching debug file by build ID.
  • .dwo files not found: they must sit next to the objects or be packed into a .dwp. Check DW_AT_GNU_dwo_name for the expected path.
  • debuginfod fetch fails: confirm DEBUGINFOD_URLS is set in the environment GDB inherits, and that the distro runs a server for that package.
  • LTO build loses the variable being chased: rebuild that translation unit without -flto, or debug the -Og build instead.
  • DWARF version mismatch: older tools cannot parse DWARF 5 sections. Use a current readelf or llvm-dwarfdump, or rebuild with -gdwarf-4.

Output

An answer grounded in the binary's own sections: the DIE or line-table entry found, the .dwo/debuginfod path configured, or the named reason the debug info is absent.

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

Use when explaining System V AMD64, ARM AAPCS, RISC-V psABI, stack frames, variadic calls, or FFI register rules. Not for the Rust FFI binding layer: use rust-ffi.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

OutlineDriven/odin-claude-plugin372026년 9월 29일 업데이트

Use when configuring ADC sampling time, DMA-driven ADC, calibration, or DAC channel setup on bare-metal MCUs. Not for the DMA stream itself: use dma-baremetal.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

OutlineDriven/odin-claude-plugin372026년 9월 29일 업데이트

af-xdp

무료

Use when creating AF_XDP sockets, configuring UMEM and XSK rings, writing an XDP redirect program, or choosing copy versus zero-copy mode. Not for full kernel bypass: use dpdk.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

OutlineDriven/odin-claude-plugin372026년 9월 29일 업데이트

Use when a completed session needs an agent-environment retrospective. Not for an engineering retrospective from telemetry: use engineering-retrospective.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

OutlineDriven/odin-claude-plugin372026년 9월 29일 업데이트

Use when a redacted, trimmed agent transcript must be appended to a GitHub PR or issue body, with human approval and preview. Not for automated or model-initiated insertion.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

OutlineDriven/odin-claude-plugin372026년 9월 29일 업데이트

agents-md

무료

Use when a repo needs agent setup, AGENTS.md added or made lean, CLAUDE.md audited, or agent instructions scored or pruned. Not for remote, credential, publish, deploy, or irreversible changes.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

OutlineDriven/odin-claude-plugin372026년 9월 29일 업데이트

OutlineDriven의 스킬 모두 보기

이 스킬의 문제 신고