728x90

수성비전자방입니다. 그동안 저는 Viusal Studio Code를 사용하면서 C 프로그래밍 하는 방법을 정리했습니다.

 

1. 설치

2. C언어 컴파일

3. C언어 디버깅(GCC, GDB 디버거)

 

이 중 2~3번 글은 사실 VScode의 기능이라기보다는 GCC, GDB의 기능이었는데요.(2번 글에서 C/C++ 확장을 다루긴 했지만...) 오늘은 최종적으로 VScode의 기능을 이용하여 C언어 빌드, 디버깅하는 방법을 알아보겠습니다.

1~3편에 이어서 진행되는 과정입니다. 위의 링크들을 클릭하셔서 글을 읽어보시기 바랍니다.

 

Visual Studio Code에서 디버깅 시작 단축키는 F5이고, 디버깅 없이 실행 단축키는 Ctrl+F5입니다.

원래 이 둘은 차이가 있어야 하는데, 여기서는 GCC를 연계해서 그런지 차이가 없네요.

둘 중 편한 것 누르세요.^^

 

위의 스크린샷은 스크린샷용으로 만들어 둔 C code입니다.ㅎㅎ

1. VScode에 C code를 띄워 놓고 F5 키를 누릅니다.

 

2. 위에 환경 선택하는 창이 뜨는데 C++(GDB/LLDB)를 선택하세요.

 

3. gcc.exe - 활성 파일 및 디버그를 클릭하세요.

 

4. 그러면 C code가 빌드되어 터미널에서 실행될 것이고, 화면에 launch.json이 띄워질 것이며,

 

좌측 탐색기를 보시면 .vscode 폴더가 생긴 것을 보실 수 있습니다.

.vscode 폴더 안의 launch.json, task.json 파일을 수정하여 빌드 및 디버깅 옵션을 설정할 수 있습니다.

이 소스코드들을 제가 line by line으로 설명 드릴 실력은 안 되고요, 아는 범위 안에서 정리하겠습니다.

우선 task.json 파일부터 알아보겠습니다.

 

task.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
    "tasks": [
        {
            "type""cppbuild",
            "label""C/C++: gcc.exe 활성 파일 빌드",
            "command""C:\\Program Files\\mingw64\\bin\\gcc.exe",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
            "options": {
                "cwd""${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind""build",
                "isDefault"true
            },
            "detail""디버거에서 생성된 작업입니다."
        }
    ],
    "version""2.0.0"
}
cs

[Line2]

"tasks": [

빌드 관련 옵션은 이 대괄호 안에 모두 작성할 것입니다.

 

[Line 5]

"label": "C/C++: gcc.exe 활성 파일 빌드",

task(빌드 옵션이라고 생각하시면 됩니다.)의 이름을 정하는 부분입니다. 현재 label은 C/C++: gcc.exe 활성 파일 빌드로 되어 있네요.

 

[Line 6]

"command": "C:\\Program Files\\mingw64\\bin\\gcc.exe",

명령어입니다. 다만, 명령어의 맨 앞 부분만 여기에 작성합니다.

그리고 gcc.exe가 있는 파일 경로가 작성되어 있어야 하는데, 이는 이미 자동으로 기입이 되어있으니 딱히 건드리지 않으셔도 됩니다.

(컴파일 할 때 gcc 명령을 했다고 해서 여기서 "gcc"라고만 입력하시면 안 됩니다. 제가 해봤는데 안 되더라고요.)

특이한 것은 경로를 나타낼 때 \를 두 개씩 겹쳐 쓴다는 것입니다.

 

[Line 7~12]

"args": [
    "-g",
    "${file}",
    "-o",
    "${fileDirname}\\${fileBasenameNoExtension}.exe"
],

args는 실행할 명령어 뒤에 붙는 argument들입니다. 즉, Line 6~12까지가 의미하는 것은 아래와 같다고 보시면 됩니다.

"C:\\Program Files\\mingw64\\bin\\gcc.exe" -g ${file} -o ${fileDirname}\\${fileBasenameNoExtension}.exe

(이게 뭐야...)

${fileDirname}과 ${fileBasenameNoExtension}에 대해서는 뒤에서 설명 드리겠습니다.

수학 라이브러리를 포함하려면 -lm 옵션을, 쓰레드 함수 라이브러리를 포함하려면 -lpthread 옵션을 포함해야 한다고 합니다. 그러려면 Line 11 뒤에 쉼표(,)를 찍고 Line 11과 Line 12 사이에 "-lm", "-lpthread"를 추가하시면 되겠습니다.

 

[Line 25]

]

 

