VSCode 환경에서 make로 빌드되는 c파일 gdb로 디버깅하기

2025. 6. 16. 21:19·개발이야기

이번 학기 전공 과목에서 과제를 디버깅하기 위해 설정해 둔 VSCode의 GDB 설정 파일들을 공유합니다(Cursor AI에서도 당연히 동작합니다). 과제는 C 언어로 작성해야 했으며, 미리 정의된 Makefile을 통해 코드의 빌드, 테스트, 클린 작업이 가능했습니다. 

Makefile 구성은 대략 아래와 같았습니다. program.c 파일과 관련 헤더 파일들을 하나의 목적 파일(program.o)로 컴파일한 후, 이를 실행 파일로 빌드하는 방식입니다. 특별히 주의할 점은, gcc 명령어를 실행할 때 "-g" 옵션을 넘겨주어야 디버깅가능한 파일로 빌드됩니다. 또, "-O2" 등의 옵션은 디버깅 시에 일부 값을 필터링할 수 있으니 디버깅 목적으로는 사용하지 않아야 합니다.

HEADERS = program.h headers.h

default: program

program.o: program.c $(HEADERS)
    gcc -c program.c -g -o program.o

program: program.o
    gcc program.o -o program

clean:
    -rm -f program.o
    -rm -f program

GDB가 생소하여 이 글을 찾게 된 분들을 위해 간단히 설명해보겠습니다. GDB는 C나 C++ 등의 언어로 작성된 프로그램을 디버깅하는 도구 입니다. 본래 터미널 환경에서 CLI로, 혹은 터미널 안에서 제공하는 GUI를 통해 디버깅을 해야하나, vscode의 확장을 사용하면 간편합니다. 원하는 위치에서 코드의 실행을 멈추기, 특정 시점에 변수에 저장된 값들을 읽기, 함수들의 호출 스택을 확인하기 등을 할 수 있습니다.

프로젝트의 .vscode 경로에 launch.json 이라는 파일을 추가해주어야 합니다.

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Debug with sample1",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/program",
            "args": ["-c", "1", "-d", "2"],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                { "text": "set output-radix 16" }
            ],
            "preLaunchTask": "build"
        }
    ]
}

주요 라인은 아래와 같습니다.

  • version: VSCode의 디버깅 설정이 사용하는 버전 형식.
  • name: 디버깅 설정의 이름. 여러개의 설정을 만들어서 원하는대로 실행할 수 있음.
  • type: 디버거 종류. "cppdbg"는 C++ Debugger를 사용한다는 뜻.
  • request: 디버깅 방식. "launch"는 새로운 프로그램을 실행하는 형식, "attach"는 이미 실행중인 프로세스에 붙는 형식.
  • program: 실행 파일의 이름. gcc가 빌드해준 실행파일을 의미하며, 디버깅의 대상이 됨.
  • args: 실행할 때 명령줄의 인자. 위 예시의 설정대로 디버깅하면, 다음의 명령을 실행하는 것과 동일.
    "program -c 1 -d 2"
  • stopAtEntry: 프로그램의 시작점에서 멈출지. false면 멈추고, true면 main()진입 전에 일단 정지.
  • cwd: 디버깅 시 사용할 현재 작업 디렉토리
  • environment: 실행시 설정할 환경변수
  • externalConsole: vscode의 내장 터미널을 사용할지 말지.
  • MIMode: "gdb" 외에도 "lldb"(macOS)나 "cppvsdbg"(window) 사용 가능
  • setUpCommands: GDB 시작시 자동으로 실행되는 명령
    • -enable-pretty-printing: 디버거의 변수 출력을 보기 좋게 해줌
    • set output-radix 16: 숫자 값들을 16진수로 바꿔줌
  • preLaunchTask: 디버깅 시작전에 실행할 태스크(task)의 이름(태스크에 대해서는 후술)

개인적으로 중요하다고 생각되고, 위의 설정을 복붙하되 따로 설정해주어야 하는 값들을 볼드처리해 뒀습니다. 더 자세한 옵션들은 공식 레퍼런스를 참고하세요.

마지막으로, 마지막 preLaunchTask 옵션에서 설정한 태스크를 설정해주어야 합니다. .vscode 폴더에 tasks.json을 정의합니다.

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            "command": "make clean && make",
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}

Makefile에서 정의했던 "make clean" 명령어와 "make" 명령어를 그대로 사용합니다. 위 예제는 이전 빌드 결과를 지우고, 매번 새로운 빌드로 디버깅을 수행하기 위해, 이 태스크를 사전 작업(preLaunchTask)으로 설정하였습니다.

저작자표시 (새창열림)

'개발이야기' 카테고리의 다른 글

개발 생산성을 높이는 MCP의 개념과 Cursor AI 설정법  (0) 2025.07.16
OCaml에 대해 실전 속성 압축으로 익혀보기  (0) 2025.06.22
TailwindCss로 도막도막 끊기는 스크롤 화면 구현하기: Full Page Scroll과 Scroll snap  (1) 2025.05.17
속터지는 Google Play Console 본인인증하기  (3) 2025.02.06
Cursor AI 사용 후기 - 위기의 내 밥그릇  (0) 2025.01.12
'개발이야기' 카테고리의 다른 글
  • 개발 생산성을 높이는 MCP의 개념과 Cursor AI 설정법
  • OCaml에 대해 실전 속성 압축으로 익혀보기
  • TailwindCss로 도막도막 끊기는 스크롤 화면 구현하기: Full Page Scroll과 Scroll snap
  • 속터지는 Google Play Console 본인인증하기
준별
준별
  • 준별
    준별개발
    준별
  • 전체
    오늘
    어제
    • 분류 전체보기 (58)
      • 개발이야기 (25)
        • 토막글 (11)
      • 일상이야기 (6)
      • 개인 공부 (23)
      • 생각과 기록 (2)
  • 블로그 메뉴

    • 홈
    • 방명록
    • Github
    • Linkedin
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    조합형
    데이터베이스
    zsh세팅
    전산기조직
    맥북세팅
    필수툴
    zsh-autosuggestion
    클램쉘
    http pipelining
    이산구조
    Zsh
    persistent connection
    데스크셋업
    nestjs
    k9s
    artillery
    맥북
    http3.0
    http1.0
    터미널세팅
    바이브코딩
    powerlevel10k
    http1.1
    http2.0
    정보보호개론
    맥북터미널세팅
    맥북초기세팅
    nodejs
    실전압축
    터미널꾸미기
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
준별
VSCode 환경에서 make로 빌드되는 c파일 gdb로 디버깅하기
상단으로

티스토리툴바