Programming/Visual Studio Code
Visual Studio Code WSL gdb 사용법
Sueredis
2018. 5. 21. 23:37
VS Code의 업데이트로 이 보다 간단하게 WSL 워크스페이스를 사용할 수 있게 되었습니다.
이 방법보다는 여기에 있는 방법을 추천합니다.
WSL로 gcc를 연결했다면 wsl로 gdb를 연결할 수 있다.
먼저 당연하지만 ubuntu를 켜서 sudo apt-get install gdb로 gdb를 설치해야 한다!
먼저
task.json에 있는 빌드에서
-g 옵션을 추가해줘야 디버깅을 할 수 있다.
코드에서 숫자부분 왼쪽을 누르면 브레이크 포인트를 걸 수 있다.
F5를 눌러보면
이렇게 나오는데 조금 귀찮게 설정을 해야한다.
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "/mnt/c/Users/ParkSangJun/Documents/codes/${fileBasenameNoExtension}.out",
"args": ["-fThreading"],
"stopAtEntry": false,
"cwd": "/mnt/c/Users/ParkSangJun/Documents/codes",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"pipeTransport": {
"pipeCwd": "",
"pipeProgram": "c:\\windows\\sysnative\\bash.exe",
"pipeArgs": ["-c"],
"debuggerPath": "/usr/bin/gdb"
},
"sourceFileMap": {
"/mnt/c": "c:\\"
}
}
]
}
이건 내가 설정한 것이다.
우선 program부분을 보면 경로가 이상하게 되어 있는데
이게 linux식 경로라서 그렇다.
원래대로라면 C://Users/ … 이렇게 시작하는 경로인데 C:// 대신 /mnt/c/
를 쓴다고 생각하면 된다. 또한 \대신에 /를 써야한다.
"cwd"도 그렇게 바꾸고 args는 저렇게 한다.
그 다음에 pipProgram 에 bash의 경로를 써야한다.
원래 bash.exe는 Windows/System32에 들어있다.
근데 그걸로 하면 파일을 찾을 수 없다면서 에러가 난다.
아무래도 system32폴더에 대한 어떤 권한 관련 에러일 것 같다.
그래서 system32에 있는 bash.exe를 복사해서
windows에 sysnative폴더를 새로 만든 다음 그 안에 붙여넣고 경로를 저렇게 하면 된다.
sourceFileMap은
/mnt/c를 c:\\ 로 매핑해주는 것 같은데 자기 소스파일이 있는 위치마다 매핑해주면 될 것 같다.
ex)
"sourceFileMap": {
"/mnt/c": "c:\\",
"/mnt/d": "d:\\",
"/mnt/e": "e:\\"
}
그러면 다시 코드로 돌아가서 F5를 누르면 디버깅을 할 수 있다.
만약에 작업 디렉토리의 하위폴더를 만들어서 범용적으로 작업하는 용도로 쓰고 싶다면 다음과 같이 적으면
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${fileBasenameNoExtension}.out",
"args": [],
"stopAtEntry": false,
"cwd": "./",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"pipeTransport": {
"pipeCwd": "${fileDirname}",
"pipeProgram": "c:\\windows\\sysnative\\bash.exe",
"pipeArgs": ["-c"],
"debuggerPath": "/usr/bin/gdb"
},
"sourceFileMap": {
"/mnt/c": "c:\\"
}
}
]
}
하위디렉토리에서도 컴파일을 하고 F5를 눌러서 디버깅을 할 수 있다.
그런데 WSL에서 vscode로 gdb를 이용할 때는 stdin, stdout를 이용할 수가 없다.
그래서 gdb를 써도 입력,출력을 std로 받는 건 할 수 없다.
대신에 폴더에 in이라는 파일을 만들어두고 인자에 저렇게 적어놓으면 in에 미리 적어놓은 걸로 stdin을 대신해서 입력할 수 있다.
out파일로 stdout의 결과가 나올 것이다. 하지만 stdout은 결과를 바로 볼 수 있지만
이렇게 하면 실행이 종료되어야 내용을 볼 수 있다.
아니면
"debuggerPath": "stdbuf -i0 -o0 -e0 /usr/bin/gdb"
이렇게 설정하면 stdout대신 디버그 콘솔에서 볼 수 있다. 하지만 stdin은 안된다.