[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ]


17 デバッグのためのエラー・ハンドラの使用

装置制御ライブラリには,PostScriptプログラムをデバッグするのに役立つエラー・ ハンドラが登録されています。エラー・ハンドラは出力の最後のページを印刷するとともに, エラーを特定するための情報も提供します。

17.1 プリント・ジョブへのエラー・ハンドラの組み込み

エラー・ハンドラは通常のプリント・ジョブに自動的に組み込まれるわけではありません( システム管理者がこの省略時の設定を変更した場合を除きます) 。したがって,次の方法でエラー・ハンドラを明示的に起動しなければなりません。

     $ PRINT/SETUP=LPS$ERRORHANDLER filename

エラー・ハンドラはPostScriptメッセージを返します。第18章に説明するように, /PARAMETERS=MESSAGES修飾子を使用すれば,これらのメッセージをファイルまたはプリンタに送信することができます。 次の例を参照してください。

     $ PRINT/QUEUE=PS40$A10/PARAMETERS=MESSAGES=KEEP FILE.PS

PostScriptアプリケーションを開発する場合には,第14章の説明に従って, エラー・ハンドラ・セットアップ・モジュールを含むようにフォームを定義することにより, エラー・ハンドラをより簡単に起動することができます。

17.2 エラー・ハンドラがPostScript環境に与える影響

エラー・ハンドラはユーザ・プログラムで変更された可能性のある定義を使用するのではなく, ディクショナリ systemdict からオペレータを参照します。

場合によっては,エラー・ハンドラがロードされるときに,プログラムが異なる動作を実行する可能性があります。 たとえば,PostScriptサーバ・ ループ・コンテキストの外部で exit オペレータを実行すると, エラー・ハンドラがロードされていない場合には,invalidexit エラーが発生します。しかし,エラー・ハンドラがロードされている場合には, プログラムは正しく終了し,エラーは発生しません。

17.3 エラー・ハンドラの例

例 17-1に示すログ・ ファイルの例は, 次のPostScriptプログラムを対象にしています。

     [/1st-level [/2nd-level [/3rd-level [/4th-level 56 ] ] ] (end)]
     /myproc { [ 8 8 ] 0 0 div setdash } def
     100 200 moveto
     myproc

次のコマンドにはエラー・ハンドラが指定されており,ログ・ファイルが作成されます。

     $ PRINT/PARAMETERS=MESSAGES=KEEP/SETUP=LPS$ERRORHANDLER filename

例 17-1では,プログラムを実行したときにログ・ ファイルに追加されるエラー・ハンドラからの出力を示しています。

例 17-1 エラー・ハンドラによって作成されるログ・ ファイルの例

ERROR: undefinedresult [1]
OFFENDING COMMAND: div [2]

OPERAND STACK:  [3]

0
0
[ 8 8 ]
[/1st-level [/2nd-level [/3rd-level  -array- ] ] (end) ]

EXECUTION STACK: [4]

{ setdash }

GRAPHICS STATE:  [5]
Current Matrix: [ 4.16667 0.0 0.0 -4.16667 0.0 3298.0 ]
Color: 0.0
Current position: x = 100.0, y = 200.0
Line width: 1.0
Line cap: 0
Line join: 0
Flatness: 1.0
Miter limit: 10.0
Dash pattern: [ ] 0.0

ここに示したサンプル・ファイルの先頭に定義されている配列には,最初の要素としてその配列自体を示すポインタが含まれています。 これは2レベルの深さに展開されます。 配列の最も内部のバージョンは単に-array- として表現されます。

17.4 エラー・ハンドラからの出力の解読

エラーが発生した場合には,エラー・ハンドラは showpage コマンドを実行し,出力の最後のページを印刷します(例 17-1 を参照)。また,次の情報も出力します。

  1. エラーの名前

  2. エラーを生じたPostScriptオペレータ

  3. オペランド・スタックの内容

    エラー・ハンドラはスタックに入っている各オブジェクトの値を表示します。 その場合,数値は10進数で表示します。配列のすべての要素, 文字列,およびプロシージャは再帰的に表示されます。他のオブジェクトは別の方法で記述されます。 たとえば,セーブ・オブジェクトの場合は-savelevel- が表示されます。

    最初に表示される項目はスタックの先頭のオブジェクトです。

  4. 実行スタックの内容

    実行スタックには,実行中のプロシージャの一部が示されています。 先頭のオブジェクトは実行されつつあるオペレータとオペランドを含むプロシージャです。2 番目のオブジェクトは呼び出しプロシージャのまだ実行されていない部分です。

  5. グラフィック状態に関する情報:
    現在の変換マトリックス
    カラー(currentgray の値)
    現在の位置
    線幅
    線端の形状
    線の結合部の形状
    平滑さ
    結合部の限度
    破線のパターン

PostScriptコードでエラーを検出した場合には,ファイルを作成したアプリケーションを変更するか, またはアプリケーション・プログラマに問題を通知しなければなりません。

17.5 PostScriptデータの出力形式

PostScriptデータは,通常はPostScriptソース・ファイルに記述されたとおりに表現されますが, エラー・ハンドラがPostScriptデータを特別に表現することもあります。

PostScript言語は,エラー・ハンドラでは認識できない新しいデータ・フォーマットを含むように拡張できます。 認識できないフォーマットのデータは2 つの引用符と認識できないデータ・フォーマットの名前として表現されます。

17.6 エラー発生箇所の判定

PostScriptストリームのどこでエラーが発生したかを正確に判断することは困難であり, 不可能な場合もあります。これは,実行スタックがコンテキストを一意的に識別できない可能性があるからです。 この場合には,診断情報をPostScript ファイルに追加することができます。たとえば,エラーが showpage 定義に関連しているように思われる場合には,次に示すようにPostScript コードを変更します。

     /myshowpage
        {
        (At the top of my showpage\n) print flush
        % some PostScript code
        (Just before real showpage call\n) print flush
        showpage
        } def


[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ]