WSL2とVS CodeでC言語を利用してみる (Remote – SSH編)

WSL2とVS CodeでC言語を利用してみる (Remote – SSH編) Visual Studio Code
スポンサーリンク

前回はVS Codeを使ってWSL2のLinuxでC言語のプログラミングをしてみました。このとき利用したVS Codeの拡張機能は「Remote – WSL」です。

今回は拡張機能の「Remote – SSH」を使って同様のことをしてみたいと思います。

前回の記事とかぶるところが多くなりますが、これは複数の記事を参照しなくても良いようにするためです。

スポンサーリンク

「Remote – WSL」と「Remote –SSH」の違い

私が把握している範囲ではこの2つでできることはほとんど変りません。

違いはVS CodeとWSLのLinux間の連携方法です。「Remote – WSL」は直接連携し、「Remote – SSH」はSSHプロトコルを使って連携します。

VS Codeを動かしているWindows上でWSL2のLinuxを導入している場合は「Remote – WSL」で十分です。しかし、場合によっては下記で紹介している方法を使って、別のWindowsで動作しているWSL2のLinuxへアクセスしたい場合があると思います。

UbuntuをWindows11上で動かす その12: 外部から接続する
今回はWindows Subsystem for Linux (WSL2)で導入したUbuntuに、外部のPCから接続する方法を紹介します。WSL1の頃は簡単にできたのですが、WSL2になってからネットワークの構成が変更になっているため、少々設定が複雑になっています。

このような場合は「Remte – WSL」ではなく「Remote – SSH」を使用して連携する必要があります。

もちろんWSL2ではなく本物のLinuxとVS Codeを連携させるときにも「Remote – SSH」は使用することができます。

スポンサーリンク

Visual Studio Code (VS Code)

Visual Studio Code(VS Code)はMicrosoftが開発するエディタです。

https://azure.microsoft.com/ja-jp/products/visual-studio-code/

特徴はいろいろあるのですが、拡張機能による高い柔軟性と、クロスプラットフォームであることが上げられると思います。

VS Codeがサポートしているプログラミング言語はC、C++、Python、Javaなど非常に多くあります。

実際にコンパイルや実行を行うためには、VS Code以外にそれぞれの言語の環境の導入が必要です。

現在では最も人気の開発者環境ツールの1つかもしれません。

構築したい環境

WSL2を利用してWindows上でLinuxを利用できるようにした目的の1つは、Linuxの豊富なプログラミング環境(コンパイラ・デバッガ・インタープリタなど)を利用できるようにするためです。

Windowsでもプログラミング環境をそろえることはできると思います。

しかし、Windows向けのプログラムを作成するのでなければ、Linuxの方が便利ではないかと思います。

従って、C言語のコンパイラはWSL2のLinux上のものを利用します。

一方、プログラムを作成する環境であるVS CodeはWindows上のものを利用します。VS CodeはクロスプラットフォームなのでLinux版もありますが、日本語入力などを考えるとWindowsの方が優れているためWindows版を利用します。

つまり、Windows上のVS Codeでプログラムを入力しつつ、WSL2のLinuxでコンパイル・実行・デバッグ(リモート開発)を行うというのが、構築したい環境になります。

VS Codeの導入と日本語化

まずはWindowsにVS Codeをインストールしていきましょう。

インストール

インストーラは下記から取得できます。

Download Visual Studio Code - Mac, Linux, Windows
Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows. Download Visual Studio Code to experience a redefined code editor, optimized for building and debugging modern web and cloud applications.

インストーラにはインストーラを実行したユーザアカウントのみがVS Codeを利用できる「User Installer」と、アカウントを持っている人のすべてがVS Codeを利用することができる「System Installer」の2つがあります。

どちらを選んでも問題ありません。

インストーラをダウンロードしたら実行してVS Codeをインストールします。

インストーラは日本語化されていますし、それほど難しくないと思います。オススメとしては途中で表示される「PATHへの追加」を有効にしておくことです(デフォルトで有効になっています)。

なお、PATHへの追加は再起動後に有効になるので、インストールが完了したら一度Windowsを再起動しておきましょう。

