Fusic Tech Blog

Fusion of Society, IT and Culture

21世紀のC言語勉強会に備えてVS Codeでmrubyのデバッグ環境を準備した
2020/07/05

21世紀のC言語勉強会に備えてVS Codeでmrubyのデバッグ環境を準備した

岡嵜です。

明日21:00より開催予定の21世紀のC言語勉強会 #1に、ツッコミ係として参加予定です。

私自身数年ぶりにmrubyのソースコードを読むのですが、C言語のコードを読むときにブレイクポイントを貼ったり、ステップ実行したりできる、デバッグ環境があるととても捗ります。

本記事ではVS Codeとlldbを利用して、mrubyのデバッグ環境を構築する方法についてまとめます。

mrubyの準備

mrubyの取得・コンパイル

以下コマンドを実行して、mrubyを取得・コンパイルします。

$ git clone git@github.com:mruby/mruby.git
$ cd mruby
$ make all

もし、ここで何らかのエラーが出るようであれば以下ファイルを参照して、不足しているツールやライブラリが無いか確認してください。大抵はgccやmakeが無かったり、bisonが無かったりといった原因であることが多いです。

https://github.com/mruby/mruby/blob/master/doc/guides/compile.md

mrubyに含めるgemを変更し、デバッグモードにする

21世紀のC言語勉強会 #1ではmruby-socket, mruby-ioのソースコードを読む予定とのことです。

デフォルト設定だとこれらのmrbgemは含まれていないので、設定を変更します。

build_config.rb をエディタで開いて、conf.gembox の引数を full-core に変更します。

MRuby::Build.new do |conf|
  # load specific toolchain settings

  (省略)

  # include the default GEMs
  # conf.gembox 'default' <- コメントアウト
  conf.gembox 'full-core' # <- 追加

  # C compiler settings
  
  (省略)

  # bintest
  # conf.enable_bintest
end

(省略)

また、デバッグを有効にするために enable_debug のコメントを無効化します。

MRuby::Build.new do |conf|
  # load specific toolchain settings

  (省略)

  # Turn on `enable_debug` for better debugging
  enable_debug # <- コメントを外す

  (省略)

  # include the default GEMs
  # conf.gembox 'default' <- コメントアウト
  conf.gembox 'full-core' # <- 追加

  # C compiler settings
  
  (省略)

  # bintest
  # conf.enable_bintest
end

(省略)

完了したら、再度コンパイルしておきましょう。

$ make clean
$ make all

VS Codeの設定

C/C++ Extensionsをインストール

[EXTENSIONS] -> [C/C++]を開いてインストールします。

C/C++ Extensionsのインストール

lldbのインストール

macであればデフォルトでlldbがインストールされていると思いますが、ない場合はインストールしておきます。

デバッグ対象のサンプルプログラムを準備

今回はサンプルとして mruby-socket のREADMEに記載されているサンプルプログラム(example.rb)を準備します。

s = TCPSocket.open("www.kame.net", 80)
s.write("GET / HTTP/1.0\r\n\r\n")
puts s.read
s.close

デバッグ設定

VS CodeでC言語のコード(例: mruby.c)を開いて F5 キーを入力します。

launch.json が開かれるので以下の通り設定します。

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "(lldb) 起動",
      "type": "cppdbg",
      "request": "launch",
      "program": "${workspaceFolder}/bin/mruby",
      "args": ["${workspaceFolder}/example.rb"],
      "stopAtEntry": false,
      "cwd": "${workspaceFolder}",
      "environment": [],
      "externalConsole": false,
      "MIMode": "lldb"
    }
  ]
}

以上で設定完了です。

デバッグ

試しに socket.cmrb_socket_connect() にブレイクポイントを貼ってみます。

ブレイクポイントの設定

このまま、 F5 キーを入力します。

プログラムの中断

ブレイクポイントを貼った行でプログラムの実行が中断しています。このまま、各変数の値を参照したり・書き換えたりすることもできますし、プログラムを任意の行まで進めることもできます。

まとめ

久々にmruby, C言語に触れるので、ワクワクドキドキしています!

yuuu

yuuu

2018年の年明けに組込み畑からやってきた、2児の父 兼 Webエンジニアです。 mockmockの開発・運用を担当しており、組込みエンジニア時代の経験を活かしてデバイスをプログラミングしたり、簡易的なIoTシステムを作ったりしています。主な開発言語はRuby、時々Go。