우분투 리눅스에서 VScode설치, C,C++ 디버깅 환경 설정하기 :: YJcode

오늘은 저번시간에 진행하였던 VScode기반 C,C++ 컴파일환경 구현에 이어 디버깅 환경을 구현하도록 하겠습니다.


만약 VScode에서 C,C++ 컴파일 환경을 구현하지 않았다면 다음 링크를 통해 먼저 컴파일 환경을 구현 후 오시기 바랍니다.


2018/12/26 - [C언어/C언어 개발환경 구축] - 우분투 리눅스에서 VScode설치, C,C++코딩을 위한 환경설정하기



컴파일 환경까지 구현하셨다면 이제 디버깅을 구현하여야 하는데요, 디버깅이 무엇인지 왜 필요한지 모르신다면 "나중을 위해 환경을 설정해둔다."

이정도로만 알고 따라하셔도 무방합니다.


1. 컴파일 환경 구현때 설정한 task.json 파일을 일부 수정한다.

-- 컴파일환경을 제 블로그를 참고하여 구현하셨다면 파일탐색창에서 .VScode폴더안에 tasks.json 파일이 생성되어 있고 위 스크린샷과 같이 설정이 되어 있을 겁니다.


하지만 자세히 살펴보면 마냥 같지는 않고 조금 다른점을 볼 수 있는데요.

//C++ 컴파일
{
"label": "save and compile for C++",
"command": "g++",
"args": [
"-g3",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"group": "build",

이부분과

//C 컴파일
{
"label": "save and compile for C",
"command": "gcc",
"args": [
"-g3",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"group": "build",

이부분이 조금 다를 겁니다.

디버깅을 위해서는 컴파일을 실행할 당시에 디버깅 정보를 포함하여 주어야 하는데요, 이 컴파일정보를 포함하는 옵션을 g++과 gcc에 추가로 주기 위하여


"-g3"


이걸 "args": [ 

"이부분에 삽입합니다.",

"${file}",

"-o",

...

이런 형식으로 추가하여 주어야 합니다.

만약 찾아서 직접 수정하기 힘드시다면 그냥 아래 코드를 통째로 복사하셔서 tasks.json파일에 덮어쓰셔도 상관없습니다.

{
"version": "2.0.0",
"runner": "terminal",
"type": "shell",
"echoCommand": true,
"presentation" : { "reveal": "always" },
"tasks": [
//C++ 컴파일
{
"label": "save and compile for C++",
"command": "g++",
"args": [
"-g3",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"group": "build",



"problemMatcher": {
"fileLocation": [
"relative",
"${workspaceRoot}"
],
"pattern": {
"regexp": "^(.*):(\\d+):(\\d+):\\s+(warning error):\\s+(.*)$",
"file": 1,
"line": 2,
"column": 3,
"severity": 4,
"message": 5
}
}
},
//C 컴파일
{
"label": "save and compile for C",
"command": "gcc",
"args": [
"-g3",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"group": "build",



"problemMatcher": {
"fileLocation": [
"relative",
"${workspaceRoot}"
],
"pattern": {
"regexp": "^(.*):(\\d+):(\\d+):\\s+(warning error):\\s+(.*)$",
"file": 1,
"line": 2,
"column": 3,
"severity": 4,
"message": 5
}
}
},

{

"label": "execute",

"command": "cd ${fileDirname} && ./${fileBasenameNoExtension}",

"group": "test"

}
]
}


코드 작성이 끝나셨으면 Ctrl + S 키를 통해 저장을 하시고,


2. 위와같이 Ctrl + Shift + D 혹은 왼쪽상단의 거미모양 아이콘을 눌러서 디버그 모드로 들어갑니다.



여기서 좌측상단에 보면 초록색 재생버튼이 보입니다. 이걸 클릭해주면 위 사진처럼 어떤 디버그 환경을 구현할지 설정하는 화면이 나옵니다. 여기서는 C와 C++을 디버깅 할 것이므로 해당하는 디버거인 GDB/LLDB 를 선택합니다.


여기까지 진행하면,



위 스크린 샷 처럼 launch.json 이 생성됩니다.


만약 코드가 아래와 같다면 그대로 두셔도 상관 없습니다만, 만약 다르다면 아래코드를 launch.json 내용물에 그대로 덮어쓰시면 됩니다.

{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}


사실 여기까지 하셨다면 디버깅환경 구현은 끝난 셈입니다. 한번 확인해볼까요?


#include <stdio.h>

int main() {

int a = 0, b = 0;

a = 10;
b = 20;

printf("%d\t%d\n",a,b);
}


3. 제일먼저 위 코드를 샘플파일로 아래와 같이 파일을 하나 만들고 입력합니다.



여기서 코드를 작성한 내용물 왼쪽에 보면 행(라인)마다 숫자가 붙어 있는 것이 보일 겁니다.

그 왼쪽에 마우스 커서를 올리면,



이렇게 빨간 동그라미가 희미하게 나타납니다. 이걸 클릭해주면 동그라미 색이 진하게 나타나고 마우스 커서를 치워도 그대로 남아있게 됩니다.

이걸 브레이크포인트 라고 부릅니다.

디버깅 환경에서 테스트를 할 때 정지해서 그때 그때 변수값이나 상태를 체크하는 지점을 설정해주는 것입니다.


4. 저는 아래와같이 4개의 브레이크포인트를 생성하였습니다.



이제 컴파일을 진행하여 주세요. 컴파일을 어떻게 해야 할 지 모르신다면 상단에 있는 링크를 통해 전에 포스팅한 컴파일 방법을 다시한번 살펴보시기 바랍니다.



위 사진처럼 정상적으로 컴파일이 되지 않고 에러 메시지가 뜬다면 launch.json 파일과 task.json 파일 수정부분을 다시한번 찬찬히 읽어보시기 바랍니다.


여기까지 진행이 완료되었다면 디버깅을 진행하는데요, 디버깅은 저번 포스팅에서 설정한 실행 커멘드를 통해서 실행하지 않고 


1.F5 키를 누르거나,

2.Ctrl + Shift + D 혹은 왼쪽 상단의 거미모양 아이콘 선택 후 위쪽에 초록색 재생버튼 클릭


이 두가지 방법을 이용해서 실행이 가능합니다.


그럼 아래같은 화면이 나옵니다.



이제 상단에 새로 생긴 디버그컨트롤러 창을 통해 아래처럼 브레이크포인트를 한번씩 이동하며 변수의 변화를 볼 수 있고,

 조사식이나 스택상태등 상당히 강력한 디버깅을 할 수 있게 되었습니다.



여기까지 따라오시느라 고생이 많으셨습니다. 다음시간부터는 본격적으로 C언어를 탐구하여 보도록 하겠습니다.

+ Recent posts