日本語化

次にVS Codeを実行してみます。

最初は表示されているメッセージがすべて英語ですが、右下に日本語の言語パックをインストールするメッセージが表示されるはずです。

日本語の拡張機能の導入

この「インストールして再起動」を選択しましょう。

VS Codeが再起動され、表示されているメニュー・メッセージが日本語になっているはずです。

日本語化されたVS Code

日本語化は「Japanese Language Pack for Visual Studio Code」という拡張機能により実現されています。

もし初回起動時に言語パックを入れ損ねた場合は画面左の拡張機能アイコンから導入することができます。

Japanese Language Pack for Visual Studio Code

拡張機能アイコンを選択すると、拡張機能を検索するためのテキストボックスが表示されるので「Japanese」と入力します。

表示された拡張機能の中から制作者が「Microsoft」と書かれているものを探し、小さい「Install」のボタンを選択します。

これで次のような画面になるので右下の「Restart」を選択します。

Japanese Language Pack for Visual Studio Code導入後の再起動

これで日本語化されるはずです。

C言語開発のための環境構築

VS Codeが使えるようになったらWSL2側でC言語を開発するための環境を整備していきます。

WSL2のLinuxへ開発環境の導入

WSL2にコンパイラなどの開発環境が入っていなければ何もできませんので導入しておきましょう。

Ubuntu/Mintの場合はbuild-essentialパッケージでコンパイラ等がインストールされます。デバッガ(gdb)も入れておきます。

$ sudo apt-get update
$ sudo apt-get install build-essential gdb

ちゃんとインストールできたかどうかはバージョンを表示させて確認しましょう。

$ gcc --version
gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ gdb --version
GNU gdb (Ubuntu 9.2-0ubuntu1~20.04.1) 9.2
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http: gpl.html="" licenses="" gnu.org="">
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

またVS CodeとWSLを連携する際に、データの取得を行うことがあるのでwgetコマンドとca-certificatesをインストールしておきます。

$ sudo apt-get install wget ca-certificates

VS Codeへ拡張機能の導入

次にVS Codeに必要な拡張機能を導入していきます。

まず、C言語の開発を補助する「C/C++」と「C/C++ Extension Pack」を導入します。

VS Code画面の左側で拡張機能アイコンを選び「C++」で検索すると、Microsoftが作成した拡張機能である「C/C++」と「C/C++ Extension Pack」が上位に来るはずです。

「C/C++」と「C/C++ Extension Pack」の導入

これらをインストールしておきます。

同様に「Remote Development」で検索して「Remote Development」拡張機能をインストールします。

Remote Developmentのインストール

これで「Remote – SSHL」拡張機能も導入されているはずです。

VS Codeを使ったリモート開発

環境が整ったのでさっそく始めてみましょう。

VS CodeとWSL2の接続

まず、VS CodeがWSL2と接続された状態にします。

左下の歯車アイコンを選択して「コマンドパレット」を選びます。

コマンドパレットの選択

これで画面上部にコマンドを入力するエリアが表示されるので「SSH」と入力すると、「Remote – SSH」拡張機能の提供する機能が表示されます。

Remote-SSHの機能

WSL2のLinuxとの接続を設定するためには「Remote-SSH: Add New SSH Host」を選択します。

すると「Enter SSH Connection Command」と表示されるので

ssh アカウント名@ホスト名 -4 -p ポート番号

と入力します。ここで

  • アカウント名: WSL2のLinux上のアカウント名
  • ホスト名: WSL2が動いているWindows PCのホスト名(IPアドレスでも可)
  • ポート番号: WSL2が動いているWindows PCで転送設定したSSH用のポート番号

となります。

「-4」は通信にIPv4を使うように指定するものです。

WSL2に外部から接続するためにはWindowsでポートプロキシのの設定をする必要がありますが、現状ではIPv4にしか対応していないためです(IPv6だとWSL2に接続できません)。

次にSSHの設定を保存するファイルを聞かれます。これは「c:\Users\ユーザ名\.ssh\config」を選択すれば良いと思います。

SSHの設定を保存

