🗂

gps-sdr-simをデバッグ実行する環境を構築してみた(WSL編)

に公開

動機

  1. 前回、Windowsでgps-sdr-simをデバッグ実行する環境を構築。
  1. しかし、以下の理由でWindowsよりもLinuxの方が適正がありそう。
     - LinuxはSDRおよびGNSS解析コミュニティでメジャー
     - SDRボード関連の多くのライブラリはLinuxを利用している。
     - Linuxカーネルは低レベルのハードウェアI/O処理に優れており、リアルタイム性が優れる。
     - etc ...
  2. 慣れ親しんだWindowsも手放せない。

手順

ステップ1 WSLとUbuntuのインストール: Windows上でLinux環境を実行するための機能としてWSLと、Linuxの標準ディストリビューションであるUbuntuをインストール。
ステップ2 Ubuntu環境に開発ツールをインストール: C言語のコンパイラやデバッガなどをUbuntu上にインストール。
ステップ3 VSCodeにWSL拡張機能をインストール
ステップ4 VSCodeをWSLに接続してプロジェクトを開く
ステップ5 コンパイルと実行
ステップ6 デバッグ実行

ステップ1: WSLとUbuntuのインストール

WSLをインストールしていない場合はPowerShellまたはコマンドプロンプトを管理者として開き、以下のコマンドを実行します。

wsl --install

インストールが完了したらPCを再起動します。
再起動後、Ubuntuのターミナルを起動させてLinux用のユーザー名とパスワードを設定します。

ステップ2: Ubuntu環境に開発ツールをインストール

次に、WSLのUbuntu環境に必要なC/C++開発ツールをインストールします。
Ubuntuターミナルを開いて以下のコマンドを順番に実行します。

# パッケージリストを最新の状態に更新
sudo apt update
sudo apt upgrade

# C/C++コンパイラ(GCC)、デバッガ(GDB)、makeなどを一括でインストール
sudo apt install build-essential gdb

(補足)
build-essential: GCC, G++, makeなど、C/C++のビルドに必要な基本的なツールがまとめて入っている便利なパッケージです。
gdb: デバッガでステップ実行などに使われます。

ステップ3: VSCodeにWSL拡張機能をインストール

Windows上でVSCodeを起動して左側の拡張機能パネルを開き、WSLと検索します。
Microsoft提供の拡張機能である「WSL」をインストールし、Windows側のVSCodeにWSLを連携させます。

ステップ4: VSCodeをWSLに接続してプロジェクトを開く

Ubuntuターミナルを開きます。
gps-sdr-simのプロジェクトフォルダに移動します。
ソースを置きたいディレクトリ(例:home/[usr]/projects)にてgit cloneを実行します。

# 例: ホームディレクトリにprojectsフォルダを作り、そこにクローンした場合
cd ~/projects/gps-sdr-sim

そのフォルダで、以下のコマンドを実行します。

code .

このコマンドを実行すると、自動的にWindows側でVSCodeが起動し、WSL内のフォルダに接続された状態になります。VSCodeウィンドウの左下に緑色のインジケーターが表示され、「WSL: Ubuntu」のように表示されていれば成功です。

ステップ5: コンパイルと実行

VSCodeがWSLに接続された状態で、内蔵ターミナルを開く(Ctrl + @)と、PowerShellではなくUbuntuのbashターミナルが開きます。
コンパイル: コマンドはWindowsの時とほぼ同じですが、出力される実行ファイル名に.exeは付きません。

# -gオプションを付けてコンパイル
gcc -g gpssim.c -lm -o gps-sdr-sim

実行: Linuxでは、./を付けて実行します。

./gps-sdr-sim -e brdc0010.22n -l 35.6,139.7,100

※デフォルトで用意されているRINEXファイルを使用 brdc0010.22n

ステップ6: デバッグ実行

デバッグの操作感はWindowsの時と全く同じですが、設定ファイルlaunch.jsonの内容がLinux用に変わります。ブレークポイントを設定し、F5キーを押します。
初回はlaunch.jsonの作成を求められます。「C++ (GDB/LLDB)」→「Default Configuration」などを選択します。

生成された.vscode/launch.jsonを以下のように編集します。

launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch on WSL",
            "type": "cppdbg",
            "request": "launch",
            "preLaunchTask": "Build gps-sdr-sim",
            "program": "${workspaceFolder}/gps-sdr-sim", // WSLでは.exe がない
            "args": [
                "-e",
                "brdc0010.22n", // デフォルトのephemerisのファイルを直接指定
                "-l",
                "35.6,139.7,100"
            ],
            "stopAtEntry": true,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "/usr/bin/gdb", // LinuxでのGDBのパス
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

Windows版との主な違い:
program: 実行ファイル名から.exeがなくなります。
miDebuggerPath: gdb.exeのWindowsパスではなく、Linuxでの標準的なパス /usr/bin/gdb を指定します。
これで設定は完了です。F5キーを押せば、Windowsの時と全く同じように、ステップ実行、変数のウォッチ、コールスタックの確認といったデバッグがWSL上のLinux環境に対して行えます。

補足

チームで統一した開発環境を構築するために以下のJSONファイルを追加しておくとよい。
・VSCodeで使用する拡張機能について記載したextensions.json
・コーディングスタイルの統一を目的としたsettings.json
・ビルド作業の効率化を目的としたtasks.jsonなど

まとめ

Windows上でLinuxを動作させるWSLを用いることでUbuntu環境とし、VSCodeを用いたデバッグ実行するための環境を構築。
Windows上のものと若干異なるWSL上ならではのlaunch.jsonファイルを作成する。
-g 付きでコンパイルしたexeファイルは、通常実行にもデバッグ実行にも使える。

GNSSたまごくらぶ

Discussion