イベント管理は、デバッグ中のプログラムで特定のイベントが発生したときに特定のアクションを実行する、dbx の一般的な機能です。
この章は、次の各節から構成されています。
イベント管理は「ハンドラ」の概念にもとづいています。この名前は、ハードウェアの割り込みハンドラからできたものです。通常、ハンドラは各イベント管理コマンドによって作成されます。これらのコマンドは、イベント指定と、一連の副作用アクションで構成されます。
プログラムを dbx のアクションに対応づける最も一般的な例は、特定の行にブレークポイントを設定することです。
ハンドラ作成の最も一般的な形は、次のような when コマンドによるものです。
when event-specification {action; ... }
when コマンドだけですべてのイベント管理が可能ですが、dbx ではこれまで数多くのコマンドが使われてきました。それらのコマンドは、下位互換性と、使い慣れたユーザーへの便宜のために今も残されています。
以下の説明では、各コマンド (stop、step、ignore など) を when に置き換えた例を示しています。これらの例は when と基礎にあるハンドラ機構の柔軟性を示すものですが、完全に同じ働きをするものではありません。
次のコマンド (when、stop、trace) はイベントハンドラを作成します。event-spec はこの章で後述するイベント指定です。
コマンドが実行される度にハンドラ ID (hid) を返します。この番号には、事前定義変数$newhandlerid を介してアクセスすることができます。
stop と when コマンドをできるだけ一般化してハンドラのモデルに合致させるように試みましたが、以前の dbx リリースとの下位互換性を保つために完璧にはできませんでした。
その一例として、初期の dbx バージョンで使用されていたハンドラと、それに相当する新しいハンドラを次の表に示します。
表 6-1 イベントハンドラの例
旧ハンドラ |
新ハンドラ |
---|---|
when cond body |
when step -if cond body |
when cond in func body |
when next -if cond -in func body |
この例は、cond が純粋なイベントではなく、条件の内部ハンドラがないことを示しています。
when コマンドで指定したイベントが発生すると、cmds で指定したアクションが実行されます。コマンドがすべて実行されると、プロセスは自動的に続けられます。
when event-specification [ modifier ] { cmds ... ; }
stop コマンドで指定したイベントが発生すると、プロセスは停止します。
stop event-specification [ modifier ]
when event-specification { stop -update; whereami; }
trace コマンドで指定したイベントが発生すると、トレースメッセージが出力されます。
trace event-specification
ここで説明している trace コマンドのほとんどは、when コマンド、ksh 機能、イベント変数を使用して書き換えることができます。これは、トレース情報を書式化して出力したい場合に特に便利です。
これまでに説明したコマンドのほかにも、イベントハンドラを操作するコマンドには次のものがあります。コマンドの詳細については、この章の終わりにある「コマンド参照」を参照してください。
status - ハンドラを表示。
delete - 一時ハンドラを含むすべてのハンドラを削除します。
clear - 停止している位置にあるハンドラを削除します。
handler -enable - ハンドラを有効にします。
handler -disable - ハンドラを無効にします。
イベントハンドラはカウンタを備えており、制限値と実際のカウンタを保持します。イベントが発生するたびにカウンタをインクリメント (1 つ増加) し、その値が制限値に達すると、ハンドラに対応するアクションを起動してカウンタをゼロにリセットします。デフォルトの制限値は 1 です。プロセスが再実行されるたびに、すべてのイベントカウンタがリセットされます。
制限値は、修飾語 -count を使用して設定できます。このほか、個々のイベントハンドラは以下のコマンドを使用して操作できます。
handler [ -count | -reset ] hid new-count new-count-limit
イベント指示子は、stop, when および trace コマンドが型やパラメータを表すために使用します。その書式はイベントタイプを示すキーワードと省略可能なパラメータです。
次に、イベント仕様、構文、および説明を示します。
関数 func に制御が移って、その先頭の行が実行される直前。-instr モードの場合は、関数の最初の命令が実行される直前です。in func を -in func と混同しないでください。func には仮パラメータを含むことができるため、多重定義された関数名、またはテンプレート・インスタンスの指定に役立ちます。たとえば、次のように使用できます。
stop in mumble(int, float, struct Node *)
特定の行 lineno が実行される直前。filename を指定した場合は、そのファイルの特定の行が実行される直前。ファイル名には、ソースファイル名またはオブジェクトファイル名を指定します。引用符マークは不要ですが、ファイル名に不正な文字が含まれる場合には必要なことがあります。
at filename:lineno
特定の行 lineno がテンプレートコードに含まれる場合は、そのテンプレートのすべてのインスタンスに 1 バイト挿入されます。
func という名前の多重定義関数のすべて、またはテンプレートインスタンスのすべてに対し、in func と同じ働きをします。
すべてのクラスの func という名前のメンバー関数に対し、in func と同じ働きをします。
クラス classname のメンバーであるすべてのメンバー関数に対し、in func と同じ働きをします。
obj-expr に指定されているアドレスのオブジェクトを呼び出したメンバー関数が呼び出されているとき。
variable の値が変化するとイベントが発生します。
cond-expr によって示される条件が真と評価されます。cond-expr には任意の式を使用できますが、整数型に評価されなければなりません。
このイベントは、現在表示されている関数の戻りのブレークポイントです。表示されている関数を使用するのは、いくつかの up を行なった後に returns イベント指定を使用できるようにするためです。通常の戻りイベントは常に一時イベント (-temp) で、動作中のプロセスが存在する場合にだけ作成できます。
これは一時イベントではありません。特定の関数がその呼び出し場所にリターンするたびに発生します。戻り値は示されませんが、SPARC プラットフォームでは $o0、Intel プラットフォームでは $eax を使用して、必須戻り値を調べることができます。
SPARC |
$o0 |
Intel |
$eax |
when in func { stop returns; }
step イベントは、ソース行の先頭の命令が実行されると発生します。たとえば、次のようにシンプルに表現することができます。
when step { echo $lineno: $line; }
step を有効にするということは、次に cont が使用されるときに自動的にステップ実行するように dbx に命令することと同じです。step コマンドは、次のように指定できます。
alias step="when step -temp { whereami; stop; }; cont"
step に似た働きをしますが、関数内をステップ実行しません。
デバッグの対象が seconds で指定された時間だけ実行されると発生します。これに使用されるタイマーは、collector コマンドと共有されます。分解能がミリ秒単位であるため、秒数に浮動小数点値を使用することができます。
指定したシグナルが子プロセスに初めて送信された場合に、このイベントが起動します。sig は、10 進数または大文字か小文字のシグナル名で表すことができます。また、シグナル名には接頭辞“SIG”をつけても構いません。これは、catch/ignore コマンドから完全に独立しています。もっとも、catch コマンドは次のようにしても実現できます。
function simple_catch { when sig $1 { stop; echo Stopped due to $sigstr $sig whereami } }
sig イベントを受け取っても、プロセスはまだ生きています。シグナルの送られるプロセスを cont した場合にだけ、シグナルはプロセスに配信されます。
このイベントは、指定されたサブコード sub-code を持つ指定されたシグナル sig が子プロセスに最初に送信されたときに起動します。シグナルの場合と同じように、サブコードも 10 進数、大文字または小文字の名前 (接頭辞は省略可能) のいずれかで入力できます。
このイベントは、指定されたフォールト (障害) fault が発生したときに起動します。フォールトはアーキテクチャに依存しますが、dbx は proc(4) で定義された次のフォールトを認識しています。
FLTILL |
不正命令 |
FLTPRIV |
特権つき命令 |
FLTBPT* |
ブレークポイント命令 |
FLTTRACE* |
トレーストラップ (ステップ実行) |
FLTACCESS |
メモリーアクセス (境界合わせなど) |
FLTBOUNDS* |
メモリー境界 (無効なアドレス) |
FLTIOVF |
整数オーバーフロー |
FLTIZDIV |
整数ゼロ除算 |
FLTPE |
浮動小数点例外 |
FLTSTACK |
修復不可能なスタックフォールト |
FLTPAGE |
修復可能なページフォールト |
* BPT、TRACE、BOUNDS は、ブレークポイント、単一ステップ実行、ウォッチポイントを設定するために dbx で使用されるため注意が必要です。これらのコマンドを操作すると、dbx の内部処理に支障をきたす場合があります。
これらのフォールトは、/sys/fault.h から抜粋されています。fault には上記の名前を大文字または小文字で指定できるほか、実際のコードも指定できます。また、コードの名前には、接頭辞 FLT- をつけることがあります。
addr-exp で指定されたメモリーがアクセスされたとき。
mode には、メモリーがアクセスされたことを示す、次のいずれか (またはすべて) の文字を指定します。
r |
メモリーが読み取られた |
w |
メモリーが書き込まれた |
x |
メモリーが実行された |
さらに mode には、次のいずれかの文字も指定することができます。
a |
アクセス後にプロセスを停止する (デフォルト) |
b |
アクセス前にプロセスを停止する |
いずれの場合も、プログラムカウンタは副作用アクションの前後で違反している命令をポイントします。
access は modify の代替イベントです。どちらの構文も、Solaris 2.4、2.5、2.5.2、2.6、7 で動作します。ただし、そのうち Solaris 2.6 を除くオペレーティング環境では、modify と同じ制限が課せられ、wa モードしか使用できません。
同じ範囲を重複使用することはできません。
指定されたアドレス範囲で変更があったとき。これは古いウォッチポイント機能です。
addr-exp は、その評価によりアドレスを生成できる任意の式です。シンボル式を使用すると、監視対象の領域のサイズが自動的に推定されます。このサイズは ',' 構文を使用して変更できます。また、記号を使用しない、型を持たないアドレス式を使用することもできますが、その場合はサイズを指定する必要があります。たとえば、次のようにします。
stop modify 0x5678, sizeof(Complex)
スタック上のアドレスを監視することはできません。
監視中のアドレスがシステムコールによって変更されても、イベントは起動しません。
共有メモリー (MAP_SHARED) は監視できません。dbx が共有メモリーに格納されたほかのプロセスを捕捉できないためです。また、dbx は SPARC の swap 命令と ldstub 命令を適切に処理できません。
指定されたシステムコールが起動された直後で、プロセスがカーネルモードに入ったとき。
dbx の認識するシステムコールは procfs(4) の認識するものに限られます。これらのシステムコールはカーネルでトラップされ、/usr/include/sys/syscall.h に列挙されます。
これは、ABI の言うところのシステムコールとは違います。ABI のシステムコールの一部は部分的にユーザーモードで実装され、非 ABI のカーネルトラップを使用します。ただし、一般的なシステムコールのほとんど (シグナル関係は除く) は syscall.h と ABI で共通です。
指定されたシステムコールが終了し、プロセスがユーザーモードに戻る直前。
引数がないときは、すべてのシステムコールがトレースされます。ここで、modify イベントや RTC (実行時検査) などの特定の dbx は、子プロセスにその目的でシステムコールを引き起こすことがあることに注意してください。トレースした場合にそのシステムコールの内容が示されることがあります。
follow exec の結果新しいプログラムが読み込まれると始まります。
このイベントのハンドラは常に永続です。
プロセスが停止したとき。特に stop ハンドラによりユーザーがプロンプトを受け取るときのようにプロセスが停止すると、このイベントが起動します。次に例を示します。
display x when stop {print x;}
デバッグ対象のプロセスが exec() で実行された直後。a.out で指定されたメモリーはすべて有効で存在しますが、あらかじめ読み込まれるべき共有ライブラリはまだ読み込まれていません。たとえば printf は dbx に認識されていますが、まだメモリーにはマップされていません。
stop コマンドにこのイベントを指定しても期待した結果は得られません。when コマンドに指定してください。
このイベントは、sync (被デバッグ側が共有ライブラリをまだ処理していない場合は attach) の後に発生します。すなわち、動的リンカーの起動時コードが実行され、あらかじめ読み込まれている共有ライブラリすべてのシンボルテーブルが読み込まれた後、ただし、.init セクション内のコードがすべて実行される前に発生します。
stop コマンドにこのイベントを指定しても期待した結果は得られません。when コマンドに指定してください。
dbx がプロセスを正常に接続した直後。
dbx がプロセスを切り離す直前。
lwp が終了したとき。$lwp には、終了した LWP の ID が含まれます。
dbx がデバッグ中のプロセスと関連しなくなるとき。事前定義済み変数 $reason に、signal、exit、kill、または detach のいずれかが設定されます。
デバッグ対象のプロセスが終了する直前。このイベントが発生するのは次の 3 つの場合です。
システムコール _exit (2) が呼び出し中 (これは、明示的に呼び出されたとき、または main() のリターン時に発生します)。
終了シグナルが送信されようとするとき。
dbx コマンド kill によってプロセスが強制終了されつつあるとき。
これらのイベントは、dlopen() または dlclose() の呼び出しが正常終了した後に発生します。dlopen() または dlclose() の呼び出しにより、複数のライブラリが読み込まれることがあります。これらのライブラリのリストは、事前定義済み変数 $dllist で常に入手できます。$dllist の中の最初の単語は実際には "+" または "-" で、それぞれライブラリが追加されているか、削除されているかを示します。
lib-path は、該当する共有ライブラリの名前です。これを指定した場合、そのライブラリが読み込まれたり、読み込みが取り消されたりした場合にだけイベントが起動します。その場合、$dlobj にライブラリの名前が格納されます。また、$dllist も利用できます。
lib-path が / で始まる場合は、パス名全体が比較されます。それ以外の場合は、パス名のベースだけが比較されます。
lib-path を指定しない場合、イベントは任意の dl 動作があるときに必ず起動します。$dlobj は空になりますが、$dllist は有効です。
イベント指定のため修飾子は、ハンドラの追加属性を設定します。最も一般的な種類はイベントフィルタです。修飾子はイベント指定のキーワードの後に指定しなければなりません。修飾語はすべて '-' で始まります (その前にブランクが置かれます)。各修飾子の構成は次のとおりです。
event-spec で指定されたイベントが発生したとき、条件 cond が評価されます。イベントは、条件が非ゼロと評価された場合にだけ発生すると考えられます。条件は、フィルタと呼ばれることがあります。フィルタを使用したハンドラをフィルタ化ハンドラと呼びます。
-if が、in または at などの単独のソース位置に基づくイベントで使用された場合、cond はその位置に対応するスコープで評価されます。そうでない場合は、必要なスコープによって正しく修飾する必要があります。
ハンドラは、指定した関数 func、または func から呼び出された関数によって制御されている間だけ有効になります。関数へ入った回数は、再帰呼び出しに正しく対応するため「参照による計数」が行われます。修飾語 -in によって修飾されたハンドラは、「func によって範囲が制限されている」といいます。
無効な状態にしてイベントを作成します。
イベントをゼロからカウントします。count はその値が n に達するまで、イベントが発生するたびにインクリメントされます。カウントが n に達すると、イベントが起動し、カウンタがゼロにリセットされます。
プログラムが実行または再実行されると、すべてのイベントのカウントがリセットされます。より具体的に言えば、カウントは sync イベントが発生するとリセットされます。
一時ハンドラを作成します。イベントが発生すると、一時イベントは削除されます。デフォルトではハンドラは、一時イベントではありません。ハンドラが計数ハンドラ (-count が指定されたイベント) の場合はゼロに達すると自動的に破棄されます。
一時ハンドラをすべて削除するには delete -temp を実行します。
イベントを命令レベルで動作させます。これにより、ほとんどの 'i' で始まるコマンドは不要となります。この修飾子は、イベントハンドラの 2 つの面を修飾します。
出力されるどのメッセージもソースレベルの情報ではなく、アセンブリレベルを示す。
イベントの細分性が命令レベルになる。たとえば step -instr は、命令レベルのステップ実行を意味する。
指定されたイベントがスレッド識別子 tid に一致するアクティブなスレッドで発生した場合にコマンドを実行します。
指定されたイベントが LWP 識別子 lid に一致するアクティブな LWP で発生した場合にコマンドを実行します。
ハンドラが正規の status コマンドに示されないようにします。隠されたハンドラを表示するには、status -h を使用してください。
通常、すべてのハンドラは、新しいプログラムが読み込まれると廃棄されます。この修飾子を使用すると、ハンドラはデバッグが終わっても保存されます。delete コマンド単独では、永続ハンドラは削除されません。永続ハンドラを削除するには、delete -p を使用してください。
イベント指定と修飾子のための構文の特徴は次のとおりです。
キーワード駆動型である。
主に、空白によって区切られた「単語」に分割される点など、すべて ksh の規約にもとづいている。
下位互換性のため、式の中には空白を含むことができます。そのため、式の内容があいまいになることがあります。たとえば、次の 2 つのコマンドがあるとします。
when a -temp when a-temp
上の例では、アプリケーションで temp という名前の変数が使用されていても、dbx は -temp を修飾子としてイベント指定を解釈します。下の例では、a-temp がまとめて言語固有の式解析プログラムに渡され、a および temp という変数が存在しなければ、エラーになります。オプションを括弧で囲むことにより、解析を強制できます。
読み取り専用の ksh 事前定義済み変数がいくつか用意されています。以下に示す変数は常に有効です。
表 6-2 事前定義済み変数
変数 |
定義 |
---|---|
$pc |
現在のプログラムカウンタのアドレス (16 進数) |
$ins |
現在の命令の逆アセンブル |
$lineno |
現在の行番号 (10 進数) |
$line |
現在の行の内容 |
$func |
現在の関数の名前 |
$vfunc |
現在「表示している」関数 |
$class |
$func が所属するクラスの名前 |
$vclass |
$vfunc が所属するクラスの名前 |
$file |
現在のファイルの名前 |
$vfile |
現在表示しているファイルの名前 |
$loadobj |
現在のロードオブジェクトの名前 |
$vloadobj |
現在表示している現在のロードオブジェクトの名前 |
$scope |
逆引用符表記での現在の PC のスコープ |
$vscope |
現在表示している逆引用符表記での PC のスコープ |
$funcaddr |
$func のアドレス (16 進数) |
$caller |
$func を呼び出している関数の名前 |
$dllist |
dlopen イベントまたは dlclose イベントの後、dlopen または dlclose された直後のロードオブジェクトのリストが格納されます。$dllist の中の先頭の単語は実際には "+" または "-" です。これは、dlopen と dlclose のどちらが発生したかを示します。 |
$newhandlerid |
最後に作成されたハンドラの ID |
$proc |
現在デバッグ中のプロセスの ID |
$lwp |
現在の LWP の ID |
$thread |
現在のスレッドの ID |
$prog |
デバッグ中のプログラムの絶対パス名 |
$oprog |
$prog の古い値または元の値。これは、exec() に続いて、デバッグしていたものに戻る場合に便利です。 |
$exitcode |
プログラムの最後の実行状態を終了します。この値は、プロセスが実際には終了していない場合、空文字列になります。 |
function whereami { echo Stopped in $func at line $lineno in file $(basename $file) echo "$lineno¥t$line" }
次に示す変数は、when の本体内部でのみ有効です。
本体の実行中、$handlerid にはそれが属する when コマンドの ID が格納されます。次のコマンドは同じ結果になります。
when X -temp { do_stuff; } when X { do_stuff; delete $handlerid; }
イベントがブートプロセス中に起こると、true (真) に設定されます。新しいプログラムは、デバッグされるたびに、まず共有ライブラリのリストと位置を確認できるよう、ユーザーに通知されないまま実行されます。プロセスはその後終了します。ブートはこのようなシーケンスで行われます。
ブートが起こっても、イベントはすべて使用可能です。この変数は、デバッグ中に起こる sync および syncrtld のイベントと、通常の実行中に起こるこれらのイベントを区別するときに使用してください。
$sig |
イベントを発生させたシグナル番号 |
$sigstr |
$sig の名前 |
$sigcode |
適用可能な場合、$sig のサブコード |
$sigcodestr |
$sigcode の名前 |
$sigsender |
必要であれば、シグナルの送信者のプロセス ID |
$exitcode |
_exit(2) または exit(3) に渡された引数の値、または main の戻り値 |
$dlobj |
dlopen または dlclose されたロードオブジェクトのパス名 |
$syscode |
システムコールの番号 |
$sysname |
システムコールの名前 |
$reason |
シグナル、終了、強制終了、または切り離しのいずれか。 |
イベントハンドラを設定するには、次の例を使用してください。
(dbx) stop access w &array[99] (2) stop access w &array[99], 4 (dbx) run 実行中: watch.x (プロセス id 9247) ウォッチポイント &array[99] (0x20b68[4]) 行番号 12 ファイル "watch.c" 12 array[i] = i;
(dbx) when step { echo at line $lineno; }
trace step -in foo
# ハンドラの使用不可能状態を作成する when step -disable { echo Stepped to $line; } t=$newhandlerid # ハンドラ ID を憶えておく when in foo { # foo を入力するとトレースハンドラ -enable "$t" が # 使用可能になり、foo から返るとトレースが # 使用不可能になります。 when returns { handler -disable "$t"; }; }
(dbx) stop step -count infinity # ステップ実行し、count=inf (関数が 無限大) になったところで停止する (2) stop step -count 0/infinity (dbx) run ... (dbx) status (2) stop step -count 133/infinity
ここでは、プログラムを停止させているのではなく、明らかにプログラムが終了しています。133 は実行された行数です。ただし、このプロセスは非常に低速です。この方法が有効なのは、何度も呼び出される関数にブレークポイントを設定している場合です。
(dbx) ... # 調べたい行まで移動する (dbx) stop step -instr -count infinity (dbx) step ... (dbx) status (3) stop step -count 48/infinity # 48 個の命令が実行された
ステップ実行している行で関数呼び出しが行われる場合、最終的にそれらの呼び出しもカウントされます。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 コマンドを参照している点に注意してください。
(dbx) when dlopen mylib.so { # 古いオブジェクトの削除 (存在する場合) if [ -n "$B1" ] then delete "$B1" fi # 新しいオブジェクトの作成 stop in func B1="$newhandlerid" }
アプリケーションが処理するファイルを replay 中にリセットする必要がある場合、プログラムを実行するたびに自動的にリセットを行うハンドラを書くことができます。
(dbx) when sync { sh regen ./database; } (dbx) run < ./database... # この間にデータベースファイルが壊れた場合 (dbx) save ... # run が自動的に行われ、sync イベントが (dbx) restore # 発生し、regen が実行される。
(dbx) ignore sigint (dbx) when sig sigint { where; cancel; }
プログラムを停止しないでそのスタックトレースを調べるためには、ここで ^C を押します。
コレクタはこれ以外のことも実行できますが、基本的にコレクタの手動標本収集モードが実行する機能は、このように状態を調べます。ここではすでに ^C を使用したため、プログラムに割り込むには SIGQUIT (^¥) を使用します。
特定の浮動小数点例外を捕捉します。ここでは、IEEE オーバーフローだけを捕捉しています。
(dbx) ignore FPE # デフォルトのハンドラをオフにする (dbx) help signals | grep FPE # サブコードの名前を思い出せない ... (dbx) stop sig fpe FPE_FLTUND ...
指定したイベントが発生したときに command を実行するには、次のように入力します。
when event-specification { command(s); }
現時点で実行を停止して表示を更新するには、次のように入力します。通常、プロセスは本体の実行後も続けられますが、stop コマンドはこれを防止します。次の形式は、when の本体内でのみ有効です。
stop -update
stop -noupdate
指定したイベントで実行を停止するには、次のように入力します。
stop event-specification
when step -temp { stop; }; cont
step コマンドは sig 引数をとることができます。step そのものは、cont と同様に現在のシグナルを取り消します。シグナルを転送するには、明示的にシグナルを与える必要があります。変数 $sig を使用すると、プログラムにステップして、それに現在のシグナルを送信することができます。
step -sig $sig
when の本体内でのみ有効です。cancel コマンドは、配信された可能性のあるシグナルすべてを取り消して、プロセスを続行させます。次に例を示します。
when sig SIGINT { echo signal info; cancel; }
status コマンドは、trace、when、および stop によって作成されたハンドラを示します。status hid は、指定のハンドラをリストします。ハンドラが無効な場合は、その hid が、かっこ () ではなく角かっこ [] 内に出力されます。
status [-s] -h hid
status の出力は、宛先をファイルに変更することができます。名目上、形式はリダイレクト中には変更されません。-s フラグを使用すると、ハンドラを source コマンドを使用して復元できるようにする出力を作成することができます。-h オプションを使用すると、隠されたオプションをリスト表示することもできます。
status を使用したハンドラのリダイレクトとファイルのソース化の元の技法は、ハンドラの有効化および無効化機能の欠落を補うものでした。
delete コマンドは、ブレークポイントやほかのイベントを削除します。
delete all -all -temp hid [hid ... ]
delete hid は指定のハンドラを削除します。
delete all または delete 0 (ゼロ) も使用できます。
delete -all は、一時ハンドラを含むすべてのハンドラを削除します。delete -temp は、一時ハンドラだけをすべて削除します。
-h hid は、hid が隠されたハンドラの場合に必要です。-h all は、隠されたハンドラもすべて削除します。
clear に引数を付けずに実行すると、プロセス停止位置にあるブレークポイントにもとづくべてのハンドラが削除されます。clear line では、指定の行にあるブレークポイントにもとづくすべてのハンドラが削除されます。
clear line
ハンドラは、デバッグセッションで管理されるべきイベントごとに作成されます。trace、stop、when コマンドはハンドラを作成し、それぞれがハンドラ ID (hid) と呼ばれる数値を返します。handler、status、delete コマンドは、一般的な方法でハンドラに関する情報を操作したり指定したりします。
handler [ -disable | -enable ] all hid [...]
handler -disable hid は、指定のイベントを無効にします。
handler -disable all は、すべてのハンドラを無効にします。
handler -enable hid は指定のハンドラを有効にします。
handler -enable all はすべてのハンドラを有効にします。
handler [ -count | -reset ] hid new-count-limit
handler -count hid は、current-count/limit の形式でイベントのカウントを返します (status によって出力される形式と同じ)。limit はキーワード infinity になる場合があります。ksh 修飾子 ${#} および ${##} は、出力値を分割する場合に使用してください。
handler -count hid new-count-limit は、新しいカウントの限界を、指定のハンドラに割り当てます。
handler -reset hid は、ハンドラのカウントを 0 (ゼロ) にリセットします。