소개
컴파일러 최적화 과정에서 발생하는 디버깅 정보(Debug Information)의 불일치 문제를 딥러닝 모델(SLNet, MapNet)을 활용해 해결하는 방법을 다룬 연구를 정리한 글입니다.
1. 배경 지식
1.1 Compiler Toolchain
Compiler Toolchain은 소스 코드를 실행 가능한 프로그램으로 변환하고,
디버깅 및 성능 분석을 가능하게 하는 개발 도구 집합입니다.
- 구성 요소: Compiler, Linker, Debugger, Profiler 등
- 참고 링크
1.2 Debug Information
프로그램이 컴파일된 이후, 디버깅 과정에서 사용되는 정보입니다.
- 변수 정보: 변수명, 타입, 저장 위치
- 함수 정보: 함수명, 시작/종료 주소, 매개변수
- 소스 코드 매핑: 오브젝트 코드와 소스 코드 라인 매핑 정보
1.3 Compiler Optimization
컴파일러는 실행 효율성을 높이기 위해 다양한 최적화 옵션을 제공합니다.
- 예: GCC/Clang의
-O0(최적화 없음),-O3(최대 최적화),-Og(디버깅 친화 최적화) - 최적화 수준이 높을수록 원본 코드와 생성된 기계어 간 차이가 커져 디버깅 정보의 정확성이 떨어집니다.
2. 문제 정의
-Og와 같은 디버깅 친화 옵션을 사용하더라도, 실제 Debug Information 정확도가 낮은 경우가 많습니다.- 기존 검증 방식은 개발자가 불변식(검사 요소)을 직접 정의해야 하며, 이는 확장성과 자동화 측면에서 한계가 있습니다.
이 논문은 불변식을 직접 정의하지 않고, 비지도 학습(Unsupervised Learning)을 통해 Debug Information의 오류를 탐지하는 방법을 제안합니다.
3. 제안 방법
3.1 데이터 생성 (Csmith)
- 컴파일러나 디버거 자체의 버그 영향을 최소화하기 위해 Csmith로 프로그램을 생성
- Csmith는 정의되지 않은 동작(Undefined Behavior)이 없는 C 코드를 생성하여, 실행 경로(Debug Trace)가 의미 있고 실제 동작을 정확히 반영하게 합니다.
3.2 Debug Trace 생성
- 최적화된 프로그램(Opt)에 디버거를 이용해 명령어 단위 실행
- 실행 경로를
T(opt) = [s0, s1, ..., sn]형태로 기록 - 각 step에서 두 가지 정보 저장:
- Line(s): 해당 어셈블리 실행이 매핑되는 C 코드 라인
- Asm(s): 실행되는 어셈블리 코드
3.3 SLNet
- 입력: 함수별 실행 소스 코드 라인 시퀀스
L(Tf) - 학습 방식: Masked Source Language Modeling
- 일부 토큰을 마스킹 후 예측
- 예측값과 실제값의 차이가 크면, 해당 라인이 잘못된 문맥에서 사용된 것으로 간주
- 오류 점수: 함수 내 모든 라인 평균 오차 → 최댓값을 함수 점수로 사용
3.4 MapNet
- 목표: Assembly ↔ Source Mapping 학습
- Task 1: Assembly/Source Mapping Prediction
- BERT의 NSP(Next Sentence Prediction) 기법으로 매핑 여부 이진 분류
- Task 2: Masked Assembly Language Modeling
- Assembly 코드에 마스킹 후 예측
- 최종 점수: 함수별 매핑 오류 확률의 최댓값
4. 평가 데이터셋
- Train Dataset: Csmith 생성 데이터
- Synthetic Evaluation Data:
- Swap Source: 소스 라인 교체
- Swap Assembly: 어셈블리 명령 교체
- Remove Step: 실행 스텝 제거
- Real Bug Data:
- LLVM Storage에 보고된 실제 버그 42건
- Bugged 버전 vs Bug-Free 버전 비교
5. 실험 결과
- SLNet과 MapNet 모두 기존 불변식 기반 방식 대비 높은 오류 탐지율을 보였습니다.
- 실제 LLVM 버그 사례에서 잘못된 매핑을 성공적으로 식별했습니다.
6. 결론 및 향후 과제
- 본 연구는 불변식 정의 없이 Debug Information 오류를 자동 탐지할 수 있음을 보였습니다.
- 향후에는 다른 언어와 컴파일러 환경으로 확장 가능성이 있습니다.
참고자료
- The Toolchain Overview
- LLVM Storage Bug Database
발표 자료
- 자세한 내용은 논문이나 아래 발표 자료로 확인 가능합니다.