평소 자바를 사용해서 알고리즘 문제를 풀어왔었는데 c++로 연습을 하려니 이것저것 복잡한게 많았다. 그중에 계속 해결하지 못했던 디버깅문제를 해결해서 이 글에 정리했다.
윈도우와 mingw 컴파일러 환경에서 gdb를 사용했다.
이때 vscode의 기본 settings.json
파일에 다음의 내용을 포함시켰다.
아래 처럼 빌드시 gcc.exe
, g++.exe
을 사용해야한다. 이것이 아니라 cpp.exe
등을 사용하는 경우에 gdb가 읽을 수 없다는 에러 메세지를 확인했다.
vscode user단위의 settings.json
, workspace단위의 tasks.json
, launch.json
에서 컴파일러를 올바르게 지정했는지 확인해야한다.
{
"C_Cpp.default.compilerPath": "경로\\g++.exe",
"c-cpp-compile-run.c-compiler": "경로\\gcc.exe"
}
나는 workspace단위로 실행파일 지정을 다르게 사용해서 workspace아래의 .vscode
폴더 아래의 파일들을 수정했는데
그럴필요가 없다면 user단위의 settings.json
에서 "launch"
, "tasks"
프로퍼티를 아래 내용처럼 정의하면 된다.
tasks.json
이 파일에선 먼저 대상 소스코드를 빌드하는 명령을 저장해놓는 역할을 한다.
이 작업을 디버깅 명령 전에 먼저 실행 시키도록 할 것이다. 디버깅이 가능하기 위해선 컴파일시 -g
옵션이 꼭 필요하다는걸 알아두자
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++.exe build active file",
"command": "C:\\DevTool\\mingw\\bin\\g++.exe",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Task generated by Debugger."
}
],
"version": "2.0.0"
}
launch.json
여기선 디버깅 명령을 정의 할 것이다.
아래의 내용을 간추리자면
"C/C++: g++.exe build active file"
작업 먼저 실행 - 위에서 만든 빌드 명령
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "C:\\DevTool\\mingw\\bin\\gdb.exe",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "Set Disassembly Flavor to Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++.exe build active file"
}
]
}
gdb는 원래 콘솔 환경에서 명령, 질의를 통해 디버깅을 하는 툴로 사용되는것 같다. 유튜브나 구글 검색을 하면 유용한 정보를 알 수 있는데, 위의 문제를 해결하려다 조금 알게된 명령어만 좀 정리해두려 한다.
디버깅 가능한 실행파일을 gdb 실행파일명
으로 실행하면 gdb가 작동한다.
이때 run
명령을 하기 전까지 설정을 할 수 있는 상태인데, 즉 아직 대상 프로그램이 동작하고 있지않다.
run을 하고나면 break point가 나오기전, input등을 받아야하는 상태가 오기전까지 프로그램이 실행된다.
input은 console에서 하는것처럼 입력해주면된다.
break 20
명령 - 20번째 줄에 break point생성한다.step
- break point에서 멈췄을때 다음 step으로 넘어간다.print var1
- var1
이라는 변수의 값을 화면에 출력한다. 이때 현재 실행위치의 관점으로 변수에 접근한다.
즉 함수내에서 실행중일때 그냥 지역변수명으로 접근가능.quit
- 디버깅을 종료한다.