본문으로 바로가기

VS Code의 업데이트로 이 보다 간단하게 WSL 워크스페이스를 사용할 수 있게 되었습니다.

이 방법보다는 여기에 있는 방법을 추천합니다.


WSL로 gcc를 연결했다면 wsl로 gdb를 연결할 수 있다.
먼저 당연하지만 ubuntu를 켜서 sudo apt-get install gdb로 gdb를 설치해야 한다!

먼저
task.json에 있는 빌드에서 



-g 옵션을 추가해줘야 디버깅을 할 수 있다.



코드에서 숫자부분 왼쪽을 누르면 브레이크 포인트를 걸 수 있다.
F5를 눌러보면 



이렇게 나올텐데 gdb를 고른다.



이렇게 나오는데 조금 귀찮게 설정을 해야한다.

{ "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를 누르면 디버깅을 할 수 있다.

만약에 작업 디렉토리의 하위폴더를 만들어서 범용적으로 작업하는 용도로 쓰고 싶다면 다음과 같이 적으면

{ // IntelliSense를 사용하여 가능한 특성에 대해 알아보세요. // 기존 특성에 대한 설명을 보려면 가리킵니다. // 자세한 내용을 보려면 https://go.microsoft.com/fwlink/?linkid=830387을(를) 방문하세요. "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은 안된다.