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

 

댓글을 달아 주세요

728x90

수성비전자방입니다. 오랜만에 Visual Studio Code에서 C프로그래밍 하는 것에 관한 글을 쓰겠습니다. C언어 디버깅을 하려면 어떡해야 할까요? gdb 디버거를 쓰시면 됩니다.^^

 

오늘 글을 시작하기 전에...

1. Visual Studio Code를 설치하시기 바랍니다. 오늘 다룰 내용은 VScode의 기능은 아니고 gdb 디버거의 기능이지만, 이 글의 시리즈가 Visual Studio Code 시리즈이므로 Visual Studio Code 기준으로 글을 작성하겠습니다.

https://toopyo.tistory.com/entry/vscode-post1

위 글을 보시면 Visual Studio Code를 설치하는 방법과 한국어 패치하는 방법을 확인하실 수 있습니다.

2. GCC를 설치하셔야 합니다. Windows PC라면 MinGW-w64를 설치하시면 됩니다.

https://toopyo.tistory.com/entry/vscode-post2

위 글을 참고하여 C/C++ 확장과 MinGW-w64를 설치하시고, C언어 빌드 옵션을 숙지하시기 바랍니다.

 

gdb 디버거를 사용하는 방법

1. C언어로 프로그래밍합니다. 저는 여러분들께 디버깅을 설명드리기 위해 위 스크린샷과 같이 간단하게 코드를 짜 보았습니다.

2. C code를 빌드합니다. 이때 -g 옵션을 꼭 추가하셔야 합니다. 디버깅을 위해 추가해야 할 옵션입니다.

예를 들어, 저는 gcc -g dtest.c -o appdt 명령을 실행했습니다.

(-o appdt는 실행파일명을 appdt로 지정한 것으로, PowerShell 자동완성 기능을 편하게 이용하기 위해 사용했습니다. 필수사항은 아닙니다.)

 

3. 빌드가 완료되면 exe 파일이 생성되었을 것입니다. 잘 생성되었는지 확인하시기 바랍니다.(실행파일명도 확인!)

4. 소스 코드와 실행 파일이 같은 폴더 안에 있어야 합니다.

5. gdb 실행파일명.exe 또는 gdb .\실행파일명.exe 명령을 실행합니다.

(Tip: 실행파일명의 일부만 치고 Tap 키를 누르면 .\실행파일명.exe로 자동완성됩니다.)

 

6. Type <return> to continue, or q <return> to quit

뜻: 계속하려면 엔터 키를 누르시고, 종료하려면 q를 입력하신 후 엔터 치세요.

 

이제 gdb 디버거가 실행되었습니다. 명령어를 입력하며 사용해야 하는데, 쓸만한 명령어들을 정리해 보겠습니다.

 

run

우선 가볍게 run부터 사용해 보겠습니다.

run을 입력하시고 엔터 치시면 프로그램이 실행됩니다.

지금은 딱히 설정한 것이 없어서 프로그램이 전부 실행되지만, breakpoint 설정을 하고 나서 다시 run을 해 보시면 breakpoint마다 쉬게 됩니다.(breakpoint에 대해서는 뒤에서 다룸.)

 

list

list는 소스코드를 볼 수 있는 명령어입니다.

*명령어: list

*기능: 소스코드 출력

 

list를 입력하시고 엔터 치시면 소스 코드의 Line 1부터 Line 10까지 출력됩니다. VScode로 작성한 것과 똑같죠?

 

엔터를 또 치시면 다음 10개 행(Line 11~20)이 출력됩니다. 엔터를 칠 때마다 열 줄씩 나오게 됩니다.

만약 list 명령을 실행했는데 소스 코드가 이상하게 나온다면, 빌드할 때 -g 옵션이 추가되지 않은 것이니, -g 옵션을 넣어서 다시 빌드하시기 바랍니다.

그나저나 VScode의 에디터로 소스 코드를 계속 확인할 수 있기 때문에 list 명령어는 잘 안 쓰시게 될 겁니다.

 

break

디버깅 하면 빠질 수 없는 기능 같습니다. breakpoint(정지점, 중단점)을 지정하는 기능이죠.

*명령어: break Line번호 또는 break 함수명

*기능: Breakpoint 지정

 

저는 함수명을 입력할 만한 게 없어서 Line 번호를 이용해 보았습니다.

break 7이라고 치니까

 

Breakpoint 1이 dtest.c의 line 7에 지정되었다고 나옵니다.

 

이제 run 명령을 실행하시면 Line 1~6를 실행하게 됩니다.

 

step

*명령어: step 또는 s

