🚀

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

に公開

動機

  1. GNSSについて勉強し始めたがやはり実際に手を動かしてみるのが一番と感じる。
  2. OSSを参考に理解を深めようとした。
  3. C言語初心者であることもあり、実行せずに内容を理解するのは困難と感じる。
  4. ステップ実行などで処理の流れをひとつずつ丁寧に追う必要を感じる。
  5. VSCodeでデバッグ実行環境を構築しようと思い立つ。

手順

ステップ1 環境構築: C言語のデバッガやコンパイラ、Gitなど必要なツールをPCにインストール。
ステップ2 ソースコード取得: GitHubからgps-sdr-simのソースコードをクローン。
ステップ3 ビルド(コンパイル): ソースコード(.cファイル)を実行可能なプログラム(.exeファイル)に変換。
ステップ4 実行: 作成したプログラムを実行し、GPS信号データを生成。
ステップ5 デバッグ実行: ブレークポイントを張ったステップ実行や変数の値をウォッチする。

ステップ1: 環境構築(Windows11を前提とします。)

C言語で書かれたOSSであるgps-sdr-simをダウンロードしてVSCode上で扱うには、いくつかのツールを先にインストールする必要があります。

  1. Gitのインストール
    GitHubからソースコードを取得するためにGitが必要となります。
    公式サイトからインストーラーをダウンロードし、デフォルト設定のままインストールします。
  1. C言語コンパイラ (MinGW-w64) のインストール
    VSCodeはエディタなので、C言語のコードをプログラムに変換するコンパイラが別途必要です。今回はWindowsのためMinGW-w64を採用します。
    MinGW-w64を簡単に導入できるMSYS2を公式サイトからインストールします。

サイトの指示に従いインストーラーを実行します。
MSYS2からコンパイラをインストール: インストール後、スタートメニューから「MSYS2 MSYS」を起動し、表示された黒い画面(ターミナル)で以下のコマンドを順番に実行します。

# パッケージデータベースを最新にする
pacman -Syu
# さらに更新(一度ウィンドウが閉じる場合があります。再度起動して実行してください)
pacman -Su
# GCCコンパイラを含むツールチェーンをインストール
pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain

途中で選択肢が表示されたら、何も入力せずEnterキーを押してすべてインストールします。
環境変数PATHを設定: PCのどこからでもコンパイラを呼び出せるように、PATHを設定します。
Windowsの検索バーで「環境変数」と入力し、「システム環境変数の編集」を開きます。
「環境変数」ボタンをクリックします。
「システム環境変数」の欄にあるPathを選択し、「編集」をクリックします。
「新規」をクリックし、C:\msys64\ucrt64\bin と入力してOKを押します。(MSYS2のインストール先が異なる場合は、そのパスに合わせてください)
インストールの確認: 新しくコマンドプロンプトかPowerShellを開き、以下のコマンドを実行してバージョン情報が表示されれば成功です。

gcc --version
  1. VSCodeと拡張機能のインストール
    VSCodeをインストールしていない場合は、公式サイトからダウンロードします。
    VSCodeを起動し、左側のアクティビティバーから拡張機能のアイコン(四角が4つあるアイコン)をクリックします。
    検索バーにC/C++と入力し、Microsoftが提供している「C/C++」拡張機能をインストールします。

ステップ2: ソースコード取得

ソースコードを置きたいフォルダをエクスプローラーで開きます。
(例: C:\Users\YourName\Projects)
そのフォルダで右クリックし、「ターミナルで開く」または「Git Bash Here」を選択します。
表示されたターミナルで、以下のコマンドを実行してGitHubからソースコードをクローン(複製)します。

git clone https://github.com/sdr-sat/gps-sdr-sim.git

gps-sdr-simというフォルダが作成されます。VSCodeを起動し、「ファイル」メニューから「フォルダーを開く...」を選択し、このgps-sdr-simフォルダを開きます。

