Oracle® Developer Studio 12.5: dbx コマンドによるデバッグ

印刷ビューの終了

更新: 2016 年 6 月
 
 

pretty-print の使用

pretty-print を使用すると、プログラムで関数呼び出しによって式の値を独自に表示できます。dbx では、呼び出しベースの pretty-print とフィルタベースの pretty-print の 2 つの pretty-print メカニズムがサポートされます。古い呼び出しベースのメカニズムは、デバッグ対象内で定義されている、特定のパターンに準拠した関数を呼び出すことによって機能します。現在のバージョンの dbx では Python ベースのフィルタがサポートされるようになり、ユーザーは、値をある形式から別の形式に変換するフィルタを作成できます。

dbxdbxenv 変数 output_pretty_print_mode で使用するメカニズムを決定します。call に設定されている場合、呼び出しベースのプリティプリンタだけが検索されます。filter に設定した場合、Python ベースのプリティプリンタが検索されます。filter_unless_call に設定されている場合、呼び出しベースのプリティプリンタがフィルタより優先されます。

print コマンド、rprint コマンド、display コマンド、または watch コマンドに –p オプションを指定した場合、タイプに関係なく、プリティプリンタが呼び出されます。プリティプリンタの呼び出しの詳細については、pretty-print の呼び出しを参照してください。

dbxenv 変数 output_pretty_printon に設定されている場合、print コマンド、rprint コマンド、または display コマンドにデフォルトとして –p が渡されます。この動作をオーバーライドするには、+p を使用します。さらに、output_pretty_print は、IDE 局所変数、バルーン評価、およびウォッチの pretty-print を制御します。

pretty-print の呼び出し

pretty-print 関数は次のような場合に起動されます。

  • print –p または dbxenv 変数 output_pretty_printon に設定されている場合。

  • display –p または dbxenv 変数 output_pretty_printon に設定されている場合。

  • watch –p または dbxenv 変数 output_pretty_printon に設定されている場合。

  • dbxenv 変数 output_pretty_printon に設定されている場合のバルーン評価。

  • dbxenv 変数 output_pretty_printon に設定されている場合の局所変数。

pretty-print 関数は次の場合に呼び出されません。

  • $[]$[] はスクリプトで使用することを目的としているため、スクリプトは予測可能であるべきです。

  • dump コマンド。dump は、where コマンドと同じ簡略化フォーマットを使用します。これは後のリリースで pretty-print を使用するように変換される可能性があります。この制限は IDE の局所変数ウィンドウには適用されません。

呼び出しベースの pretty-print

呼び出しベースの pretty-print を使用すると、アプリケーションで関数呼び出しによって、式の値を独自に表示できます。print コマンド、rprint コマンド、display コマンド、または watch コマンドに –p オプションを指定すると、dbxconst chars *db_pretty_print (const T *, int flags, const char *fmt) 形式の関数を検索して呼び出し、print または display の戻り値を置換します。

この関数の flags 引数で渡される値は、次のいずれかのビット単位の論理和です。

FVERBOSE
0x1
現在実装されておらず、常に設定される
FDYNAMIC
0x2
-d
FRECURSE
0x4
-r
FFORMAT
0x8
-f (設定されている場合、fmt はフォーマット部分)
FLITERAL
0x10
-l