*기능: 현재 행 수행 후 정지. 함수 호출 시 함수 안으로 들어갑니다.

 

위 스크린샷은 Line 1~6까지 실행하고 현재 행이 Line 7인 상태에서 s 명령을 실행한 결과입니다.

Line 7인 printf("Hello world!\n");이 실행되었으며, Line 8은 공백이므로 현재 행이 Line 9으로 지정되었습니다.

 

next

*명령어: next 또는 n

*기능: 현재 행 수행 후 정지. 함수 호출 시 함수 수행 다음 행으로 넘어갑니다.

 

위 스크린샷은 Line 9까지 실행하고 현재 행이 Line 10인 상태에서 n 명령을 실행한 결과입니다.

Line 10인 b=2;가 실행되었으며, 현재 행이 Line 11으로 지정되었습니다.

제가 작성한 예시 코드에 main 함수 외에 다른 함수가 없어서 예를 잘 못 든 점 양해 부탁드립니다.(printf도 함수이긴 하지만 그건 stdio.h 안에 있는 함수라서...)

 

continue

*명령어: continue 또는 cont

*기능: Breakpoint(정지점)을 만날 때까지 수행

 

위 스크린샷은 Line 10까지 실행하고 현재 행이 Line 11인 상태에서 continue 명령을 실행한 결과입니다.

프로그램이 끝까지 실행되고 종료되었습니다.

 

whatis

*명령어: whatis 변수명

*기능: 변수의 type 출력

 

위 스크린샷은 Line 6까지 실행하고 현재 행이 Line 7인 상태에서 whatis a 명령을 실행한 결과입니다.

type = int 라고 출력되었습니다.

 

print

Logic error를 고치기 위해서 디버깅을 사용하다 보면 중간중간 변수의 값을 확인하고 싶을 때가 있을 것입니다. 그때마다 printf 함수를 이용할 수는 없으니 디버거의 print 기능을 이용합니다.

*명령어: print 변수명 또는 p 변수명

*기능: 변수에 저장된 현재 값을 한 번 출력

 

Line 6까지 실행하고 현재 행이 Line 7인 상태에서 print a 명령을 실행했더니 $1 = 0라고 출력되었습니다.

s 명령을 몇 번 해서 Line 9까지 실행하고 현재 행이 Line 10인 상태에서 print a 명령을 실행했더니 $2 = 1이 출력되었습니다.(Line 9가 a=1; 이었음.)

 

display

print는 변수의 값을 한 번만 출력합니다. Line별로 변하는 변수 값을 확인하고 싶다면 변수 값이 매번 출력되는 것이 좋겠죠? 그럴 때 사용할 수 있는 기능이 display입니다.

*명령어: display 변수명

*기능: 변수에 저장된 현재 값을 지속적으로 출력

 

위 스크린샷은 Line 9까지 실행하고 현재 행이 Line 10인 상태에서 display a 명령을 실행한 결과입니다.

1: d[1] = 0 이라고 출력되었습니다.

 

s 명령을 실행해서 Line 10까지 실행하고 현재 행이 Line 11인 상태가 되었습니다.

또 1: d[1] = 0 이라고 출력되었습니다.

 

눈에 띄는 변화를 보기 위해 Line 17에 Breakpoint를 지정하고 continue했습니다.

1: d[1] = 65 라고 출력되었습니다.(Line 13이 d[1]='A'이었음.)

 

set variable

*명령어: set variable 변수명 =

*기능: 변수 값을 변경

 

set variable d[1]=80 을 입력해 보았습니다.

엔터를 쳐도 어떤 메시지가 출력이 안 되는데요.

 

display 명령을 통해 확인해 보니 d[1] 값이 80으로 바뀌었네요. :)

 

info break

Breakpoint를 많이 지정하다 보면 자신이 어디에 Breakpoint를 지정했는지 잊어먹을 수 있죠. 이때 Breakpoint 목록을 확인하는 방법이 있습니다.

*명령어: info break

*기능: 설정되어 있는 Breakpoint 확인

 

이렇게 Breakpoint 목록을 확인하실 수 있습니다.

혹시 제거하고 싶은 Breakpoint가 있다면, Num 열과 What 열에 주목하세요!

 

delete

[특정 Breakpoint를 제거할 때]

*명령어: delete Num

(Num은 info break 명령을 통해서 확인)

*기능: 특정 Breakpoint 제거

 

Breakpoint 1이 dtest.c:7인 상태에서 delete 1 명령을 실행해 보았습니다.

 