ステップ3: ビルド(コンパイル)

ソースコードをプログラム(.exeファイル)に変換します。
VSCodeでgps-sdr-simフォルダを開いている状態で、メニューの「ターミナル」から「新しいターミナル」を選択します。(ショートカット: Ctrl + @)
画面下部にターミナルが表示されるので、以下のコマンドを入力して実行します。

gcc gpssim.c getopt.c -lm -o gps-sdr-sim

(コマンドの説明)
gcc: Cコンパイラを起動する命令
gps-sdr-sim.c: コンパイル対象のソースファイル
-lm: 数学ライブラリをリンク(GPS計算に必要)
-o gps-sdr-sim: 出力される実行ファイルの名前をgps-sdr-sim.exeにする

コマンドが正常に完了すると、VSCodeのファイル一覧にgps-sdr-sim.exeというファイルが生成されます。これでビルドは完了です。

ステップ4: 実行

ビルドしたプログラムを実行して、GPSの信号データを生成します。
デフォルトでbrdc0010.22nという衛星軌道情報(RINEXファイル)が存在します。※1
任意の衛星軌道情報ファイルを使用したい場合は以下から取得します。
GPS衛星の軌道情報をダウンロード: プログラムの実行には、GPS衛星の軌道情報が記録されたRINEXナビゲーションファイルが必要です。これはNASAのサイトなどから入手できます。
ダウンロード先: NASA CDDIS GNSS Data Archive
適当な日付(例: 2024/001/24n/)を選び、brdc0010.24n.gzのようなファイルをダウンロードし、解凍して.24nファイル(これが本体)をgps-sdr-simフォルダ内に置きます。
ファイル名はbrdc*.nを選んでください。

※1 衛星軌道情報については送信側/受信側によってフォーマットが異なり、また受信側では情報やバージョンに応じた様々な種類のファイルが存在するため別の記事でまとめます。今回のソースコードではバージョン2かつGPS衛星の情報であるRINEXファイル(brdc*.n)を読み込むことを想定しています。

プログラムを実行: VSCodeのターミナルで、以下のコマンドを実行します。

# -e [軌道情報ファイル] -l [緯度,経度,高度]
./gps-sdr-sim.exe -e brdc0010.22n -l 35.68,139.76,100

(引数の説明)
-e brdc0010.22n: 使用するファイル名に応じて適宜変更してください。
-l 35.68,139.76,100: シミュレーションする地点の緯度、経度、高度を指定します。この例では東京駅付近の座標です。

結果の確認: 実行が完了すると、gps-sdr-simフォルダ内にgpssim.binというファイルが生成されます。これがシミュレーションされたGPSのI/Q信号データファイルです。

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

VSCodeのデバッグ機能はC言語でも同様に動作させることができ、プログラムの処理の流れを一行ずつ追跡し変数の値を確認したり、エラーの原因を特定するための手段として活用したりすることができます。
gps-sdr-simをデバッグ実行するための手順を記します。

デバッグを開始するには、以下の3つのステップが必要です。

  1. デバッグ情報付きでコンパイル (-gフラグ)
  2. ブレークポイントを設定
  3. デバッガを設定して起動 (launch.json)

1: デバッグ情報付きでコンパイルする
デバッガがソースコードと実行ファイルを紐づけるための「デバッグ情報」を埋め込んでコンパイルする必要があります。
まず、もし既存のexeファイルがあれば削除してください。
VSCodeのターミナルで、以前実行したコンパイルコマンドに -g というオプションを追加して実行します。-gオプションを付けると、生成されるgps-sdr-sim.exeにデバッグ用の情報が埋め込まれます。

デバッグ用コマンド:

gcc -g gpssim.c getopt.c -lm -o gps-sdr-sim

2: ブレークポイントを設定
ブレークポイントとは、「プログラムの実行をここで一時停止して」とデバッガに指示する目印です。
gpssim.c開き、処理を止めたい行の行番号の左側をクリックします。赤い丸が表示されれば、そこにブレークポイントが設定されたことになります。
ブレークポイント設定場所の例:

