2 * Source Level Debugging::
4 * Functions and Variables for Debugging::
7 @c -----------------------------------------------------------------------------
8 @node Source Level Debugging, Keyword Commands, , Debugging
9 @section Source Level Debugging
10 @c -----------------------------------------------------------------------------
12 Maximaは、組み込みのソースレベルデバッガを持っています。
13 ユーザーは、関数にブレイクポイントを設定でき、
15 そのレベルでバインドされた変数と一緒にコールスタックを検査することができます。
17 コマンド@code{:help}または@code{:h}は、
20 もし略字がただ1つなら、コマンドは略せます。
21 もしただ1つでないなら、選択肢がリストされます。)
23 変数と式を検査し、定義し、操作するために、ユーザーは任意の通常のMaxima関数も使うことができます。
30 @code{:n} (``next'')コマンドを使って1度に1行進むことができます。
31 @code{:bt} (``backtrace'')コマンドは、スタックフレームのリストを示します。
32 @code{:r} (``resume'')コマンドは、デバッガーから抜けて、実行を続けます。
36 (%i1) load ("/tmp/foobar.mac");
41 Turning on debugging debugmode(true)
42 Bkpt 0 for foo (in /tmp/foobar.mac line 1)
48 (dbm:1) :bt <-- :bt typed here gives a backtrace
49 #0: foo(y=5)(foobar.mac line 1)
50 #1: bar(x=2,y=3)(foobar.mac line 9)
52 (dbm:1) :n <-- Here type :n to advance line
56 (dbm:1) :n <-- Here type :n to advance line
60 (dbm:1) u; <-- Investigate value of u
63 (dbm:1) u: 33; <-- Change u to be 33
66 (dbm:1) :r <-- Type :r to resume the computation
71 ファイル@code{/tmp/foobar.mac}は以下の通りです:
74 foo(y) := block ([u:y^2],
88 もしユーザーがシェルウィンドウ(dblシェル)で、GNU emacsの下でコードを走らせているか、
89 グラフィカルならインターフェイスバージョンXmaximaを走らせているなら、
91 ウィンドウの他の半面に表示されるソースファイルの中に、
92 赤でハイライトされたか、右行を示す小さな矢印で
94 M-n (Alt-n)をタイプすることで、一度に一行進めることができます。
97 @code{dbl}シェルの中で走らせなければいけません。
98 @code{dbl}シェルは、elispディレクトリの中に
99 @code{dbl.el}ファイルを要求します。
100 elispファイルをインストールしたか、Maxima elispディレクトリをパスに足したかを確認してください:
102 @file{.emacs}ファイルか@file{site-init.el}に足してください。
105 (setq load-path (cons "/usr/share/maxima/5.9.1/emacs" load-path))
106 (autoload 'dbl "dbl")
115 は、例えば、Maxima, gcl, gbbなどのプログラムを走らせることができるシェルウィンドウを開始するでしょう。
116 このシェルウィンドウはソースレベルデバッグや
117 他のウィンドウのソースコードの表示についても知っています。
120 @code{C-x space}をタイプすることで
123 これは、カーソルがどの関数の中かがわかり、
124 カーソルが示すその関数のどの行かわかります。
125 もしカーソルが、例えば、@code{foo}の行2なら、
126 @code{foo}を二番目の行でブレイクするために、
127 他のウィンドウの中で、コマンド``@code{:br foo 2}''を挿入します。
130 ファイル@code{foobar.mac}が訪れるウィンドウの中で
131 maxima-mode.elを機能させなければいけません。
132 @code{Alt-Control-x}をタイプすることで
134 そのファイルウィンドウで利用可能な追加のコマンドがあります。
140 @c -----------------------------------------------------------------------------
141 @node Keyword Commands, Functions and Variables for Debugging, Source Level Debugging, Debugging
142 @section Keyword Commands
143 @c -----------------------------------------------------------------------------
145 キーワードコマンドは、Maxima式として解釈(interpret)されない特殊キーワードです。
146 キーワードコマンドは、ブレイクプロンプトではできませんが、Maximaプロンプトやデバッガープロンプトで入力できます。
147 キーワードコマンドはコロン'@code{:}'で始まります。
150 @code{:lisp}の後に評価される形式をタイプします。
157 取られる引数の数は、特定のコマンドに依存します。
158 コマンド全体をタイプする必要はありません、ただブレイクキーワードの中で唯一であれば十分です。
159 例えば、@code{:br}は @code{:break}のために十分です。
161 キーワードコマンドは以下にリストされます。
165 関数@code{F}の中に関数の頭から行オフセット@code{n}で
167 もし@code{F}が文字列として与えられたら、
168 ファイルと仮定され、@code{n}はファイルの頭からのオフセットです。
170 もし与えられないなら、ゼロと仮定されます。
173 スタックフレームのバックトレイスを印字します。
176 @c CAN'T SEEM TO GET :delete TO WORK !!!
178 指定されたブレイクポイントを、もし指定されないならすべてのブレイクポイントを削除します。
179 @c CAN'T SEEM TO GET :disable TO WORK !!!
181 指定されたブレイクポイントを、もし指定されないならすべてのブレイクポイントをディセーブルにします。
182 @c CAN'T SEEM TO GET :enable TO WORK !!!
184 指定されたブレイクポイントを、もし指定されないならすべてのブレイクポイントをイネーブルにします。
186 スタックフレーム@code{n}を、もし指定されないなら現在のフレームを印字します。
187 @c CAN'T SEEM TO GET :help TO WORK !!!
189 デバッガーコマンドに関するヘルプを印字します。
190 もし指定されないなら、コマンドすべてのヘルプを印字します。
191 @c CAN'T SEEM TO GET :info TO WORK !!!
194 @item :lisp some-form
195 @code{some-form}をLisp形式として評価します。
196 @item :lisp-quiet some-form
197 Lisp形式@code{some-form}を出力せずに評価します。
199 @code{:next}は関数コールをステップオーバーする点を除いて、
200 @code{:step}のようなものです。
209 計算を完了せずに(任意のデバッガーレベルから)Maximaプロンプトに戻ります。
216 @c -----------------------------------------------------------------------------
217 @node Functions and Variables for Debugging, , Keyword Commands, Debugging
218 @section Functions and Variables for Debugging
219 @c -----------------------------------------------------------------------------
221 @c -----------------------------------------------------------------------------
223 @defvr {オプション変数} debugmode
226 もし@code{debugmode}が @code{true}なら、
227 Maximaのエラーが起こった時Maximaはデバッガーを開始します。
228 ユーザーはコールバックを検査したり、ブレイクポイントを設定したり、Maximaコードをステップ実行したりなど
230 デバッガーコマンドのリストに関しては、 @code{debugging}を参照してください。
232 @code{debugmode}をイネーブルにしても、Lispのエラーは捕らえられません。
233 @c DO WE WANT TO SAY MORE ABOUT DEBUGGING LISP ERRORS ???
234 @c I'M NOT CONVINCED WE WANT TO OPEN THAT CAN OF WORMS !!!
238 @category{Global flags}
242 @c -----------------------------------------------------------------------------
244 @defvr {オプション変数} refcheck
247 @code{refcheck}が@code{true}の時、
249 計算の中で、バイドされた変数が最初に使われる度にメッセージを印字します。
252 @category{Evaluation}
253 @category{Console interaction}
254 @category{Global flags}
258 @c -----------------------------------------------------------------------------
260 @defvr {オプション変数} setcheck
263 もし@code{setcheck}が(添字付きでもよい)変数のリストに設定されているなら、
265 変数またはそれらの添字付き出現が通常の割り当て演算子@code{:}、@code{::}割り当て演算子、
267 (しかし関数割り当て@code{:=}やマクロ割り当て@code{::=}演算子でバインドされた時以外)
270 メッセージは変数名とバインドされた値から構成されます。
273 @code{all}または@code{true}に設定することができ、
276 @code{setcheck}の新しい要素のそれぞれは、
278 以前@code{setcheck}に割り当てられたいかなる変数も忘れられます。
281 @code{setcheck}に割り当てられた名前はクォートしなければいけません。
282 例えば、もし@code{x}, @code{y}, @code{z}が既にバインドされているなら、
286 setcheck: ['x, 'y, 'z]$
291 @code{setcheck}リスト上の変数が、例えば、@code{X: 'X}のように、
292 それ自身に割り当てられた時は、なにも印字されません。
295 @category{Console interaction}
296 @category{Global flags}
300 @c -----------------------------------------------------------------------------
301 @anchor{setcheckbreak}
302 @defvr {オプション変数} setcheckbreak
305 @code{setcheckbreak}が@code{true}の時、
306 @code{setcheck}リスト上の変数が新しい値を割り当てられた時はいつでも
307 Maximaはブレイクプロンプトを出します。
308 ブレイクは、割り当てが実行される前に起こります。
309 この時点で、@code{setval}が変数が割り当てられようとしている値を保持します。
311 @code{setval}に割り当てることで、違う値を割り当てることができます。
313 @code{setcheck}と@code{setval}も参照してください。
316 @category{Console interaction}
317 @category{Global flags}
321 @c -----------------------------------------------------------------------------
323 @defvr {システム変数} setval
325 @code{setcheckbreak}が起こった時、変数が設定されようとしている値を保持します。
327 @code{setval}に割り当てることで、違う値を割り当てることができます。
329 @code{setcheck}と@code{setcheckbreak}も参照してください。
332 @category{Console interaction}
333 @category{Global variables}
337 @c -----------------------------------------------------------------------------
339 @deffn {関数} timer (@var{f_1}, @dots{}, @var{f_n})
340 @deffnx {関数} timer (all)
341 @deffnx {関数} timer ()
344 タイミング統計が収集される関数のリストに与えられた関数@var{f_1}, @dots{}, @var{f_n}
346 @code{timer(f)$ timer(g)$}は、リストに@code{f}を入れ、その後@code{g}を入れます;
349 @code{timer(all)}は、計測される関数のリストに
350 (グローバル変数@code{functions}で指名されたように)
354 @code{timer}は計測される関数のリストを返します。
356 Maximaは、計測される関数のリストに関して、
357 関数それぞれを実行するのに費やされる時間を記録します。
358 @code{timer_info}は、タイミング統計を返します。
359 関数コール毎に経過した平均時間、コール回数、総経過時間を含みます。
360 @code{untimer}は、計測される関数のリストから関数を削除します。
362 @code{timer}は引数をクォートします。
363 @code{f(x) := x^2$ g:f$ timer(g)$}は、@code{f}をタイマーリストに入れません。
365 もし@code{trace(f)}が有効なら、@code{timer(f)}は有効ではないです;
366 @code{trace}と@code{timer}が同時に有効にはできません。
368 @code{timer_devalue}も参照してください。
375 @c -----------------------------------------------------------------------------
377 @deffn {関数} untimer (@var{f_1}, @dots{}, @var{f_n})
378 @deffnx {関数} untimer ()
380 @code{untimer}はタイマーリストから
381 与えられた関数@var{f_1}, @dots{}, @var{f_n}それぞれを削除します。
384 @code{untimer}は、現在、タイマーリスト上の関数すべてを削除します。
386 @code{untimer (f)}が実行された後、
387 @code{timer_info()} (引数なし)は、
388 現在タイマーリスト上にない関数についての情報を返しませんけれども、
389 @code{timer_info (f)}は、まだ以前に集計されたタイミング統計を返します。
392 @code{f}をタイマーリストに再び入れます。
399 @c -----------------------------------------------------------------------------
400 @anchor{timer_devalue}
401 @defvr {オプション変数} timer_devalue
404 @code{timer_devalue}が@code{true}の時、
406 他の計測される関数で費やされた時間を引きます。
407 そうでなければ、関数それぞれについて報告された時間は、
409 計測されない関数で費やされた時間は、総時間から引かれないことに注意してください。
411 @code{timer}と@code{timer_info}も参照してください。
415 @category{Global flags}
419 @c -----------------------------------------------------------------------------
421 @deffn {関数} timer_info (@var{f_1}, ..., @var{f_n})
422 @deffnx {関数} timer_info ()
424 与えられた関数@var{f_1}, ..., @var{f_n},
430 現在タイマーリスト上の関数すべてについての
432 The matrix returned by
433 @code{timer_info}が返す行列は、関数名、
434 関数コール毎の時間、関数コールの回数、総時間、
437 @code{gctime}は、元のMacymaの「ガーベッジコレクション時間」を意味しましたが、
440 @code{timer_info}が戻り値を構成するデータは、
441 @code{get}関数によっても得られることができます:
444 get(f, 'calls); get(f, 'runtime); get(f, 'gctime);
447 @code{timer}も参照してください。
454 @c -----------------------------------------------------------------------------
456 @deffn {関数} trace (@var{f_1}, @dots{}, @var{f_n})
457 @deffnx {関数} trace (all)
458 @deffnx {関数} trace ()
460 関数 @var{f_1}, @dots{}, @var{f_n}が与えられたとして、
461 @code{trace}は、Maximaに、
464 @code{trace(f)$ trace(g)$}は、トレースする関数のリストに
465 @code{f}を、それから@code{g}を入れます;
468 @code{trace(all)}は、(グローバル変数@code{functions}で指名されたように)
469 ユーザー定義関数すべてをトレースする関数のリストに入れます。
472 @code{trace}は、現在とレースする関数すべてのリストを返します。
474 @code{untrace}関数はトレースをディセーブルします。
475 @code{trace_options}も参照してください。
477 @code{trace}は引数をクォートします。
479 @code{f(x) := x^2$ g:f$ trace(g)$}は、
480 @code{f}をトレースリストに入れません。
485 @code{timer(f)$ f(x) := x^2$}の後、
486 関数@code{f}はもはやタイマーリストにありません。
488 もし@code{timer (f)}が有効なら、
489 @code{trace (f)}は有効ではありません;
490 @code{trace}と@code{timer}は、同じ関数で同時には有効にできません。
497 @c -----------------------------------------------------------------------------
498 @anchor{trace_options}
499 @deffn {関数} trace_options (@var{f}, @var{option_1}, @dots{}, @var{option_n})
500 @deffnx {関数} trace_options (@var{f})
502 関数@var{f}についてトレースオプションを設定します。
504 @code{trace_options (@var{f}, ...)}は、
505 もし(@code{trace_options}の前でも後でも).
506 @code{trace (@var{f})}もコールされないなら、
509 @code{trace_options (@var{f})}は、
510 オプションすべてをデフォルト値に再設定します。
517 関数の入り口と出口でメッセージを印字しません。
520 関数に入る前と関数を抜けた後、ブレイクポイントを置きます。
521 @code{break}を参照してください。
524 引数を表示し、Lispオブジェクトとして値を返します。
527 関数の入れ口と出口で@code{-> true}を印字します
531 エラーを知らせるためのオプションに応じて、
532 関数コールを再試行するか、戻り値を指定します。
535 トレースオプションは、2つの形式で指定されます。
538 (@code{@var{foo}: true}か似た形式を指定することでは、
539 オプション@var{foo}は実行されないことに注意してください;
540 キーワードはクォートする必要はないことにも注意してください。)
541 オプションキーワードを述語論理関数で指定することは、
542 オプションを述語論理上の条件付きにします。
545 @code{[level, direction, function, item]}です。
546 ここで、@code{level}は関数の再帰レベルで、
547 @code{direction}は@code{enter}か@code{exit}、@code{function}は、
549 name of the function, and
550 @code{item}は(入るときの)引数リストか(出るときの)戻り値です。
555 (%i1) ff(n) := if equal(n, 0) then 1 else n * ff(n - 1)$
559 (%i3) trace_options (ff, lisp_print, break)$
564 以下は述語論理上の条件の@code{break}オプションを持つ同じ関数です:
567 (%i5) trace_options (ff, break(pp))$
569 (%i6) pp (level, direction, function, item) := block (print (item),
570 return (function = 'ff and level = 3 and direction = exit))$
580 @c -----------------------------------------------------------------------------
582 @deffn {関数} untrace (@var{f_1}, @dots{}, @var{f_n})
583 @deffnx {関数} untrace ()
586 与えられた関数@var{f_1}, @dots{}, @var{f_n}について、
587 @code{trace}関数でイネーブルされたトレースをディセーブルします。
588 引数なしでは、@code{untrace}は関数すべてのトレースをディセーブルします。
590 @code{untrace}はトレースをディセーブルした関数のリストを返します。