Hatena::Grouperlang

檜山正幸のErlang未確認情報 RSSフィード

 | 

2009-03-26 (木)

Erlangデバッガ

| 15:29

使い方の説明は、PDF文書 http://www.erlang.org/doc/pdf/debugger.pdf が便利。ただし、P.18までで十分。P.19以降はmanページと同じだから、http://www.erlang.org/doc/apps/debugger/ とか http://www.erlang.org/doc/man/ を見ても同じ。

kernelの動きを追えるかと思ったがそりゃ無理だった。けっこう高水準な所でデバッグ専用インタプリタエミュレータとは別)が動いている模様。まー、デバッガ使うこともあるだろうから知っておいて損はない。本編に書くかも知れないが、今日はメモだけ。

  1. コンパイル時に debug_infoオプションがないとダメ。
  2. .beamファイルと.erlファイルの両方にアクセス可能じゃないとダメ。
  3. im()またはdebugger:start()で起動。iモジュールシェルインポートされている。
  4. GUI以外に、i, intモジュール関数インターフェースを提供する。
  5. 使うウィンドウは、Monitor(メイン)、ViewModule(ソースコード表示)、Attach Process(個々のプロセスと接続)の3種。以下、ウィンドウ名をブラケットに入れて[Monitor]などと記す。

手順:

  1. EShellからデバッガ起動。[Monitor]が出る。
  2. Module > Interpret でモジュール(.erl, .beam)を選択・追加。デバッグ対象は、モジュール群。
  3. [Monitor]の左にモジュールリスト、主領域にプロセスグリッド
  4. モジュールリストのモジュールエントリーダブルクリックで[ViewModule]
  5. ソース行でダブルクリック。その行にブレークポイントを設定できる。
  6. EShellで普通に操作。プロセスブレークポイントに達すると当該プロセスが停止する。
  7. [Monitor]のプロセスグリッドの当該の行をダブルクリックすると[Attach Process]ウィンドウが出る。
  8. [Attach Process]のボタンを使って実行を制御できる。

GUIGSで作ってあるからショボイし、ウィンドウが何枚も出て使いにくい。とはいえ、必要な機能は揃っているかな。デバッグよりは、既存プログラムの動作や構造の理解と確認に使おうと思ったが、前述のごとく、kernelとstdlibとデバッガ自身は対象外(ムーッ、他の方法を考えよう)。

個人的な好みでは、GUIよりはコマンドラインのほうがいいけどな。-- Emacsから使えれば、せめてEShellと統合されてれば、もっと日常的に使うんだが、、、ウィンドウを移動する手間がカナワン!

普通の用途ではフツーに使えるだろうから、開発中はdebug_info付けておくとよいだろう。Emakefile、Makefileとかに書いて。ただし、debug_info付きのbeamからソースを再現可能。

ブレイクポイントはソース行以外に、関数ブレイクポイントというのがある。また、条件付きブレイクポイントつうのが使いでがありそうだ。ブレイクポイントにC-モジュール(C-Module)のC-関数(C-Function)を指定する。ここで「C」はConditionのこと。

C-関数引数(1個)にはBindingsが入る。これは、なんちゃってのアレみたいだよ。オフィシャルには、int:get_bindig(Name, Bindings) -> {value, Val} | unbound しかサポートされてない。

%% -*- coding: utf-8 -*-

%% @doc 条件付きブレイクポイントのテスト
-module(c_test).

-export([print_x/1]).

%% @doc 変数Xの値を表示する
%% @spec (Bindings) -> bool()
print_x(Bindings) ->
  io:format("~p~n", [int:get_binding('X', Bindings)]),
  true.

こういう関数を条件として指定する。戻り値がtrueならブレイクして、falseならそのまま続行する。

あと、Windows上で右クリックは効かないようだ。

 |