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

6. マクロや入力をデバッグする方法

m4のマクロを書いていると、 (たいていのプログラミング言語の場合と同様に) 往々にしてそれらは思ったようには動いてくれないものです。 m4にはデバッグを支援するしくみがいくつか存在します。


6.1 マクロの定義を表示する

ある名前(name)が展開されるとどうなるのか調べたいときは、 組み込みマクロdumpdefを使用することができます。

 
dumpdef(...)

このマクロは任意の個数の引数を取ります。 引数を与ずに呼びだすと、既知の名前すべての定義を表示します。 それ以外の場合は与えた引数の定義を表示します。 出力は標準エラー出力に直接行われます。

dumpdefは展開されると消滅します。

 
define(`foo', `Hello world.')
⇒
dumpdef(`foo')
error-->foo:	`Hello world.'
⇒
dumpdef(`define')
error-->define:	<define>
⇒

最後の例は組み込みマクロの定義が表示される様子です。

表示の詳細を調整するための情報についてはSee section デバッグ出力の制御を参照してください。


6.2 マクロの呼び出しをトレースする

組み込みマクロtraceontraceoffを使うと、マクロの呼び出しと 展開をトレース(trace)することができます。

 
traceon(...)
traceoff(...)

traceontraceoffを引数なしで呼ぶと、 すべての定義済みのマクロに対してトレースがそれぞれオンまたはオフとなります。 引数を指定した場合、その名前のマクロに対してだけ作用します。

traceontraceoffは展開されると消滅します。

トレース中のマクロが呼ばれるたびに、 そのマクロの呼び出しに関する情報が引数の収集が終ったあとに表示されます。 マクロの呼び出しが展開後に消滅しないときは展開の結果が表示されます。 出力は標準エラー出力へ直接行われます。

 
define(`foo', `Hello World.')
⇒
define(`echo', `$@')
⇒
traceon(`foo', `echo')
⇒
foo
error-->m4trace: -1- foo -> `Hello World.'
⇒Hello World.
echo(gnus, and gnats)
error-->m4trace: -1- echo(`gnus', `and gnats') -> ``gnus',`and gnats''
⇒gnus,and gnats

ダッシュ(-)の間にある数字は展開の深さを表します。 たいていは最も外側のレベルでの展開を表す1となりますが、 クォートされていないマクロの呼び出しを引数が含む場合には増えていきます。

表示の詳細を調整するための情報についてはSee section デバッグ出力の制御を参照してください。


6.3 デバッグ出力の制御

m4に`-d'オプションを与えることにより、 これまでの節に記載されているマクロを使ったときに表示される情報の詳しさを 制御します。

このオプションに続けて次のうち1つまたは複数のフラグを指定します。

t

今回起動するm4におけるマクロの呼び出しを全てトレースします。

a

マクロの呼び出しに伴う実引数を表示します。 `t'フラグと共に指定したときは全てのマクロの呼び出しが対象となりますが、 それ以外の場合はtraceonマクロによってトレースしているマクロだけが 対象となります。

e

マクロの呼び出しが展開後に消滅しない場合、展開後のテキストを表示します。 `t'フラグと共に指定したときは全てのマクロの呼び出しが対象となりますが、 それ以外の場合はtraceonマクロによってトレースしているマクロだけが 対象となります。

q

実引数やマクロの展開後のテキストを表示するときに現在の引用符でクォートします。

c

ひとつのマクロの呼び出しにつき複数のトレース行を表示します。 マクロが認識された時点で引数を集める前に1行表示し、 引数を集め終った後に2行目を、 マクロの呼び出しが完了したあとに3行目を表示します。

x

トレースの各出力行にマクロの呼び出し毎に異なる`識別番号(id)'を加えます。 これは上記の`c'フラグを使うときに便利です。

f

トレースの各出力行に、現在の入力ファイルの名前を表示します。

l

トレースの各出力行に、現在の入力行番号を表示します。

p

指定した名前のファイルをパスサーチ機構(see section インクルードするファイルのサーチ)を使って 見つけたときは、実際に使われるファイル名を表示します。

i

現在の入力ファイルが替わるたびに、ファイル名と入力行番号を表示します。

V

上記すべてのフラグを表す簡略表記です。

`-d'オプションに何もフラグを指定しない場合、 デフォルトで`aeq'が使われます。 前2つの節にある例は、これらデフォルトのフラグを使うことを想定しています。

組み込みマクロdebugmodeを使うと、実行時にデバッグ出力のフォーマットを 制御できます。

 
debugmode(opt flags)

引数flagsは上に列挙されている文字をいくつか指定します。 特殊なケースとして引数を`+'で始めると、 それらのフラグが現在のデバッグフラグ群に追加されます。 また引数を`-'で始めると現在のデバッグフラグ群から削除されます。 引数をまったく与えない場合、デバッグフラグは(`-d'を与えない場合と同様に) すべてゼロに設定されます。 引数として空文字列を与えるとフラグはデフォルトの値にリセットされます。


6.4 デバッグ出力の保存

デバッグとトレースの出力は、m4に`-o'オプションを与えるか 組み込みマクロdebugfileを使うことで、 ファイルにリダイレクト(redirect)することができます。

 
debugfile(opt filename)

このマクロにより、ここから後に発生するデバッグとトレースの出力は すべてfilenameへ送られます。 filenameが空文字列のときはデバッグとトレースの出力は捨てられます。 debugfileが引数無しで呼ばれたときは、デバッグとトレースの出力は 標準エラー出力へ送られます。


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

This document was generated by Akihiro Sagawa on June, 15 2005 using texi2html 1.70.