みつきんのメモ

組み込みエンジニアです。Interface誌で「Yocto Projectではじめる 組み込みLinux開発入門」連載中

Yocto Project VS Code連携機能を試す(C/C++)

はじめに

ScarthgapからVS Codeを使用してプログラムをデバッグする機能が実装された。 この機能を使用すると、VS Codeで実機上のプログラムにブレークポイントを貼ったり変数を見たり、 ソースコードでレベルのデバッグが可能となる。

ユーザーランドのプログラムが対象となる。

C/C++のみならず、Pythonのプログラムもデバッグできることが確認できているが 今回はC++のプログラムを試す。

環境構築

作業ディレクト

作業ディレクトリを作成する。

$ mkdir -p ~/yocto/scarthgap
$ cd ~/yocto/scarthgap

Pokyの取得

scarthgapブランチの最新を使用する場合は下記。

$  git clone git://git.yoctoproject.org/poky.git -b scarthgap

リリースされたタグのバージョンを使用する場合は下記。

$ git clone git://git.yoctoproject.org/poky.git
$ git fetch --tags
$ git checkout -b tags/scarthgap-5.0.2 scarthgap-5.0.2

local.confの修正

qemuのための設定

MACHINE ?= "qemuarm64"
INIT_MANAGER ?= "systemd"
DL_DIR ?= "${TOPDIR}/../downloads"

QB_OPT_APPEND:append = " -echr 0x14"

2.4.3 devtool ide-sdk configures IDEs for the extensible SDKにあるデバッグのための設定

# Build the companion debug file system
IMAGE_GEN_DEBUGFS = "1"
# Optimize build time: with devtool ide-sdk the dbg tar is not needed
IMAGE_FSTYPES_DEBUGFS = ""
# Without copying the binaries into roofs-dbg, GDB does not find all source files.
IMAGE_CLASSES += "image-combined-dbg"

# SSH is mandatory, no password simplifies the usage
EXTRA_IMAGE_FEATURES += "\
   ssh-server-openssh \
   debug-tweaks \
"

# Remote debugging needs gdbserver on the target device
IMAGE_INSTALL:append = " gdbserver"

# Add the recipes which should be modified to the image
# Otherwise some dependencies might be missing.
#IMAGE_INSTALL:append = " my-recipe"

ビルド

bitbakeを実行する。

$ source poky/oe-init-build-env
$ bitbake core-image-minimal

QEMUの起動

別の端末でQEMUを起動する。

$ cd ~/yocto/scarthgap
$ source poky/oe-init-build-env
$ runqemu nographic

sshでリモートログインできることを確認する。

$ ssh root@192.168.7.2

鍵の変更

イメージをビルドし直したりすると以下のようなエラーになる。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256:7KqOsjJ5UpIVp4+93opn8mKZpG1qE7foMbt26ItqmXA.
Please contact your system administrator.
Add correct host key in /home/mickey/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/mickey/.ssh/known_hosts:41
  remove with:
  ssh-keygen -f "/home/mickey/.ssh/known_hosts" -R "192.168.7.2"
Host key for 192.168.7.2 has changed and you have requested strict checking.
Host key verification failed.

下記のコマンドを実行して古い鍵情報を削除する。

$ ssh-keygen -f "/home/mickey/.ssh/known_hosts" -R "192.168.7.2"

VS Codeでのデバッグ

デバッグ対象プログラム

デバッグ対象のプログラムをworkspaceに展開する。

$ devtool add https://github.com/mickey-happygolucky/hello-autotools.git -B main

VS Codeの設定ファイル

VS Codeデバッグするための設定ファイルを作成する。

$ devtool ide-sdk hello core-image-base --target root@192.168.7.2

パラメータは以下のようになっている。

$ devtool ide-sdk <プログラム> <イメージ> --target <ターゲットの接続情報>

デバッグ

VS Codeでプロジェクトを開く

$ code workspace/sources/hello/

以下のようなウィンドウが表示される。

ブレークポイント設定

画面左側のEXPLORERからsrc/main.cppを選択する。

エディタに表示される行番号の左側をクリックするとブレークポイントを設定することができる。 今回は4行目にブレークポイントを設定する。

画面左側のデバッグアイコンをクリックする。

デバッグ開始をクリックする。

場合によっては以下のようにメッセージボックスが表示されるので気にせずキャンセルする。

メッセージボックスをすべてキャンセルすると、エントリポイントでプログラムが停止する。

画面上部の継続ボタンをクリックする。

設定したブレークポイントの位置でプログラムが停止する。

バックグラウンドの動作

VS Codeで、ビルドやデバッグ開始を行うと実際には次のような処理が行われる。

ビルド

  • devtool build

デバッグ開始

  • devtool deploy-target
  • ターゲットのgdbserver起動
  • gdb接続

まとめ

devtool ide-sdkを使用することでVS Codeと連携するための設定ファイルを出力することができる。 VS Codeでシームレスにソースコードの修正、ビルド、デバッグが行えるので非常に便利。

今回はBitBake環境でdevtoolを使用したが、 拡張SDK(Extensible SDK)環境のdevtoolでも同様のことが可能となっている。

Scarthgapから導入された機能なので、それ以前のバージョンでは使用することができない。