run 명령을 실행했을 때 Breakpoint 2까지 실행되어, Line 16까지 실행되고 현재 행이 Line 18로 지정되었습니다.(Breakpoint2가 Line 17인데 현재 행이 Line 18인 이유: Line 17은 공백임.)

 

[모든 Breakpoint를 제거할 때]

*명령어: delete

*기능: 모든 Breakpoint 제거

 

1. delete를 입력하고 엔터 칩니다.

2. Delete all breakpoints? (y or n)이 출력되면 y를 입력하고 엔터 칩니다.

 

run을 실행해 보니 Breakpoint 없이 끝까지 실행됩니다.

 

kill

프로그램을 실행하다가 Breakpoint에서 멈췄을 때 오류를 발견한다면 빨리 종료하고 소스코드 수정을 하고 싶겠죠? 이때 프로그램을 종료하는 명령어가 있습니다.

*명령어: kill

*기능: 프로그램 수행 강제 종료

 

1. kill 명령을 실행합니다.

2. Kill the program being debugged? (y or n)이 출력되면 y를 입력하고 엔터키를 누릅니다.

3. 프로그램이 강제 종료되었습니다.

 

quit

디버거를 종료하고 싶을 때

*명령어: quit 또는 q

*기능: gdb 디버거 종료

 

q를 입력하고 엔터 쳤더니 위와 같이 gdb 디버거가 종료되었습니다.

 

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

글을 쓰고 보니 굉장히 길군요. 긴 글 읽어 주셔서 감사합니다.

다음에 만나요!

 

참고 자료

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

2) 현애. 2020. "[20] 리눅스 - gcc 컴파일러, gdb 디버거", 과제하는 공대생. (2021. 07. 24. 방문). https://blog.naver.com/aeae_1/222161714082

3) KwonZales. 2021. "[Linux] 리눅스의 디버거, gdb의 디버거와 사용법", 하고 싶은 게 많은, 일단은 개발자. (2021. 07. 24. 방문). https://kwonzales.tistory.com/35

4) 허정호. 2017. "[과제] gdb(디버거) 사용법", 허정호의 IT 공장. (2021. 07. 24. 방문). https://hyess.tistory.com/337

 

댓글을 달아 주세요

728x90

수성비전자방입니다. 오늘은 Visual Studio Code에서 C언어 컴파일하는 방법에 대해 알아보겠습니다.

 

[Visual Studio Code]1. 설치 

 

Visual Studio Code 설치 방법과 한국어 패치 방법이 궁금하신 방법은 위의 글을 읽어 보시기 바랍니다.

 

C/C++ 확장 설치

*.c 파일을 만들면 오른쪽 아래에 확장을 설치하라고 뜰텐데 그걸 설치해 줍니다.

 

아니면 확장에서 C/C++을 찾아서 설치해 주시면 됩니다.

 

사실 아직 C언어 컴파일은 불가능합니다. GCC를 설치해야 합니다. GCC‘GNU Compiler Collection’의 약자로, C언어 컴파일러를 포함하고 있습니다. 위 스크린샷에 빨간 밑줄로 표시해 둔 것을 클릭하셔도 되지만, 그냥 아래 방법으로 따라가시면 됩니다. 인스톨러를 사용하는 방법과 직접 압축을 푸는 방법이 있습니다. 원하는 방법을 이용하시기 바랍니다.

 

GCC(MinGW) 설치(인스톨러 사용)

1. https://sourceforge.net/projects/mingw-w64/ 로 접속합니다.

2. Download를 클릭합니다.

 

3. 오 초 기다리시면 왼쪽 아래에서 내려받으실 수 있습니다.

 

4. 내려받아 실행하시면 됩니다. Next를 클릭합니다.

 

5. Architecture에 주목하겠습니다.

i686: 32bit

X86_64: 64bit

본인의 PC 환경에 맞도록 선택하여 설치하시기 바랍니다.

 

6. 설치하시면 되는데 설치 경로를 기억해 두시기 바랍니다.

(어디에 적어 두거나 스크린샷을 찍어 두면 되겠죠?)

 

설치중...

설치가 완료되면 환경 변수 설정을 하시기 바랍니다.

 

???

사실 저는 실패했습니다. 그래서 저는 아래의 방법으로 했죠.

 

GCC(MinGW) 설치(직접 압축 해제)

1. https://sourceforge.net/projects/mingw-w64/ 로 접속합니다.

2. Files를 클릭합니다.

1~2. 사실 그냥 https://sourceforge.net/projects/mingw-w64/files/ 로 접속하시면 됩니다.

 

3. 스크롤을 내립니다.

 

4. 본인이 원하는 버전을 클릭하세요.

왼쪽부터 Architecture-Threads-Exception입니다.

 

