[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38. Debugging


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.1 Source Level Debugging

Maximaは組み込みのソースレベルデバッガを持っています。 ユーザーは関数にブレイクポイントを設定でき、そこから行毎に実行することができます。 そのレベルでバインドされた変数と一緒にコールスタックを検査することができます。

コマンド :helpまたは :hでデバッガーコマンドのリストを示します。 (一般的にもし略字がただ1つなら、コマンドは略せます。 もしただ1つでないなら、選択肢がリストされます。) デバッガー内では、変数と式を検査し定義し操作するために、ユーザーは任意の通常の Maxima関数も使うことができます。

Maximaプロンプトで、 :brコマンドでブレイクポイントが設定できます。 デバッガー内では、ユーザーは、 :n ("next")コマンドを使って1度に1行進むことができます。 :bt ("backtrace")コマンドは、スタックフレームのリストを示します。 :r ("resume")コマンドは、デバッガーから抜けて、実行を続けます。 以下の例で、これらのコマンドを例示します。

 
(%i1) load ("/tmp/foobar.mac");

(%o1)                           /tmp/foobar.mac

(%i2) :br foo
Turning on debugging debugmode(true)
Bkpt 0 for foo (in /tmp/foobar.mac line 1)

(%i2) bar (2,3);
Bkpt 0:(foobar.mac 1)
/tmp/foobar.mac:1::

(dbm:1) :bt                        <-- :bt typed here gives a backtrace
#0: foo(y=5)(foobar.mac line 1)
#1: bar(x=2,y=3)(foobar.mac line 9)

(dbm:1) :n                         <-- Here type :n to advance line
(foobar.mac 2)
/tmp/foobar.mac:2::

(dbm:1) :n                         <-- Here type :n to advance line
(foobar.mac 3)
/tmp/foobar.mac:3::

(dbm:1) u;                         <-- Investigate value of u
28

(dbm:1) u: 33;                     <-- Change u to be 33
33

(dbm:1) :r                         <-- Type :r to resume the computation

(%o2)                                1094

ファイル /tmp/foobar.macは以下の通りです:

 
foo(y) := block ([u:y^2],
  u: u+3,
  u: u^2,
  u);

bar(x,y) := (
  x: x+2,
  y: y+2,
  x: foo(y),
  x+y);

EMACSを通してのデバッガーの使用

もしユーザーがシェルウィンドウ (dblシェル)で GNU emacsの下でコードを走らせているか、 グラフィカルならインターフェイスバージョン Xmaximaを走らせているなら、 もしブレイクポイントで停止させたら、 ウィンドウの他の半面に表示されるソースファイルの中に、 赤でハイライトされたか、右行を示す小さな矢印で現在位置を見るでしょう。 M-n (Alt-n)をタイプすることで、一度に一行進めることができます。

Emacsの下では、 dblシェルの中で走らせなければいけません。 dblシェルは elispディレクトリの中に dbl.elファイルを要求します。 elispファイルをインストールしたか、 Maxima elispディレクトリをパスに足したかを確認してください: 例えば、以下を `.emacs'ファイルか `site-init.el'に足してください。

 
(setq load-path (cons "/usr/share/maxima/5.9.1/emacs" load-path))
(autoload 'dbl "dbl")

すると emacsの中で、

 
M-x dbl

は、例えば Maxima, gcl, gbbなどのプログラムを走らせることができるシェルウィンドウを開始するでしょう。 このシェルウィンドウはソースレベルデバッグや 他のウィンドウのソースコードの表示についても知っています。

ユーザーは C-x spaceをタイプすることで ファイルのある行にブレイクポイントを設定できます。 これは、カーソルがどの関数の中かがわかり、 カーソルが示すその関数のどの行かわかります。 もしカーソルが例えば fooの行2上なら、 fooを二番目の行でブレイクするために、 他のウィンドウの中でコマンド ":br foo 2"を挿入します。 これをイネーブルにするには、ユーザーはファイル foobar.macが訪れるウィンドウの中で maxima-mode.elを機能させなければいけません。 Alt-Control-xをタイプすることで関数を Maximaに評価ような、そのファイルウィンドウで利用可能な追加のコマンドがあります。

Categories:  Debugging


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.2 Keyword Commands

キーワードコマンドは Maxima式として解釈 (interpret)されない特殊キーワードです。 キーワードコマンドはブレイクプロンプトではできませんが、 Maximaプロンプトやデバッガープロンプトで入力できます。 キーワードコマンドはコロン ':'で始まります。 例えば Lisp形を評価するには :lispの後に評価される形式をタイプします。

 
(%i1) :lisp (+ 2 3)
5

取られる引数の数は特定のコマンドに依存します。 コマンド全体をタイプする必要はありません、ただブレイクキーワードの中で唯一であれば十分です。 例えば :br:breakのために十分です。

キーワードコマンドは以下にリストされます。

:break F n

関数 Fの中に関数の頭から行オフセット nで ブレイクポイントを設定します。 もし Fが文字列として与えられたら、 ファイルと仮定され nはファイルの頭からのオフセットです。 オフセットはオプションです。 もし与えられないなら、ゼロと仮定されます。 (関数かファイルの最初の行。)

:bt

スタックフレームのバックトレイスを印字します。

:continue

計算を継続します。

:delete

指定されたブレイクポイントを、もし指定されないならすべてのブレイクポイントを削除します。

:disable

指定されたブレイクポイントを、もし指定されないならすべてのブレイクポイントをディセーブルにします。

:enable

指定されたブレイクポイントを、もし指定されないならすべてのブレイクポイントをイネーブルにします。

:frame n

スタックフレーム nを、もし指定されないなら現在のフレームを印字します。

:help

デバッガーコマンドに関するヘルプを印字します。 もし指定されないならコマンドすべてのヘルプを印字します。

:info

項目についての情報を印字します。

:lisp some-form

some-formを Lisp形式として評価します。

:lisp-quiet some-form

Lisp形式 some-formを出力せずに評価します。

:next

:nextは関数コールをステップオーバーする点を除いて、 :stepのようなものです。

:quit

計算を完了せずに現在のデバッガーレベルから抜けます。

:resume

計算を継続します。

:step

次のソースー行に至るまで計算を継続します。

:top

計算を完了せずに(任意のデバッガーレベルから) Maximaプロンプトに戻ります。

Categories:  Debugging


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.3 Functions and Variables for Debugging

オプション変数: debugmode

デフォルト値: false

もし debugmodetrueなら、 Maximaのエラーが起こった時 Maximaはデバッガーを開始します。 ユーザーはコールバックを検査したり、ブレイクポイントを設定したり、 Maximaコードをステップ実行したりなどコマンドを入力することができます。 デバッガーコマンドのリストに関しては debuggingを参照してください。

debugmodeをイネーブルにしても Lispのエラーは捕らえられません。

Categories:  Debugging · Global flags

オプション変数: refcheck

デフォルト値: false

refchecktrueの時、 Maximaは計算の中で、バイドされた変数が最初に使われる度にメッセージを印字します。

オプション変数: setcheck

デフォルト値: false

もし setcheckが(添字付きでもよい)変数のリストに設定されているなら、 Maximaは変数またはそれらの添字付き出現が通常の割り当て演算子 :::割り当て演算子や関数引数バインドでバインドされた時 (しかし関数割り当て :=やマクロ割り当て ::=演算子でバインドされた時以外)はいつでもメッセージを印字します。 メッセージは変数名とバインドされた値から構成されます。

setcheckは、 alltrueに設定することができ、それによってすべての変数を含みます。

setcheckの新しい要素のそれぞれは、 チェックする変数の新しいリストを確立し、以前 setcheckに割り当てられたいかなる変数も忘れます。

もし自身以外の何かに評価されるなら、 setcheckに割り当てられた名前はクォートしなければいけません。 例えばもし x, y, zが既にバインドされているなら、 チェックする変数のリストに置くには、

 
setcheck: ['x, 'y, 'z]$

をタイプしてください。

setcheckリスト上の変数が、例えば X: 'Xのようにそれ自身に割り当てられた時はなにも印字されません。

Categories:  Console interaction · Global flags

オプション変数: setcheckbreak

デフォルト値: false

setcheckbreaktrueの時、 setcheckリスト上の変数が新しい値を割り当てられた時はいつでも Maximaはブレイクプロンプトを出します。 ブレイクは割り当てが実行される前に起こります。 この時点で setvalが変数が割り当てられようとしている値を保持します。 なので setvalに割り当てることで違う値を割り当てることができます。

setchecksetvalも参照してください。

Categories:  Console interaction · Global flags

システム変数: setval

setcheckbreakが起こった時、変数が設定されようとしている値を保持します。 なので setvalに割り当てることで、違う値を割り当てることができます。

setchecksetcheckbreakも参照してください。

関数: timer (f_1, …, f_n)  
    timer (all)  
    timer ()

timerは、タイミング統計が収集される関数のリストに与えられた関数 f_1, …, f_nそれぞれを入れます。 timer(f)$ timer(g)$はリストに fを入れ、その後 gを入れます; リストはあるコールから次へ累積されます。

timer(all)は、計測される関数のリストに (グローバル変数 functionsで指名されたように) ユーザー定義関数すべてを入れます。

引数なしでは timerは計測される関数のリストを返します。

Maximaは、計測される関数のリストに関して、 関数それぞれを実行するのに費やされる時間を記録します。 timer_infoはタイミング統計を返します。 関数コール毎に経過した平均時間、コール回数、総経過時間を含みます。 untimerは計測される関数のリストから関数を削除します。

timerは引数をクォートします。 f(x) := x^2$ g:f$ timer(g)$fをタイマーリストに入れません。

もし trace(f)が有効なら timer(f)は有効ではないです; tracetimerが同時に有効にはできません。

timer_devalueも参照してください。

Categories:  Debugging

関数: untimer (f_1, …, f_n)  
    untimer ()

untimerはタイマーリストから与えられた関数 f_1, …, f_nそれぞれを削除します。

引数なしの時、untimerは、現在タイマーリスト上にある関数すべてを削除します。

untimer (f)を実行した後、 timer_info() (引数なし)は 現在タイマーリスト上にない関数についての情報を返さないけれども、 timer_info (f)は以前に集計されたタイミング統計を返します。 timer (f)はタイミング統計すべてをゼロに再設定し、 fをタイマーリストに再び入れます。

Categories:  Debugging

オプション変数: timer_devalue

デフォルト値: false

timer_devaluetrueの時、 Maximaは計られる関数から他の計測される関数で費やされた時間を引きます。 そうでないなら、関数それぞれについて報告された時間は 他の関数で計測される時間を含みます。 計測されない関数で費やされた時間は総時間から引かれないことに注意してください。

timertimer_infoも参照してください。

Categories:  Debugging · Global flags

関数: timer_info (f_1, ..., f_n)  
    timer_info ()

関数 f_1, ..., f_nが与えられると、 timer_infoは関数それぞれのタイミング情報を含む行列を返します。 引数なしでは、 timer_infoは現在タイマーリスト上の関数すべてについてのタイミング情報を返します。 timer_infoが返す行列は、関数名、関数コール毎の時間、関数コールの回数、総時間、 gctimeを含みます。 gctimeは元の Macymaの「ガーベッジコレクション時間」を意味しましたが、今はいつもゼロです。

timer_infoが戻り値を構成するデータは、 get関数でも得ることができます:

 
get(f, 'calls);  get(f, 'runtime);  get(f, 'gctime);

timerも参照してください。

Categories:  Debugging

関数: trace (f_1, …, f_n)  
    trace (all)  
    trace ()

関数 f_1, …, f_nが与えられると、 traceは、 それらの関数がコールされたときはいつでも デバッグ情報を印字するよう Maximaに指示します。 trace(f)$ trace(g)$は、トレースする関数のリストに fを入れ、それからgを入れます; リストは1回のコールから次へ累積します。

trace(all)は(グローバル変数 functionsで指名されたように) ユーザー定義関数すべてをトレースする関数のリストに入れます。

引数なしでは、 traceは現在トレースする関数すべてのリストを返します。

untrace関数はトレースをディセーブルします。 trace_optionsも参照してください。

traceは引数をクォートします。 例えば f(x) := x^2$ g:f$ trace(g)$fをトレースリストに入れません。

関数が再定義された時、タイマーリストから削除されます。 例えば timer(f)$ f(x) := x^2$の後、 関数 fはもはやタイマーリストにありません。

もし timer (f)が有効なら、 trace (f)は有効ではありません; tracetimerは同じ関数で同時には有効にできません。

Categories:  Debugging

関数: trace_options (f, option_1, …, option_n)  
    trace_options (f)

関数 fについてトレースオプションを設定します。 いかなる以前のオプションも破棄されます。 trace_options (f, ...)は、 もし (trace_optionsの前でも後でも). trace (f)もコールされないなら、有効になりません。

trace_options (f)はオプションすべてをデフォルト値に再設定します。

オプションキーワードは以下の通りです:

トレースオプションは、2つの形式で指定されます。 オプションキーワード単体の存在は、 オプションを無条件に実行します。 (foo: trueか似た形式を指定することでは、 オプション fooは実行されないことに注意してください; キーワードはクォートする必要はないことにも注意してください。) オプションキーワードを述語論理関数で指定することは、 オプションを述語論理上の条件付きにします。

述語論理関数の引数リストは、いつも [level, direction, function, item]です。 ここで levelは関数の再帰レベルで、 directionenterexitを取り、 functionは関数名であり、 itemは(入るときの)引数リストか(出るときの)戻り値です。

以下は無条件トレースオプションの例です:

 
(%i1) ff(n) := if equal(n, 0) then 1 else n * ff(n - 1)$

(%i2) trace (ff)$

(%i3) trace_options (ff, lisp_print, break)$

(%i4) ff(3);

以下は述語論理上の条件の breakオプションを持つ同じ関数です:

 
(%i5) trace_options (ff, break(pp))$

(%i6) pp (level, direction, function, item) := block (print (item),
    return (function = 'ff and level = 3 and direction = exit))$

(%i7) ff(6);

Categories:  Debugging

関数: untrace  
    untrace (f_1, …, f_n)  
    untrace ()

untraceは、与えられた関数 f_1, …, f_nについて trace関数でイネーブルされたトレースをディセーブルします。 引数なしでは untraceは関数すべてのトレースをディセーブルします。

untraceはトレースをディセーブルした関数のリストを返します。

Categories:  Debugging


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by 市川雄二 on June, 21 2016 using texi2html 1.76.