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

印刷ビューの終了

更新: 2016 年 6 月
 
 

イベントハンドラの例

このセクションでは、イベントハンドラの設定のいくつかの例を挙げます。

配列メンバーへのストアに対するブレークポイントを設定する

この例は、array[99] にデータ変更ブレークポイントを設定する方法を示しています。

(dbx) stop access w &array[99]
(2) stop access w &array[99], 4
(dbx) run
Running: watch.x2
watchpoint array[99] (0x2ca88[4]) at line 22 in file "watch.c"    
   22    array[i] = i;

単純なトレースを実行する

この例は、単純なトレースを実装する方法を示しています

(dbx) when step { echo at line $lineno; }

関数内にいる間ハンドラを有効にする

次の例に、関数内にいる間ハンドラを有効にする方法を示します。

<dbx> trace step -in foo

このコマンドは次と同等です。

    # create handler in disabled state
    when step -disable { echo Stepped to $line; }
    t=$newhandlerid    # remember handler id
    when in foo {
    # when entered foo enable the trace
    handler -enable "$t"
    # arrange so that upon returning from foo,
    # the trace is disabled.
    when returns { handler -disable "$t"; };
    }

実行された行の数を調べる

この例は、小さなプログラムで実行された行数を確認する方法を示しています。入力:

(dbx) stop step -count infinity     # step and stop when count=inf
(2) stop step -count 0/infinity
(dbx) run
...
(dbx) status
(2) stop step -count 133/infinity

プログラムは停止することなく、プログラムが終了します。実行された行の数は 133 です。このプロセスは非常に低速です。この方法が有効なのは、何度も呼び出される関数にブレークポイントを設定している場合です。

実行された命令の数をソース行で調べる

この例は、コードのある行で実行する命令数をカウントする方法を示しています。

(dbx) ...                        # get to the line in question
(dbx) stop step -instr -count infinity
(dbx) step ...
(dbx) status
(3) stop step -count 48/infinity # 48 instructions were executed

ステップ実行している行で関数呼び出しが行われる場合、最終的にそれらの呼び出しもカウントされます。step イベントの代わりに next イベントを使用すれば、そのような呼び出しはカウントされません。

イベント発生後にブレークポイントを有効にする

別のイベントが発生した場合のみ、ブレークポイントを有効にします。たとえば、プログラムが関数 hash で、ただし 1300 番目のシンボル検索の後にのみ、正しく実行しなくなった場合、次のブレークポイントを使用します。

(dbx) when in lookup -count 1300 {
    stop in hash
    hash_bpt=$newhandlerid
    when proc_gone -temp { delete $hash_bpt; }
}

注 -  $newhandlerid は、実行されたばかりの stop in コマンドを表しています。

replay 時にアプリケーションファイルをリセットする

この例では、アプリケーションで replay 時にリセットされる必要があるファイルを処理する場合、プログラムを実行するたびにこれを行うハンドラを書くことができます。

(dbx) when sync { sh regen ./database; }
(dbx) run < ./database...    # during which database gets clobbered
(dbx) save
...              # implies a RUN, which implies the SYNC event which
(dbx) restore       # causes regen to run

プログラムのステータスのチェック

この例は、プログラムの実行中にプログラムの場所をすばやく確認する方法を示しています。入力:

(dbx) ignore sigint
(dbx) when sig sigint { where; cancel; }

次に、^C を発行して、プログラムを停止しないでそのスタックトレースを調べます。

この例は、基本的にコレクタ側の標本モードで実行することです (これだけではありません)。^C が使われているため、プログラムに割り込むには SIGQUIT (^\) を使用します。

浮動小数点例外の捕獲

次の例に、IEEE アンダーフローなど、特定の浮動小数点例外のみを捕獲する方法を示します。

(dbx) ignore FPE               # disable default handler
(dbx) help signals | grep FPE  # can’t remember the subcode name
...
(dbx) stop sig fpe FPE_FLTUND
...

ieee ハンドラを有効にする詳細については、FPE シグナルのトラップ (Oracle Solaris のみ)を参照してください。