5. 오 초 정도 기다리시면 왼쪽 아래에 뜰 것입니다.

내려받으시고, 실행하세요.

 

6. 압축을 푸시기 바랍니다. 일단 아무데나 풀어주세요. 어차피 설치 경로에 바로 못 풉니다.

 

7. (알집 기준)의심 파일 경고가 떠도 그냥 '예' 누르시면 됩니다.

 

8. 압축 푼 것을 적당한 위치에 넣어 주세요. 저는 mingw64 폴더 안에 있는 것을 C:\Program Files\mingw-w64에 넣었습니다.

(지금 생각해 보면 그냥 mingw64 폴더를 C:\Program Files 안에 넣어도 되었을 것 같은데…)

아무튼 지금 넣은 위치를 잘 기억해 주세요.(어디에 써 두시거나 스크린샷하면 편하겠죠?)

 

9. 관리자 권한이 필요하다고 합니다. 계속을 눌러 주세요.(모든 항목에 같은 작업 실행 체크하면 편함.)

 

환경 변수 편집

10. 시스템 환경 변수 편집을 실행합니다.(검색창에서 검색하면 되겠죠?)

 

11. 고급 탭에 들어갑니다.

12. 환경 변수(N)를 클릭합니다.

 

13. 시스템 변수 Path를 선택하고, 편집을 클릭합니다.

 

14. 새로 만들기를 클릭합니다.

15. MinGW가 설치된 경로\bin 을 입력합니다.

16. 확인을 클릭합니다.

17. 확인을 클릭합니다.

18. 확인을 클릭합니다.

 

19. 명령 프롬프트(검색창에 cmd 치면 나옴.)gcc 명령을 내려서 위와 같이 뜨면 성공입니다.

참고로 gcc -v 명령을 내리면 엄청 길게 뭐가 나오는데 맨 밑에 여러분이 설치하신 버전이 뜰 것입니다.

혹시 ‘gcc’() 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다. 라고 나오면 설치가 제대로 안 된 것입니다. 환경 변수 설정을 잘못하지는 않았는지 다시 한 번 점검해 보세요.

 

C언어 빌드 및 실행

1. C언어로 먼저 프로그래밍을 해 주세요. 저는 간단하게 Hello World!를 띄워 보겠습니다.

2. 터미널 창에서 컴파일을 진행하겠습니다. 터미널 창이 없다면 메뉴 모음 터미널(T)새 터미널을 클릭하시면 됩니다.

3. gcc 파일명.c 또는 gcc .\파일명.c 를 입력합니다.(단, 파일 경로가 맞다는 전제 하에...) 이 명령을 실행하고 나면 해당 C언어 소스코드가 빌드됩니다.

4. .\a.exe 를 입력합니다.

그러면 컴파일된 파일이 실행되며 출력 결과를 확인하실 수 있습니다.

 

GCC 빌드 옵션

[실행파일명 지정] -o 를 사용합니다.

1. 역시 C언어로 먼저 프로그래밍을 한 상태에서 진행하겠습니다.

2. 터미널 창에서 컴파일을 진행하겠습니다. 터미널 창이 없다면 메뉴 모음 터미널(T)새 터미널을 클릭하시면 됩니다.

3. gcc 파일명.c -o 원하는실행파일명 을 입력합니다.

물론 gcc .\파일명.c -o 원하는실행파일명 을 입력하셔도 됩니다.

파일 경로가 다르면 그 경로도 고려해야 하고요.

4. 원하는실행파일명.exe 파일이 생성되었습니다.

5. 터미널에 .\원하는실행파일명.exe 를 입력합니다.

그러면 컴파일된 파일이 실행되며 출력 결과를 확인하실 수 있습니다.

 

[Linking 전까지만 진행, 목적 파일(*.o) 얻는 법] -c 를 사용합니다.

1. 역시 C언어로 먼저 프로그래밍을 한 상태에서 진행하겠습니다.

2. 터미널 창에서 컴파일을 진행하겠습니다. 터미널 창이 없다면 메뉴 모음 터미널(T)새 터미널을 클릭하시면 됩니다.

3. gcc 파일명.c -c 또는 gcc .\파일명.c -c 를 입력합니다.(당연하게도, 파일 경로가 맞다는 전제 하에...)

4. 파일명.o 파일이 생성되었습니다.

 

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

제가 잘못 설명한 부분이 있다면 지적해 주세요.

궁금하신 점이 있다면 댓글로 질문해 주시기 바랍니다. 제가 아는 범위 안에서 답변해 드리겠습니다.

다음에 만나요!

 

댓글을 달아 주세요