
GCC는 다양한 소스 코드를 컴파일할 때 매우 유용한 도구입니다. GCC를 사용할 때는 여러 가지 플래그를 활용할 수 있으며, 그중 하나가 바로 -g 플래그입니다. 컴파일 명령어에 특정 플래그를 추가하면 코드에서 어떤 결과물을 얻고 싶은지 명확하게 지정할 수 있습니다. 이 글에서는 GCC -g 플래그에 대해 자세히 알아보고, 이 플래그가 무엇인지, 어떤 장점이 있는지, 그리고 실제 예제를 통해 어떻게 활용하는지 살펴보겠습니다.
GCC -g 플래그란 무엇인가?
코드 컴파일 과정에는 프로그램 내에서 발생할 수 있는 오류를 디버깅하는 작업도 포함됩니다. 코드에 대한 디버깅 정보를 얻고 싶다면 반드시 GCC -g 플래그를 사용해야 합니다.
-g 옵션을 사용하면 코드를 컴파일하는 동안 추가적인 디버깅 정보가 함께 생성되어, 이후 디버깅 작업을 훨씬 수월하게 진행할 수 있습니다. 개발자 입장에서 -g 플래그는 코드를 이해하고 손쉽게 디버깅할 수 있도록 도와주는 필수적인 도구입니다. 기본 사용 문법은 다음과 같습니다:
gcc -g -o output-file input-program
여기서 출력 파일(output-file)은 컴파일된 프로그램의 이름이며, 입력 프로그램(input-program)은 컴파일하려는 대상 코드입니다.
개발자들은 프로그램이 의도대로 동작하도록 보장하기 위해 많은 디버깅 작업을 수행합니다. 디버깅은 문제를 식별하고 수정하는 데 필수적인 과정이며, GCC -g 플래그는 개발자가 프로그램을 원활하게 다룰 수 있도록 다양한 이점을 제공합니다.
GCC -g 플래그의 주요 장점
1. 스택 트레이스(Stack Trace) 생성
스택 트레이스는 프로그램 실행 중 발생하는 활성 스택 프레임에 대한 보고서입니다. 프로그램이 충돌하면 코드가 깨진 지점들에 대한 스택 트레이스를 확인할 수 있어, 오류가 어디에서 발생했는지와 이를 어떻게 수정해야 하는지 파악할 수 있습니다. 또한 스택 트레이스는 오류가 발생한 시점의 프로그램 상태 순서도 보여주기 때문에, 오류 발생 전의 이벤트 흐름과 해결 방법을 쉽게 추적할 수 있습니다.
2. 변수 검사(Variable Inspection)
-g 플래그를 추가하면 생성되는 디버깅 정보를 통해 런타임 중 프로그램 내 변수들의 값을 검사할 수 있습니다. 실행 시점에 변수들이 어떤 상태에 있는지 확인할 수 있으므로, 오류가 발생하기 전 여러 지점에서 프로그램의 동작을 손쉽게 이해할 수 있습니다.
3. 심볼릭 정보(Symbolic Information)
-g 플래그를 사용하면 소스 코드와 컴파일된 바이너리를 연결해 주는 심볼릭 정보를 얻을 수 있습니다. 이 심볼릭 정보에는 줄 번호, 변수 이름 등이 포함됩니다. 덕분에 프로그램의 실행 흐름을 원본 코드와 쉽게 매핑할 수 있어 분석과 디버깅이 한결 간편해집니다.
4. 조건부 중단점(Conditional Breakpoints)
GDB 같은 디버거를 사용하려면 -g 플래그로 생성한 디버깅 정보가 필요합니다. 이 정보를 바탕으로 소스 코드에 중단점을 설정할 수 있으며, 개발자는 프로그램이 멈춰야 할 조건이나 구간을 정의할 수 있습니다. 따라서 중단점을 설정해 어떤 부분이 오류를 일으키는지 검사함으로써 코드를 효율적으로 디버깅할 수 있습니다. 전체 코드를 일일이 확인하는 것보다 중단점을 활용한 프로그램 분석이 훨씬 쉽습니다.
GCC -g 플래그 실전 예제
GCC -g 플래그의 장점을 알았으니, 이제 이를 활용해 디버깅을 어떻게 간소화할 수 있는지 살펴보겠습니다. 여기서는 "linuxhint.c"라는 C 소스 파일을 사용합니다.
다음 명령어로 GCC -g 플래그를 사용해 컴파일합니다:
gcc -g -o demo1 linuxhint.c

-g 플래그를 추가하면 디버깅 정보를 포함하는 바이너리 파일이 생성되며, 이 파일을 디버거와 함께 사용할 수 있습니다. 여기서는 생성된 바이너리 파일의 이름을 "demo1"로 지정했습니다. 이제 GNU 디버거(GDB)와 함께 사용하는 예제를 진행해 보겠습니다.
아래 이미지와 같이 디버거를 실행합니다:

GNU 디버거가 열리면 디버깅 작업을 진행할 수 있습니다. 예를 들어, 다음 예제에서는 15번 줄에 중단점을 설정한 후, 해당 중단점과 함께 프로그램을 실행하고 프로그램 내 여러 변수들을 검사했습니다.

GCC -g 플래그 덕분에 구체적인 디버깅 정보가 있을 때 디버거를 쉽게 이해하고 활용할 수 있습니다. 이것이 바로 GCC -g 플래그의 사용 방법입니다.
결론
GCC -g 플래그는 프로그램을 분석하고 디버깅하는 데 활용할 수 있는 디버깅 정보를 생성하는 데 매우 유용합니다. 이 글에서는 GCC -g 플래그의 장점을 설명하고, 프로그램 컴파일 시와 디버거 사용 시 이를 어떻게 활용하는지 예제를 통해 살펴보았습니다.
저자 소개

Denis Kariuki
Denis는 네트워킹과 사이버 보안에 열정을 가진 컴퓨터 과학자입니다. 터미널을 사랑하며 Linux 사용을 취미로 삼고 있고, Linux와 컴퓨팅 관련 팁과 아이디어를 공유하는 일에 큰 열정을 가지고 있습니다.