呼び出しベースの pretty-print を使用すると、アプリケーションで関数呼び出しによって、式の値を独自に表示できます。print コマンド、rprint コマンド、display コマンド、または watch コマンドに –p オプションを指定すると、dbx は const chars *db_pretty_print (const T *, int flags, const char *fmt) 形式の関数を検索して呼び出し、print または display の戻り値を置換します。
この関数の flags 引数で渡される値は、次のいずれかのビット単位の論理和です。
|
db_pretty_print() 関数は、静的メンバー関数かスタンドアロン関数に指定できます。
pretty-print するときは、次の情報も考慮してください。
dbx version 7.6 以前の pretty-print は、prettyprint の ksh 実装に基づいていました。この ksh 関数 (およびその定義済みのエイリアス pp) はまだ存在しますが、そのセマンティクスの大半は dbx 内に再実装され、次のような結果になりました。
IDE の場合、ウォッチ、局所変数、およびバルーン評価で pretty-print を使用できます。
print、display、および watch コマンドの –p オプションでネイティブルートを使用。
特に、ウォッチポイントおよび局所変数に pretty-print を頻繁に呼び出すことができるようになったため、スケーラビリティが向上。
式からアドレスを取得できる機会が増加。
エラー回復の向上。
入れ子の値は整形出力されません。dbx には入れ子のフィールドのアドレスを計算するインフラストラクチャーがありません。
dbxenv 変数 output_pretty_print_fallback はデフォルトで on に設定され、pretty-print が失敗した場合、dbx は標準フォーマットに戻ることを意味します。この環境変数が off に設定されている場合、pretty-print が失敗すると dbx はエラーメッセージを発行します。
pretty-print 関数を使用する場合、次のことを考慮する必要があります。
一定/揮発性の非限定型の場合、通常は db_pretty_print(int *, ...() および db_pretty_print(const int *, ...)() などの関数は別個のものとみなされます。dbx の多重定義解決機能では、識別は行いますが、強制はしません。
識別 - 定義した変数が int と const int の両方で宣言されている場合、それぞれが適切な関数にルーティングされます。
非強制 - int または const int 変数が 1 つだけ定義されている場合、それらは両方の関数に一致します。この動作は pretty-print に固有ではなく、すべての呼び出しに適用します。
db_pretty_print() 関数は –g オプションを使用してコンパイルする必要があります。dbx がパラメータシグニチャーにアクセスする必要があるためです。
db_pretty_print() 関数では NULL を返すことができます。
db_pretty_print() 関数に渡されるメインポインタは NULL 以外であることが保証されていますが、そうでない場合は、完全に初期化されていないオブジェクトを指したままになる可能性があります。
db_pretty_print() 関数は、先頭のパラメータの型に基づいて、明確にする必要があります。C では、関数をファイルスタティックとして記述することで、関数を多重定義できます。
次のいずれかの理由により、pretty-print が失敗する可能性があります。これらは検出および回復が可能です。
pretty-print 関数が見つからない。
整形出力する式のアドレスを取得できない。
関数呼び出しが直ちに戻らない。これは、不正なオブジェクトが検出されたときに、pretty-print 関数が堅牢でない場合に発生するセグメント例外を示している可能性があります。ユーザーブレークポイントを示している可能性もあります。
pretty-print 関数が NULL を返した。
pretty-print 関数が、dbx が間接参照できないポインタを返した。
コアファイルがデバッグ中である。
関数呼び出しが直ちに戻らない場合を除くすべての状況で、これらの障害はサイレントで、dbx は標準フォーマットに戻ります。ただし、output_pretty_print_fallback dbxenv 変数が off に設定されている場合、pretty-print が失敗すると、dbx はエラーメッセージを発行します。
dbxenv 変数 output_pretty_print を on に設定しないで、print –p コマンドを使用した場合、dbx は壊れている関数で停止するため、失敗の原因を診断できます。次に、pop –c コマンドを使用すると、呼び出しをクリーンアップすることができます。