
디버깅은 C++ 개발에서 절대 빠질 수 없는 필수 스킬이다. 버그를 추적하고, 프로그램의 흐름을 관찰하고, 변수 값을 직접 들여다보며 문제를 해결하는 데 있어 디버거는 강력한 도구다.
이번 글에서는 C++에서 자주 사용되는 주요 디버거들과 각각의 사용 방법, 그리고 디버깅 심볼, 디버깅 메시지까지 정리해본다.
리눅스 환경에서 가장 널리 쓰이는 CLI 기반 디버거.
g++ -g main.cpp -o main # 디버깅 정보 포함하여 컴파일
gdb ./main # gdb 실행
(gdb) break main # main 함수에 중단점
(gdb) run # 프로그램 실행
(gdb) next # 다음 줄 실행
LLVM 기반 디버거로, macOS 및 iOS 개발 환경에서 많이 사용된다.
clang++ -g main.cpp -o main
lldb ./main
(lldb) breakpoint set --name main
(lldb) run
(lldb) next
GUI 환경에서 강력한 기능 제공. Visual Studio 내에서 F5, F10, F11 단축키를 활용하여 디버깅 가능.
Windows SDK에 포함된 고급 디버거로, 커널 모드와 사용자 모드 모두 지원.
.sympath SRV*C:\symbols*http://msdl.microsoft.com/download/symbols
.reload /f
디버깅 심볼은 컴파일된 바이너리에 변수명, 함수 구조 등의 정보를 추가하는 역할을 한다.
g++ -g -o my_program my_program.cpp
g++ -g -gsplit-dwarf -o my_program my_program.cpp
strip --strip-debug my_program
디버거는 코드 실행 중 다양한 메시지를 통해 오류를 알려준다.
test.cpp:6:5: error: 'cout' was not declared in this scope
test.cpp:6:17: warning: comparison between signed and unsigned
Breakpoint 1, main () at test.cpp:5
#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 등 다양한 디버거를 잘 활용하면 복잡한 문제도 효율적으로 해결할 수 있다.