launch.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{
    // IntelliSense를 사용하여 가능한 특성에 대해 알아보세요.
    // 기존 특성에 대한 설명을 보려면 가리킵니다.
    // 자세한 내용을 보려면 https://go.microsoft.com/fwlink/?linkid=830387을(를) 방문하세요.
    "version""0.2.0",
    "configurations": [
        {
            "name""gcc.exe - 활성 파일 빌드 및 디버그",
            "type""cppdbg",
            "request""launch",
            "program""${fileDirname}\\${fileBasenameNoExtension}.exe",
            "args": [],
            "stopAtEntry"false,
            "cwd""${fileDirname}",
            "environment": [],
            "externalConsole"false,
            "MIMode""gdb",
            "miDebuggerPath""C:\\Program Files\\mingw64\\bin\\gdb.exe",
            "setupCommands": [
                {
                    "description""gdb에 자동 서식 지정 사용",
                    "text""-enable-pretty-printing",
                    "ignoreFailures"true
                }
            ],
            "preLaunchTask""C/C++: gcc.exe 활성 파일 빌드"
        }
    ]
}
cs

[Line 6]

"configurations": [

디버깅 옵션은 모두 이 대괄호 안에 작성할 것입니다.

 

[Line 8]

"name": "gcc.exe - 활성 파일 빌드 및 디버그",

디버그 옵션의 이름을 정하는 부분입니다. 지금은 gcc.exe - 활성 파일 빌드 및 디버그로 되어 있네요.

 

[Line 11]

"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",

디버깅 할 실행 파일을 지정합니다. 뒤에서 자세히 설명 드리겠습니다.

 

[Line 16]

"externalConsole": false,

현재 externalConsole이 false로 되어 있는데 이 경우 실행 결과가 VScode의 터미널 창에 나타납니다.

false를 true로 바꾸시면 실행 결과가 별도의 CMD 창에서 나타납니다.

 

externalConsole을 true로 할 경우 프로그램이 종료되면 바로 창이 닫힙니다.

그러므로 windows.h 헤더파일을 추가하고, system("pause"); 코드를 삽입했습니다.

그 다음 빌드 또는 디버깅을 진행하면 위와 같이 별도 CMD 창에 실행 결과가 출력됩니다.

 

[Line 26]

"preLaunchTask": "C/C++: gcc.exe 활성 파일 빌드"

디버깅 실행 전 실행할 task를 정하는 부분입니다. 현재 gcc.exe - 활성 파일 빌드 및 디버그를 진행하면 그 전에 C/C++: gcc.exe 활성 파일 빌드를 먼저 하도록 되어 있습니다. 그러므로 디버깅을 하면 자동으로 빌드도 됩니다.

 

실행파일명 변경

실행파일명을 변경하기 위해서는 task.json과 launch.json을 둘 다 수정하셔야 합니다.

 

[task.json]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
    "tasks": [
        {
            "type""cppbuild",
            "label""C/C++: gcc.exe 활성 파일 빌드",
            "command""C:\\Program Files\\mingw64\\bin\\gcc.exe",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}\\a.exe"
            ],
            "options": {
                "cwd""${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind""build",
                "isDefault"true
            },
            "detail""디버거에서 생성된 작업입니다."
        }
    ],
    "version""2.0.0"
}
cs

Line 11을 수정하시면 실행파일명을 바꾸실 수 있습니다.

${fileDirname}: 파일 경로

${fileBasenameNoExtension}: 소스파일명

파일 경로를 수정하는 건 어렵더라고요. ${fileDirname}\\는 그대로 두시고, ${fileBasenameNoExtension}을 원하는 파일명으로 바꾸시면 됩니다.

위의 소스코드에 따르면 실행파일이 a.exe가 됩니다.

 

