[Visual Studio Code]4. C언어 빌드 및 디버깅
수성비전자방입니다. 그동안 저는 Viusal Studio Code를 사용하면서 C 프로그래밍 하는 방법을 정리했습니다.
이 중 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
'정보 > Windows' 카테고리의 다른 글
버추얼박스에 Windows 11 프리뷰 설치하기(iso 파일 이용) (0) | 2021.08.21 |
---|---|
다빈치 리졸브 클립 삭제 방법, 렌더링 방법 (0) | 2021.08.18 |
[Visual Studio Code]3. C언어 디버깅(gcc, gdb 디버거) (0) | 2021.07.24 |
[Drawboard PDF]PDF 파일 위에 필기할 때 쓰기 좋은 앱 (2) | 2021.07.10 |
GitHub로 무료 웹호스팅하기(깃허브, GitHub Desktop 사용) (0) | 2021.07.03 |