db_pretty_print() 関数は、静的メンバー関数かスタンドアロン関数に指定できます。

    pretty-print するときは、次の情報も考慮してください。

  • 可能性のある障害

  • pretty-print 関数に関する考慮事項

  • dbx version 8.0 以前の pretty-print は、prettyprintksh 実装に基づいていました。この ksh 関数 (およびその定義済みのエイリアス pp) はまだ存在しますが、そのセマンティクスの大半は dbx 内に再実装され、次のような結果になりました。

    • IDE の場合、ウォッチ、局所変数、およびバルーン評価で pretty-print を使用できます。

    • printdisplay、および watch コマンドの –p オプションでネイティブルートを使用。

    • 特に、ウォッチポイントおよび局所変数に pretty-print を頻繁に呼び出すことができるようになったため、スケーラビリティが向上。

    • 式からアドレスを取得できる機会が増加。

    • エラー回復の向上。

  • 入れ子の値は整形出力されません。dbx には入れ子のフィールドのアドレスを計算するインフラストラクチャーがありません。

  • dbxenv 変数 output_pretty_print_fallback は、デフォルトで on に設定され、pretty-print が失敗した場合、dbx は標準フォーマットを使用することを意味します。mean環境変数が off に設定されているときに pretty-print が失敗した場合でも、dbx はエラーメッセージを発行します。

pretty-print 関数に関する考慮事項

pretty-print 関数を使用する場合、次のことを考慮する必要があります。

  • 一定/揮発性の非限定型の場合、通常は db_pretty_print(int *, ...()) および db_pretty_print(const int *, ...)() などの関数は別個のものとみなされます。dbx の多重定義解決機能では、識別は行いますが、強制はしません。

    • 識別 - 定義した変数が intconst 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_printon に設定しないで、print –p コマンドを使用した場合、dbx は壊れている関数で停止するため、失敗の原因を診断できます。次に、pop –c コマンドを使用すると、呼び出しをクリーンアップすることができます。

Python pretty-print フィルタ (Oracle Solaris)

pretty-print フィルタ機能を使用すると、値をある形式から別の形式に変換できる Python でフィルタを作成できます。Python ベースのプリティプリンタは Oracle Solaris でのみ使用できます。


注 -  Python pretty-print フィルタは C および C++ コードでのみ使用でき、Fortran では使用できません。

フィルタは、C++ 標準テンプレートライブラリの 4 つの実装の選択したクラスに組み込まれています。次の表に、ライブラリ名とそのライブラリのコンパイラオプションを示します。

ライブラリのコンパイラオプション
ライブラリ名
–library=Cstd (デフォルト)
libCstd.so.1
–library=stlport4
libstlport.so.1
–library=stdcxx4
libstdcxx4.so.4.**
–library=stdcpp (–std=c++11 オプションを使用した場合のデフォルト)
libstdc++.so.6.*

次の表では、C++ 標準テンプレートライブラリで pretty-print フィルタを使用できるクラスと、インデックスおよび断面を出力できるかどうかを指定します。

クラス
インデックスと断面が使用可能かどうか
C++ の互換性
string
いいえ
はい
pair
いいえ
はい
vector
はい
はい
list
はい
はい
set
はい
はい
bitset
はい
はい
map
はい
はい
stack
はい
はい
priority queue
はい
はい
queue
はい
はい
multimap
はい
はい
tuple
いいえ
C++11 のみ
unique_ptr
いいえ
C++11 のみ
forward_list
はい
C++11 のみ
unordered_map
はい
C++11 のみ
unordered_multimap
はい
C++11 のみ
unordered_set
はい
C++11 のみ
unordered_multiset
はい
C++11 のみ
array
はい
C++11 のみ
initializer_list
はい
C++11 のみ
使用例 1  フィルタ付きの pretty-print

次の出力は、dbxprint コマンドを使用したリストの出力の例です。

(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

Oracle Solaris での Python の使用

Python pretty-print フィルタと python コマンドは Oracle Solaris でのみ使用できます。組み込みの Python インタプリタを起動するには、python と入力します。Python コードを評価するには、python python-code と入力します。初期の Python プラグイン API を使用できます。ただし、その主な目的は、コールバックとして呼び出されるプリティプリンタフィルタを作成することです。したがって、python コマンドは主にテストと診断の目的に使用されます。

Python pretty-print API のドキュメント

Python pretty-print API のドキュメントを生成するには、python-docs コマンドを使用します。このコマンドは Oracle Solaris でのみ使用できます。