[launch.json]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{
    // IntelliSense를 사용하여 가능한 특성에 대해 알아보세요.
    // 기존 특성에 대한 설명을 보려면 가리킵니다.
    // 자세한 내용을 보려면 https://go.microsoft.com/fwlink/?linkid=830387을(를) 방문하세요.
    "version""0.2.0",
    "configurations": [
        {
            "name""gcc.exe - 활성 파일 빌드 및 디버그",
            "type""cppdbg",
            "request""launch",
            "program""${fileDirname}\\a.exe",
            "args": [],
            "stopAtEntry"false,
            "cwd""${fileDirname}",
            "environment": [],
            "externalConsole"false,
            "MIMode""gdb",
            "miDebuggerPath""C:\\Program Files\\mingw64\\bin\\gdb.exe",
            "setupCommands": [
                {
                    "description""gdb에 자동 서식 지정 사용",
                    "text""-enable-pretty-printing",
                    "ignoreFailures"true
                }
            ],
            "preLaunchTask""C/C++: gcc.exe 활성 파일 빌드"
        }
    ]
}
cs

Line 11을 주목하시기 바랍니다.

여기서도 파일명을 수정해 주셔야 빌드 및 디버깅이 정상적으로 진행됩니다.

(디버깅 안 하실 거라고 수정을 안 하시면 안 됩니다. 빌드할 때 결국 디버깅이 진행됩니다.)

 

이제 F5 키를 눌러 보시면 바꾼 이름으로 실행파일이 생긴 것을 보실 수 있습니다.

(위 스크린샷은 여러분의 혼동을 막기 위해 dtest.exe를 지우고 F5를 누른 것입니다.)

 

두 개 이상의 옵션

여기까지 읽으셨으면 옵션을 두 개 이상 만드는 법도 대충 아실 것 같습니다. 이건 제가 글로 설명하기가 어렵습니다. 대신 예시 코드를 아래에 작성하겠습니다.

 

[task.json]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
{
    "tasks": [
        {
            "type""cppbuild",
            "label""C/C++: gcc.exe 활성 파일 빌드",
            "command""C:\\Program Files\\mingw64\\bin\\gcc.exe",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe",
                "-lm",
                "-lpthread"
            ],
            "options": {
                "cwd""${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind""build",
                "isDefault"true
            },
            "detail""디버거에서 생성된 작업입니다."
        },
        {
            "type""cppbuild",
            "label""빌드(GCC 컴파일. 실행파일: appdt.exe)",
            "command""C:\\Program Files\\mingw64\\bin\\gcc.exe",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}\\appdt.exe",
                "-lm",
                "-lpthread"
            ],
            "options": {
                "cwd""${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind""build",
                "isDefault"true
            },
            "detail""디버거에서 생성된 작업입니다."
        }
    ],
    "version""2.0.0"
}
cs

 

[launch.json]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
{
    // IntelliSense를 사용하여 가능한 특성에 대해 알아보세요.
    // 기존 특성에 대한 설명을 보려면 가리킵니다.
    // 자세한 내용을 보려면 https://go.microsoft.com/fwlink/?linkid=830387을(를) 방문하세요.
    "version""0.2.0",
    "configurations": [
        {
            "name""gcc.exe - 활성 파일 빌드 및 디버그",
            "type""cppdbg",
            "request""launch",
            "program""${fileDirname}\\${fileBasenameNoExtension}.exe",
            "args": [],
            "stopAtEntry"false,
            "cwd""${fileDirname}",
            "environment": [],
            "externalConsole"false,
            "MIMode""gdb",
            "miDebuggerPath""C:\\Program Files\\mingw64\\bin\\gdb.exe",
            "setupCommands": [
                {
                    "description""gdb에 자동 서식 지정 사용",
                    "text""-enable-pretty-printing",
                    "ignoreFailures"true
                }
            ],
            "preLaunchTask""C/C++: gcc.exe 활성 파일 빌드"
        },
        {
            "name""디버깅(GCC 컴파일. 실행파일: appdt.exe)",
            "type""cppdbg",
            "request""launch",
            "program""${fileDirname}\\appdt.exe",
            "args": [],
            "stopAtEntry"false,
            "cwd""${fileDirname}",
            "environment": [],
            "externalConsole"false,
            "MIMode""gdb",
            "miDebuggerPath""C:\\Program Files\\mingw64\\bin\\gdb.exe",
            "setupCommands": [
                {
                    "description""gdb에 자동 서식 지정 사용",
                    "text""-enable-pretty-printing",
                    "ignoreFailures"true
                }
            ],
            "preLaunchTask""빌드(GCC 컴파일. 실행파일: appdt.exe)"
        }
    ]
}
cs

이렇게 하고 F5를 누르시면 여러 가지 옵션 중 맨 위의 것으로 실행될 것입니다. 그러면 어떻게 옵션을 선택할 수 있을까요?

 