これでSSHの設定が保存されたことが右下に表示されます。ここに「Connect」というボタンがあるのでこれを選択して接続してみましょう。

SSHで接続

この右下の表示が消えてしまった場合は、左端のリモートエクスプローラのアイコンを選び、上部のドロップダウンボックスから「SSH Targets」を選ぶと、追加したSSH接続設定が表示されます。

あとは表示される接続のアイコンを選択すれば、接続を開始します。

リモートエクスプローラから接続

これで新しいVS Codeのウィンドウが開きWSL2との接続を開始します。

最初は接続先のプラットフォームを聞かれるので「Linux」を選択します。

接続プラットホームの選択

次に接続先のフィンガープリントが表示されるので「Continue」を選択します。

接続先のフィンガープリントの確認

最後にパスワードを聞かれるので、WSL2のLinuxへログインするためのパスワードを入力します。

ログインパスワードの入力

これでSSHの接続が確立し、左下のエリアに「SSH:WSL2のホスト名」と表示されるようになります。

SSHでの連携の完了

これでVS CodeとWSL2のLinuxがSSHで連携できている状態となります。

なお、初回はWSL2側にファイルを導入する必要があるので、少々待ち時間が必要です。

SSH接続時のパスワード入力を省略する

このセクションの設定は必須ではありません

WSL2のLinuxのSSHで公開鍵認証の設定をしておけば、SSHの接続時に公開鍵を使うことでパスワードの入力を省略できます。

公開鍵を使うにはVS Codeのリモートエクスプローラで「SSH Target」を選択し、歯車アイコンを選択します。

SSHの設定

次に更新する設定ファイルを選択するように言われるので、先ほど保存したファイルを選択します。

SSHの設定ファイルを選択

これで現在の設定ファイルが表示されます。

 表示されたSSHの設定ファイル

私の場合は次のようになっていました。

Host 接続先のホスト名
  HostName 接続先のホスト名
  User WSL2でのユーザ名
  AddressFamily inet
  Port 10022

「AddressFamily」は「-4」オプションでIPv4を指定したため、「Port」は「-p」オプションでポート番号を指定したために設定ファイルに書かれています。

この設定に公開鍵認証を使う設定を追記すると次のようになります。

Host 接続先のホスト名
  HostName 接続先のホスト名
  User shino
  AddressFamily inet
  Port 10022
  IdentityFile "公開鍵認証に用いる秘密鍵ファイルのパス"

この設定をしておくと、リモートエクスプローラで接続先のホスト名を選択するだけで、VS CodeとWSL2を連携させることができるのでオススメです。

WSL2のLinux側に拡張機能を入れる

SSHでVS CodeとWSL2の連携がとれたら、WSL2側に拡張機能を入れていきます。

WSL2のLinuxとSSHで接続している状態で、右側の拡張機能を選びます。

リモート側に拡張機能の導入

そして「LOCAL – インストール済」のところを確認すると「SSH:ホスト名にインストールする」となっている拡張機能があると思います。

このような拡張機能を探し片っ端から「SSH:ホスト名にインストールする」を選択していきましょう。

プログラムを作成する(コーディング)

使い勝手を確認するために、ここではWSL2のLinuxのホームディレクトリに「vscode/c_test」というディレクトリを作成し、その中にフィボナッチ数を計算するプログラムfibonacci.cを作成することにしましょう。

フォルダを作成するにはVS Codeで行うこともできますが、ここではVS Codeのターミナルでコマンドを入力します。

まずVS Codeで「ターミナル」→「新しいターミナル」を選択します。すると画面下部にターミナルが表示されWSL2のLinuxのコマンドが入力できるようになります。

ターミナルを表示させディレクトリを作成

ここで次のコマンドを入力してフォルダを作成します。

$ mkdir -p vscode/c_test

フォルダができたら、VS Codeの「ファイル」→「フォルダーを開く」を選択します。

作業用フォルダを開く

これで画面中央上部に「フォルダーを開く」と表示され、開くフォルダを選べる状態になります。

VS CodeとWSL2がSSHで連携できていれば、ここで選択できるフォルダはWSL2のLinux内のフォルダになります。

