#はじめに
一年以上試行錯誤していたvscodeでのC++デバッグができるようになったので、僕がハマったポイントとその解決方法を記事にしようと思います。ちなみにQiita初投稿です。ドキドキ!
#前提
今回は以下の前提条件をもとに説明を行います。
- OSはWindows10。
- vscodeをインストール済。
- WSL導入済み。
- 使用するLinuxはUbuntu20.04
- Ubuntuにはg++とgdbをインストール済み。
WSLの導入などは他の方の記事がとても参考になるので、そちらをご覧ください。
C++でプログラムを書いてコンパイルした後にデバッガを起動すると(F5キーを押すと)上のようなエラーが発生する。
原因はlaunch.jsonだと思われるのでlaunch.jsonを確認する。
確認すると上の写真のようになっていた。エラーメッセージからして"miDebuggerPath"というのが怪しそう。おそらく、ここにGDBのパスを入れればよいのだろうが、Windows10には直接GDBはインストールされていない。なんとかしてUbuntuでインストールしたGDBを使いたい。しかし、上の写真で開いているフォルダでは、どう書いても解決しません。
#解決方法
問題はPathの指定方法にあると思っていたのですが違いました。問題はvscodeで開いているフォルダにありました。
上の写真を見てわかる通り、現在ターミナルで開いているフォルダはWindows10のローカルフォルダをUbuntuでマウントしたものです(mnt/c/Users/daiki/CompPro/)。
これではlaunch.jsonで参照するPathがWindowsのフォルダ内に限定されるのでUbuntuにあるGDBを参照することができません。(なにかしらの方法はあるかもしれない)つまり、解決策はターミナルで開くフォルダをUbuntu内のフォルダにする。です。
それでは、Ubuntu内のフォルダをvscodeで開く方法を今から説明します。
###1. Remote-WSLのインストール
まずはRemote-WSLという拡張機能をインストールします。
###2. 新しいウィンドウの作成
次に、右上のファイル(F)を押して、"新しいウィンドウ”を押してください。そうすると、vscodeで以下のような新しいウィンドウが出てくると思います。
###3. Ubuntuのフォルダを開く
次に左下の歯車マークの下の緑の四角い部分をクリックします。すると以下のようにウィンドウ上部に選択しがいくつか表示されます。
ここでは"Open Folder in WSL..."を選択します。
すると、Windowsのエクスプローラーが立ち上がってUbuntu上に存在するフォルダを表示してくれるので作業したフォルダを選択して完了です。まだ、フォルダを作っていない場合、普段と同じように左上の"新しいフォルダを作成"のボタンを押してフォルダを作成してください。
今回僕はComProCppというフォルダを作成して選択しました。
###4. デバッグする
ターミナルを見るとわかる通り、以前はカレントディレクトリが/mnt/c...のようにマウントされたWindowsフォルダだったのがUbuntuのホームディレクトリ直下のフォルダになっていることがわかります。
また、最初にデバッガを起動するときにlounch.jsonが自動で生成されるので、それを"program"の項目だけ写真のように整えて実行すれば上手くいきます。
そして作ったフォルダでC++ファイルを作成して、なにかしらのプログラムを書いた後、ターミナルで
g++ -g3 a.cpp
のようにデバッグできるようにコンパイルしてデバッガーを起動すると、作成されたa.outに対してGDBがデバッグを始めるので、ブレイクポイントなどを適当に設定して、あとは好きに使えます。
#まとめ
-
結局、問題だったのは作業フォルダの選択です。おそらく、それに気づけば、あとは一人でできる人が多いと思います。なので、他の説明はやや冗長だったかもしれないですね笑。。
-
今回僕はa.cppというファイル名にしていますが、適宜名前は変更していただいて構いません。
-
また、現在の環境では一度ターミナルで-g3オプションを付けたコンパイルを行ってからデバッガを起動しなければならないことが問題なので、それを解決できるように、また試行錯誤していきたいです。
-
launch.jsonは初心者には難しく思われる内容であり、僕も最初は、なにが何やらさっぱり分からなかったが1年間なんとなく使っているうちに少し分かるようになり、ついにGDBデバッグをすることができました。今回の僕と同じ問題でGDBが起動しない!という人の力に少しでもなれたらいいなと思います
最後まで読んで頂きありがとうございました。
#追記
まとめの3つめの問題の解決法を追記していきます。
現在わかっていることとしては(実際にできたわけではない)"preLaunchTask"という項目をlaunch.jsonに追加して、デバッグ開始前にtasks.jsonで設定したタスクを実行するように設定できるようです。tasks.jsonではコンパイルやリンクなどいろいろなタスクをまとめてキーワードに紐づけて、そのキーワードを選択することで紐づけたタスクを実行することができるらしい。つまり、tasks.jsonを以下のように設定して、
{
"type": "cppbuild",
"label": "C/C++: g++ build",
"command": "/usr/bin/g++",
"args": [
"-g3",
"${file}",
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": "build",
"detail": "コンパイラ: /usr/bin/g++",
"presentation": {
"reveal": "silent",
"clear": true
}
},
launch.jsonで以下のように呼び出せば
{
"version": "0.2.0",
"configurations": [
{
"name": "g++.exe - アクティブ ファイルのビルドとデバッグ",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/a.out",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "/usr/bin/gdb",
"setupCommands": [
{
"description": "gdb の再フォーマットを有効にする",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++ build"
}
]
}
ファイルを選択してF5を押すだけでデバッグが開始するようになるかもしれません。僕はなりませんでした。
(おそらくlaunch.jsonの"program"のa.outがよくないと思われます。またできるようになったら追記します。)