みなさんこんにちは。今回はM1Mac+VSCodeでC言語のデバッグをする方法について解説していきます。
C言語はコンパイル+実行をコマンドで行う必要があるため、ほかの言語よりもさらにデバッグの有り難みが大きいのではないかと思います!
ちなみに、こちらの記事は初心者の方を対象としております。
そもそもデバッグとは?
最初に簡単にデバッグとはどういったものか解説しておきます。
デバッグを一言で言えば、「実行を途中の行で停止し、その時点での変数の様子を確認できる」ものです。
例えば以下のように、6行目までで定義したa, b, cの中身が左側に表示されています。
これを確認することで意図しない結果に気付くことができるわけです。
また、パッと思いつくメリットはもう2つあります。
- ショートカットキー1つで出来るので、コンパイル&実行の手間が省ける。
- segmentation faultのようなやっかいなエラーも検出してくれる。
特に2つ目のメリットは大きく、segmentation faultが出ても絶望せずに済みます。
segmentation faultが出る時はprintデバッグができないため、デバッガーが使えると非常に良いことでしょう。
それではここから、具体的なデバッガーの導入方法を解説していきます!
全体の流れ
まずは全体の流れです!
- デバッガーやコンパイラーのインストール
- 「C/C++」の拡張機能インストール
もちろんデバッグ用の拡張機能などもあります。
ですが、個人的に拡張機能を大量に入れたくないので今回はこれを使っていきます!
- launch.jsonとtasks.jsonを作成する。
- (ブレイクポイントを設定して)左上のメニューから「実行」>「デバッグの開始」
コンパイラー(clang)とデバッガー(lldb)のインストール
まずはコンパイラーとデバッガーのインストールです。
どちらもコマンドラインツールをインストールすることで使えるようになります。
clangとgccは別物らしいですが、これでgccコマンドを使えます。
コマンドラインツールとはXCodeに付属しているもので、ツールのみをインストールする時はターミナルで
xcode-select --install
を実行します。
XCodeごとApp Storeからインストールしても良いのですが、サイズが大きすぎるので……
clang(gcc)とlldbがインストールされているか確認する方法は、それぞれターミナルでgcc -v、clang -v、lldb -vとすればOKです。
インストールされていたら、以下のように出てくると思います。
//これはgcc -v
Apple clang version 14.0.0 (clang-1400.0.29.202)
Target: arm64-apple-darwin22.3.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
//これはlldb- v
lldb-1400.0.38.17
Apple Swift version 5.7.2 (swiftlang-5.7.2.135.5 clang-1400.0.29.51)
launch.jsonとtasks.jsonの設定
次にこの2つのファイルを設定していきます。手順は以下の通りです。
- 実行とデバッグのところにある「launch.jsonを作成します。」をクリック。
- エクスプローラーに戻ると、.vscodeの下にlaunch.jsonは自動で生成されている。
- 「新しいファイル」から新規ファイルを作成して、名前を「tasks.json」にする。
ちなみに、c_cpp_properties.jsonも自動で生成されたものです。
左のサイドバー
.vscodeの下に2つあります。
以下に書いてあるlaunch.jsonとtasks.jsonはこちらのサイトを参考にしました。
launch.json
{
// IntelliSense を使用して利用可能な属性を学べます。
// 既存の属性の説明をホバーして表示します。
// 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "debug_c_test", //好きな名前を設定。
"type": "cppdbg",
"MIMode": "lldb",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [],
"cwd": "${fileDirname}",
"preLaunchTask": "build_c_test",
"targetArchitecture": "arm64"
}
]
}
最もこの記事を書く時に試したら書かなくてもデバッグができたので、アップデートで対応されたのかもしれませんが……。
tasks.json
{
"tasks": [
{
"type": "cppbuild",
"label": "build_c_test", //launch.jsonで設定したpreLaunchTaskに合わせる。
"command": "/usr/bin/gcc",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "デバッガーによって生成されたタスク。"
}
],
"version": "2.0.0"
}
あとはデバッグしたいファイルを開いた後にメニューの「実行」>「デバッグの開始」でデバッグをすることができます!
キーボードショートカットは「fn + F5」もしくは「F5」です。
今回のポイントとなったのはM1Macのアーキテクチャがarmであることでした。
これが影響して「ネットの通りにやったのに上手くいかない!」ということは非常によくあります。
何かがおかしいと思ったら、この部分を疑うと良いでしょう。