デフォルトではホームディレクトリが表示されると思うので、先ほど作成したフォルダ(VSCode/c_test)を入力してOKを選択します。。

すると次のように「フォルダー内のファイルの作成者を信頼しますか?」と聞かれるので、「はい、作成者を信頼します」を選択します。

フォルダの作者を信頼

これでVS Codeの左側の「エクスプローラ」の領域にWSL2のc_testディレクトリが表示されます。

フォルダを開いた状態

ここで「エクスプローラ」の領域の「C_TEST」部分にマウスを持って行くと「新しいファイル」というアイコンがあるのでこれを選択します。

新しいファイルを作成

これでファイルを作成できますので、ファイル名に「fibonacci.c」を入力します。

これでc_testディレクトリの下にファイルfibonacci.cが作成されます。そして、作成されたfibonacci.cが右側に開かれ編集可能な状態となっています。

作成されたファイル

あとはfibonacci.cに下記のコードを入力します。これは10のフィボナッチ数を計算するコードです。

#include <stdio.h>

static int fibonacci(int n) {
    if ( (n== 0) || (n == 1) ) {
        return n;
    }
    return fibonacci(n - 2) + fibonacci(n - 1);
}

int main(int argc, char* argv[]) {
    int n = 10;
    int fibo;

    fibo = fibonacci(n);

    printf("fibonacci(%d) = %d\n", n, fibo);

    return 0;
}

VS Codeの画面ではこんな感じに色分けされて、見やすくなっているはずです。

プログラムを入力した状態

実行する

プログラムを作成したら実行してみましょう。

実行はVS Codeのメニューで「実行」→「デバッグ無しで実行」を選択します。Ctrl+F5でもOKです。

初回はVS Codeの画面中央上部に「環境の選択」が表示されるので「C++ (GDB/LLDB)」を選択します。

実行する環境の選択

続いて「構成の選択」と表示されるので「gcc – アクティブファイルのビルドとでバッグ」を選択します。

構成の選択

これで入力したプログラムがコンパイルされ、実行されます。

プログラムが実行された状態

ただ、右下の方に表示されたのがデバッグコンソールだと、

The program '/home/___/vscode/c_test/fibonacci' has exited with code 0 (0x00000000). 

とだけ表示されて、正常に実行されたことしかわかりません。

その場合は「デバッグコンソール」の隣の「ターミナル」あるいは「・・・」を選択しましょう。これでターミナル画面になり、実行し結果(printfした内容)がわかります。

ターミナルで実行結果を確認

ここでは10のフィボナッチ数が55と計算されています。

デバッグする

せっかくなのでデバッグしてみましょう。

今回は関数fibonacciにブレークポイントを設定して動きを見てみます。

ブレークポイントを設定するにはブレークポイントを設定したい行の行番号の左側をクリックします。

ブレークポイントの設定

ブレークポイントの設定に成功すると、画面左下の「ブレークポイント」の領域に設定したブレークポイントが追加されます。

ブレークポイントの設定ができたらデバッグを開始してみましょう。デバッグの開始は「実行」→「デバッグの開始」(あるいはF5)です。

ここで「環境の選択」と「構成の選択」が表示された場合は、前のセクションと同様に「C++ (GDB/LLDB)」と「gcc – アクティブファイルのビルドとでバッグ」を選択してください。

するとfibonacci関数が呼ばれたところで、実行が止まる(ブレークする)はずです。

ブレークした状態

ソースコードの3行目がハイライトされ、ここを実行するところでブレークしたことがわかります。

また、画面左側のコールスタックをみると、main関数からfibonacci関数が実行されたことがわかります。

左側の変数の領域でlocalが変な値(32767)になっているのは、まだfibonacci関数の処理に入っておらず、引数の変数が初期化されいないためです。

ここでステップ実行してみましょう。ステップオーバーはF10あるいは下記のボタンです。

デバッグ時の操作用ツールバー

ちなみにこのボタンは、左から続行(F5)、ステップオーバー(F10)、ステップイン(F11)、ステップアウト(Shift+F11)、再起動(Ctrl+Shift+F5)、中止(Shift+F5)となります。