//main関数のはじめの方の処理
neph = readRinexNavAll(...)

3: デバッガを設定し起動
・VSCodeに「プログラムを、この設定でデバッグして」と教えるための設定ファイルlaunch.jsonを作成します。
・VSCodeの左側のアクティビティバーから「実行とデバッグ」アイコン(虫のマークに再生ボタン)をクリックします。
・「launch.jsonファイルを作成します」というリンクをクリックします。
・環境を選択するプロンプトが表示されたら、「C++ (GDB/LLDB)」を選びます。
・次に構成を選択するプロンプトで「gcc.exe - アクティブ ファイルのビルドとデバッグ」を選びます。
.vscodeというフォルダと、その中にlaunch.jsonというファイルが自動生成されます。このファイルの内容を、以下のように書き換えてください。

launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "gps-sdr-sim-debug", // デバッグ構成の名前(自由に変更可)
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/gps-sdr-sim.exe", // 実行ファイルへのパス
            "args": [
                // ↓ここに実行時のコマンドライン引数を入力↓
                "-e",
                "brdc0010.22n",
                "-l",
                "35.68,139.76,100",
                "-d",
                "10"
            ],
            "stopAtEntry": true, // trueにするとmain関数の冒頭で停止する
            "cwd": "${workspaceFolder}", // 作業ディレクトリ
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "C:/msys64/ucrt64/bin/gdb.exe", // gdb.exeへのフルパス
            "setupCommands": [
                {
                    "description": "gdb の再フォーマットを有効にする",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

設定が完了したら、いよいよデバッグを開始します。
「実行とデバッグ」パネルの上部にある緑色の再生ボタン▶️を押すか、キーボードのF5キーを押します。
プログラムが実行され、stopAtEntryをtrueにしていればmain関数の最初で、そうでなければ最初に設定したブレークポイントで実行が黄色い矢印で示されて一時停止します。

この状態で、デバッグツールバー(画面上部に表示)にて以下の操作が可能になります。
・続行 (F5): 次のブレークポイントまで実行を再開します。
ステップオーバー (F10): 現在の行を実行し、次の行へ進みます。関数呼び出しがあっても、その中には入りません。
・ステップイン (F11): 関数呼び出しの行で実行すると、その関数の内部へ入ります。
・ステップアウト (Shift+F11): 現在いる関数の最後まで実行し、呼び出し元の次の行へ戻ります。
・再起動 (Ctrl+Shift+F5): デバッグを最初からやり直します。
・停止 (Shift+F5): デバッグを終了します。

また、左側のパネルで以下のデバッグ機能を活用できます。
変数(VARIABLES): 現在のスコープ(関数内)にあるローカル変数やグローバル変数の中身がリアルタイムで表示されます。
ウォッチ(WATCH): 特定の変数名(例: chan[0].rho0.d)を入力しておくと、その値を常に監視できます。
コールスタック(CALL STACK): 現在どの関数がどの関数を呼び出しているかの階層が表示されます。

補足

-gオプションを付けてコンパイルした、デバッグ情報付きのexeファイルは、両方の用途に使えます。
通常実行: ターミナルから ./gps-sdr-sim.exe -e ... とコマンドを打てば、デバッグなしで普通に実行されます。
デバッグ実行: VSCodeでF5キーを押すと、デバッガが同じexeファイルを起動します。
つまり、開発中は常に-gを付けてコンパイルしておけば、一つのexeファイルで通常実行もデバッグ実行もできるので便利です。

まとめ

Windows11環境でC言語をVSCode上でデバッグ実行するための環境を構築。
ソースコード(.cファイル)を変更したら、再コンパイルする。
-g 付きでコンパイルしたexeファイルは、通常実行にもデバッグ実行にも使える。

GNSSたまごくらぶ

Discussion