C++ 디버거 완전 정복: GDB, LLDB, WinDbg부터 디버깅 심볼까지

gigyesik·2025년 7월 2일

developer-roadmap-c++

목록 보기
16/20

C++ 디버거 완전 정복: GDB, LLDB, WinDbg부터 디버깅 심볼까지

디버깅은 C++ 개발에서 절대 빠질 수 없는 필수 스킬이다. 버그를 추적하고, 프로그램의 흐름을 관찰하고, 변수 값을 직접 들여다보며 문제를 해결하는 데 있어 디버거는 강력한 도구다.

이번 글에서는 C++에서 자주 사용되는 주요 디버거들과 각각의 사용 방법, 그리고 디버깅 심볼, 디버깅 메시지까지 정리해본다.


🔧 대표적인 C++ 디버거들

1. GDB (GNU Debugger)

리눅스 환경에서 가장 널리 쓰이는 CLI 기반 디버거.

g++ -g main.cpp -o main    # 디버깅 정보 포함하여 컴파일
gdb ./main                 # gdb 실행
(gdb) break main           # main 함수에 중단점
(gdb) run                  # 프로그램 실행
(gdb) next                 # 다음 줄 실행

2. LLDB

LLVM 기반 디버거로, macOS 및 iOS 개발 환경에서 많이 사용된다.

clang++ -g main.cpp -o main
lldb ./main
(lldb) breakpoint set --name main
(lldb) run
(lldb) next

3. Microsoft Visual Studio Debugger

GUI 환경에서 강력한 기능 제공. Visual Studio 내에서 F5, F10, F11 단축키를 활용하여 디버깅 가능.

4. WinDbg

Windows SDK에 포함된 고급 디버거로, 커널 모드와 사용자 모드 모두 지원.

.sympath SRV*C:\symbols*http://msdl.microsoft.com/download/symbols
.reload /f
  • g: 실행
  • bp <주소>: 중단점 설정
  • k: 호출 스택 확인
  • t, p: 한 줄씩 실행 (trace/proceed)

📦 디버깅 심볼(Debugging Symbols)

디버깅 심볼은 컴파일된 바이너리에 변수명, 함수 구조 등의 정보를 추가하는 역할을 한다.

🔹 내부 디버깅 심볼 생성 (g++)

g++ -g -o my_program my_program.cpp

🔹 외부 심볼로 분리 (-gsplit-dwarf)

g++ -g -gsplit-dwarf -o my_program my_program.cpp

심볼 제거 시:

strip --strip-debug my_program

📣 디버거 메시지의 종류

디버거는 코드 실행 중 다양한 메시지를 통해 오류를 알려준다.

✅ 오류 메시지 (Error)

test.cpp:6:5: error: 'cout' was not declared in this scope

⚠️ 경고 메시지 (Warning)

test.cpp:6:17: warning: comparison between signed and unsigned

💡 정보 메시지 (Info)

Breakpoint 1, main () at test.cpp:5

🧪 예제: GDB로 디버깅

#include <iostream>

int main() {
    int num1 = 10;
    int num2 = 0;
    int result = num1 / num2;

    std::cout << "Result: " << result << '\n';
    return 0;
}
g++ -g -o test test.cpp
gdb ./test
(gdb) run

Program received signal SIGFPE, Arithmetic exception.
0x00005555555546fb in main () at test.cpp:7

위와 같이 0으로 나누기 오류가 발생한 위치를 정확하게 찾아준다.


✨ 마무리

C++에서의 디버깅은 단순히 버그를 잡는 것을 넘어서, 코드 흐름과 동작 원리를 파악하는 데 큰 도움을 준다. GDB, LLDB, WinDbg 등 다양한 디버거를 잘 활용하면 복잡한 문제도 효율적으로 해결할 수 있다.

profile
Server Dev

0개의 댓글