これで次の行(4行目)にハイライトが移動し、変数nの値が10であることがわかります。

ステップ実行した状態

従って引数を10としてfibonacci関数が呼ばれていることがわかります。

ここで続行(F5)をしてみると、次のように再びfibonacci関数(3行目)でブレークします。コールスタックをみるとmain関数→fibonacci関数→fibonacci関数と呼び出されていることがわかります。

2回目のブレーク

ちなみにステップ実行するとこのときの引数が「8」で有ることがわかります。

このようにVS Codeを使うとLinuxのコマンドを入力することなく、グラフィカルにコーディング・デバッグを行うことができます。

ビルドとデバッグ設定の確認と変更

さて今回はコンパイラはgccを使うように指定しましたが、コンパイラに渡すオプションについては何も指定しませんでした。

これをカスタマイズしてみましょう。

これ以降の記事は結構試行錯誤したところもあります。

よりよい方法があればコメント欄からご指摘いただけると助かります。

ビルド設定の確認

実際にどのようなコンパイルオプションが使用されているのかは、「ターミナル」→「既定のビルドタスクの構成」で表示させることができます。このメニューを選択すると「既定のビルドタスクとして利用するタスクを選択」としてリストが表示されるので「構成されたタスク」というタスクを選択します。

タスクの選択

これでtasks.jsonというファイルが開かれます。

現状のタスクの表示

私の場合はこのファイルは次のような内容になっていました。

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: gcc アクティブなファイルのビルド",
            "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"
}

argsの部分がコンパイラ(gcc)に渡されるオプションです。これをみると「-g」でデバッグ情報を付与していますが、最適化オプションなどは指定されていないことがわかります。

ちなみに「既定のビルドタスクとして利用するタスクを選択」のときに表示された「デバッガーによって生成されたタスク」はこのtasks.jsonの”detail”に対応していることがわかります。

ビルド設定の追加

新たにビルド設定(タスク)を追加してみましょう。

作成したソースファイル(fibonacci.c)が表示されている状態で「ターミナル」→「タスクの構成」を選択します。「構成するタスクの選択」が表示されたら「C/C++: gccアクティブファイルのビルド」を選択しましょう。

構成するタスクの選択

すると再びtasks.jsonが表示されますが、tasksリストの中にもう一つタスクが追加されたことがわかります。

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: gcc アクティブなファイルのビルド",
            "command": "/usr/bin/gcc",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "デバッガーによって生成されたタスク。"
        },
        {
            "type": "cppbuild",
            "label": "C/C++: gcc アクティブなファイルのビルド",
            "command": "/usr/bin/gcc",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": "build",
            "detail": "コンパイラ: /usr/bin/gcc"
        }
    ],
    "version": "2.0.0"
}

この追加されたタスクをデバッグ用に最適な設定にしてみます。

具体的には、”args”に「最適化を無し(-O0)」、「コンパイルの警告を表示(-Wall)」を追加しましょう。またわかりやすいように”label”と”detail”の記述の修正しておきます。

同様にタスクを追加(コピペでOK)し、こちらはリリース用の設定としてみます。

このようにして修正したtasks.jsonは次のようになります。

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: gcc アクティブなファイルのビルド",
            "command": "/usr/bin/gcc",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "デバッガーによって生成されたタスク。"
        },
        {
            "type": "cppbuild",
            "label": "C/C++: gcc アクティブなファイルのビルド (デバッグ用)",
            "command": "/usr/bin/gcc",
            "args": [
                "-Wall",
                "-O0",
                "-fdiagnostics-color=always",
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": "build",
            "detail": "コンパイラ: /usr/bin/gcc (デバッグ用)"
        },
        {
            "type": "cppbuild",
            "label": "C/C++: gcc アクティブなファイルのビルド (リリース用)",
            "command": "/usr/bin/gcc",
            "args": [
                "-Wall",
                "-O3",
                "-fdiagnostics-color=always",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": "build",
            "detail": "コンパイラ: /usr/bin/gcc (リリース用)"
        }
    ],
    "version": "2.0.0"
}

