pretty-print を使用すると、プログラムで関数呼び出しによって式の値を独自に表示できます。dbx では、呼び出しベースの pretty-print とフィルタベースの pretty-print の 2 つの pretty-print メカニズムがサポートされます。古い呼び出しベースのメカニズムは、デバッグ対象内で定義されている、特定のパターンに準拠した関数を呼び出すことによって機能します。現在のバージョンの dbx では Python ベースのフィルタがサポートされるようになり、ユーザーは、値をある形式から別の形式に変換するフィルタを作成できます。
dbx は dbxenv 変数 output_pretty_print_mode で使用するメカニズムを決定します。call に設定されている場合、呼び出しベースのプリティプリンタだけが検索されます。filter に設定した場合、Python ベースのプリティプリンタが検索されます。filter_unless_call に設定されている場合、呼び出しベースのプリティプリンタがフィルタより優先されます。
print コマンド、rprint コマンド、display コマンド、または watch コマンドに –p オプションを指定した場合、タイプに関係なく、プリティプリンタが呼び出されます。プリティプリンタの呼び出しの詳細については、pretty-print の呼び出しを参照してください。
dbxenv 変数 output_pretty_print が on に設定されている場合、print コマンド、rprint コマンド、または display コマンドにデフォルトとして –p が渡されます。この動作をオーバーライドするには、+p を使用します。さらに、output_pretty_print は、IDE 局所変数、バルーン評価、およびウォッチの pretty-print を制御します。
pretty-print 関数は次のような場合に起動されます。
print –p または dbxenv 変数 output_pretty_print が on に設定されている場合。
display –p または dbxenv 変数 output_pretty_print が on に設定されている場合。
watch –p または dbxenv 変数 output_pretty_print が on に設定されている場合。
dbxenv 変数 output_pretty_print が on に設定されている場合のバルーン評価。
dbxenv 変数 output_pretty_print が on に設定されている場合の局所変数。
pretty-print 関数は次の場合に呼び出されません。
$[]。$[] はスクリプトで使用することを目的としているため、スクリプトは予測可能であるべきです。
dump コマンド。dump は、where コマンドと同じ簡略化フォーマットを使用します。これは後のリリースで pretty-print を使用するように変換される可能性があります。この制限は IDE の局所変数ウィンドウには適用されません。
呼び出しベースの 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 8.0 以前の 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 は標準フォーマットを使用することを意味します。mean環境変数が 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 コマンドを使用すると、呼び出しをクリーンアップすることができます。
pretty-print フィルタ機能を使用すると、値をある形式から別の形式に変換できる Python でフィルタを作成できます。Python ベースのプリティプリンタは Oracle Solaris でのみ使用できます。
フィルタは、C++ 標準テンプレートライブラリの 4 つの実装の選択したクラスに組み込まれています。次の表に、ライブラリ名とそのライブラリのコンパイラオプションを示します。
|
次の表では、C++ 標準テンプレートライブラリで pretty-print フィルタを使用できるクラスと、インデックスおよび断面を出力できるかどうかを指定します。
|
次の出力は、dbx の print コマンドを使用したリストの出力の例です。
(dbx) dbxenv output_pretty_print off (dbx) print list10 list10 = { __buffer-size = 32U __buffer-list = { __data_ = 0x654a8 } __free-list = (nil) __next-avail = 0x67334 __last = 0x67448 __node = 0x48830 __length = 10U }
次は、dbx で出力された同じリストですが、pretty-print フィルタを使用しています。
(dbx) print -p list10 list10 = (200, 201, 202, 203, 204, 205, 206, 207, 208, 209) (dbx) print -p list10[5] list10[5] = 205 (dbx) print -p list10[1..100:2] list10[1..100:2] = [1] = 202 [3] = 204 [5] = 206 [7] = 208
Python pretty-print フィルタと python コマンドは Oracle Solaris でのみ使用できます。組み込みの Python インタプリタを起動するには、python と入力します。Python コードを評価するには、python python-code と入力します。初期の Python プラグイン API を使用できます。ただし、その主な目的は、コールバックとして呼び出されるプリティプリンタフィルタを作成することです。したがって、python コマンドは主にテストと診断の目的に使用されます。
Python pretty-print API のドキュメントを生成するには、python-docs コマンドを使用します。このコマンドは Oracle Solaris でのみ使用できます。