실행 및 디버그 탭에서 디버깅 옵션을 선택하실 수 있습니다.

 

그러나 때로는 옵션 선택 때문에 탭을 옮기는 것이 귀찮습니다. 왼쪽 아래의 디버깅 버튼(?)을 클릭하시면 디버깅 옵션을 선택하실 수 있습니다.

 

선택한 옵션대로 빌드 및 디버깅이 이루어지면 성공!

 

디버깅 기능 사용하기

1. Line 번호 왼쪽을 클릭하면 Breakpoint(정지점)을 적절히 설정할 수 있습니다. Breakpoint가 설정되면 빨간 점이 생깁니다.

2. F5 키를 눌러 디버깅을 시작합니다.(Ctrl+F5를 눌러도 되긴 함.)

 

위와 같이 디버깅이 진행됩니다.

화면 상단을 보시면 디버깅에 쓸 수 있는 기능들이 있는데요,

 

각각 이런 기능입니다.

 

Quick Info Box

변수명에 마우스 커서를 가져다 대면 Quick Info Box가 나옵니다.

Breakpoint (직전)까지 실행했을 때의 변수 값을 확인하실 수 있습니다. Logic Error(논리 오류)를 잡는 데에 도움이 될 것입니다.

 

[F5]계속(Continue)

다음 Breakpoint를 만날 때까지 실행합니다.

(위 스크린샷을 예시로 설명하면 Line 10~Line14 실행 후 Line 15을 현재 행으로 지정.)

 

[F10]단위 실행(Step Over)

현재 행 수행 후, 다음 행을 현재 행으로 지정합니다. 함수 호출 시 함수 수행 다음 행을 현재 행으로 지정합니다.(함수 안으로 들어가지 않음.)

 

[F11]단계 정보(Step Into)

현재 행 수행 후, 다음 행을 현재 행으로 지정합니다. 함수 호출 시 함수 안으로 들어갑니다.

 

[Shift+F11]단계 출력(Step Out)

현재 들어가 있는 함수의 나머지 statement들을 모두 수행한 뒤 프로그램을 종료합니다.(main 함수로 돌아가지 않음.)

 

[Ctrl+Shift+F5]다시 시작

현재 진행중인 디버깅을 중지하고 다시 시작합니다.(시스템 재부팅 아님)

 

[Shift+F5]중지

현재 진행중인 디버깅을 중지합니다.

 

디버깅 중 변수 값을 임시로 수정하는 방법

실행 및 디버그 탭의 위쪽을 보시면 지역 변수들이 있는 것을 보실 수 있습니다. 여기서 변수 값을 더블클릭하시면

 

변수 값을 수정하실 수 있습니다. 이제 수정된 변수 값이 적용된 채로 프로그램이 작동됩니다.

 

조사식

실행 및 디버그 탭의 변수 목록 아래쪽을 보시면 조사식이 있습니다.

+를 누르시면 조사식을 추가하실 수 있습니다.

 

이와 같이 원하는(궁금한) 식을 쓰시면 됩니다. 저는 a+c를 써 보았습니다.

 

위 스크린샷은

①실행 및 디버그 탭에서 a 값을 임시로 5로 수정

②Line 5에서 c=0

이 상황에서 조사식 a+c가 5라고 나온 상황입니다.

 

저의 글을 읽어 주셔서 감사합니다.

제 지식의 한계와 스크롤의 압박으로 인해 여기까지만 다루는 점 양해 부탁드립니다.

다음에 만나요!

 

참고 자료

1) 슈라 Shuuura. 2020. "[우분투 리눅스] gcc컴파일 및 디버깅", 슈라의 인생 Log. :). (2021. 08. 06. 방문). https://blog.naver.com/sera3579/222109588968

2) Microsoft. 2021. "Debugging", Visual Studio Code User Guide. (2021. 08. 06. 방문). https://code.visualstudio.com/docs/editor/debugging#_launch-configurations

3) 이로이로. 2020. "[VS code] Node.js 프로젝트에서 launch.json가 없을 경우 설정 방법", 이로이로의 저장소. (2021. 08. 06. 방문). https://oysu.tistory.com/65

4) 민선생. 2019. "6화 - VSCode에서 C, C++ 개발환경 세팅 3 (Visual Studio Code)", 민선생 코딩 이야기. (2021. 08. 06. 방문). https://blog.naver.com/mincoding/221733289320

 

댓글을 달아 주세요