この例はあまり意味のない追加かもしれません。

しかし、より複雑なコンパイルオプションを利用するケースもあると思いますので、tasks.jsonの修正方法は覚えておいた方が良さそうです。

これでタスクが2つ追加されましたので試してみましょう。

再びプログラムのソースファイル(fibonacci.c)を表示された上で、「ターミナル」→「タスクの実行」を選んでみましょう。

画面上部に「実行するタスクの選択」と表示され、先ほど作成したタスク「C/C++: gcc アクティブなファイルのビルド (デバッグ用)」と「C/C++: gcc アクティブなファイルのビルド (リリース用)」が有るはずです。

追加したビルド設定(タスク)

ここで「C/C++: gcc アクティブなファイルのビルド (リリース用)」を選んでみると、右下のターミナルのエリアに実行されたコマンドが表示されます。

追加したビルド設定(タスク)の実行結果

tasks.jsonで指定したように「-Wall」と「-O3」のオプションが付いていることがわかります。

同様に「C/C++: gcc アクティブなファイルのビルド (デバッグ用)」を選択すると「-Wall」と「-O0」のオプションでコンパイルされます。

デバッグ構成の変更

さてtasks.jsonを編集してビルド設定(タスク)を追加したら、デバッグ時に利用できるようにしましょう。

利用するのは当然ながら「C/C++: gcc アクティブなファイルのビルド (デバッグ用)」です。

「C/C++: gcc アクティブなファイルのビルド (リリース用)」で作成される実行ファイルは、デバッグに必要な情報がついていないので、デバッグには不適当です。

ソースファイル(fibonacci.c)が表示されている状態で「実行」→「構成の追加」を選択し、続いて表示される「環境の選択」で「C++ (GDB/LLDB)」を選択するとlaunch.jsonというファイルが生成されます。

launch.jsonの初期状態

このlaunch.jsonというファイルはデバッグ(実行)時に行われる処理を記述するものです。

最初はlaunch.jsonの内容は実質ないと思いますので、右下の「構成の追加」を選択します。

すると追加する構成(テンプレート)が選べますので「C/C++: (gdb)起動)」を選択します。

launch.jsonに追加する構成の選択

するとlaunch.jsonにgdbを起動するための設定が挿入され、次のようになります。

{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) 起動",
            "type": "cppdbg",
            "request": "launch",
            "program": "プログラム名を入力してください (例: ${workspaceFolder}/a.out)",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "gdb の再フォーマットを有効にする",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description":  "逆アセンブリ フレーバーを Intel に設定",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

「configuration」の値(リスト)が、デバッグ(実行)時に行われる処理を示しています。

これはあくまでもテンプレートなので、そのままでは動きません。そこで次のように修正します。

{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "gcc - アクティブファイルのビルドとデバッグ",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "gdb の再フォーマットを有効にする",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description":  "逆アセンブリ フレーバーを Intel に設定",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C/C++: gcc アクティブなファイルのビルド (デバッグ用)",
        }
    ]
}

修正したのは「name」「program」の値を変更した点と、「preLaunchTask」を追加した点です。

「preLaunchTask」では、デバッグ(実行)の開始前に実行されるビルド設定(タスク)を指定します。ここでは先ほど作成した「C/C++: gcc アクティブなファイルのビルド (デバッグ用)」を指定しました。

このようにすると、ソースファイル(fibonacci.c)が表示されている状態で「実行」→「デバッグの開始」あるいは「実行」→「デバッグ無しで実行」を選ぶと、指定したビルド設定(「-Wall」と「-O0」でビルド)を適用してビルドした後に、デバッグあるいは実行することができます。

まとめ

今回はWindowsにVS Codeをインストールして、WSL2のLinuxでC言語を使って見ました。

VS Codeの拡張機能「Remote – SSH」を使用すると、WSL2のLinuxとSSHで接続できるようにしておけば、シームレスにC言語プログラムのコーディング・コンパイル・デバッグをすることができます。

次回はVS Codeのキーバインドについて検討します。

コメント

タイトルとURLをコピーしました