Oracle Solaris Studio 12.2: dbx コマンドによるデバッグ

システムイベント指定

次に、システムイベントに対するイベント指定について説明します。

dlopen [ lib-path ] dlclose [ lib-path ]

これらのイベントは、dlopen() または dlclose() の呼び出しが正常終了したあとに発生します。dlopen() または dlclose() の呼び出しにより、複数のライブラリが読み込まれることがあります。これらのライブラリのリストは、事前定義済み変数 $dllist で常に入手できます。$dllist の中の最初のシェルの単語は実際には「+」または「-」で、それぞれライブラリが追加されているか、削除されているかを示します。

lib-path は、該当する共有ライブラリの名前です。これを指定した場合、そのライブラリが読み込まれたり、読み込みが取り消されたりした場合にだけイベントが起動します。その場合、$dlobj にライブラリの名前が格納されます。また、$dllist も利用できます。

lib-path/ で始まる場合は、パス名全体が比較されます。それ以外の場合は、パス名のベースだけが比較されます。

lib-path を指定しない場合、イベントは任意の dl 動作があるときに必ず起動します。$dlobj は空になりますが、$dllist は有効です。

fault fault

fault イベントは、指定の障害に遭遇したとき、発生します。障害は、アーキテクチャー依存です。dbx に対して知られる次の一連の障害は、proc(4) マニュアルページで定義されています。

障害  

内容の説明  

FLTILL

不正命令 

FLTPRIV

特権付き命令 

FLTBPT*

ブレークポイントトラップ 

FLTTRACE*

トレーストラップ (ステップ実行) 

FLTACCESS

メモリーアクセス (境界合わせなど) 

FLTBOUNDS

メモリー境界 (無効なアドレス) 

FLTIOVF

整数オーバーフロー 

FLTIZDIV

整数ゼロ除算 

FLTPE

浮動小数点例外 

FLTSTACK

修復不可能なスタックフォルト 

FLTPAGE

修復可能なページフォルト 

FLTWATCH*

ウォッチポイントトラップ 

FLTCPCOVF

CPU パフォーマンスカウンタオーバーフロー 


注 –

BPTTRACEBOUNDS は、ブレークポイントとステップ実行を実現するため、dbx で使用されます。これらを操作すると、dbx の動作に影響を及ぼす場合があります。



注 –

FLTBPT および FLTTRACE は、ブレークポイントやシングルステップ実行などの dbx の基本機能を妨げることがあるため、無視されます (「イベントの安全性」を参照)。


これらの障害は、/sys/fault.h から抜粋されています。fault には前述の名前を大文字または小文字で指定できるほか、実際のコードも指定できます。また、コードの名前には、接頭辞 FLT- を付けることがあります。


注 –

fault イベントは、Linux プラットフォームでは使用できません。


lwp_exit

lwp_exit イベントは、lwp が終了したとき、発生します。$lwp には、イベントハンドラを維持している間に終了した LWP (軽量プロセス) の id が含まれます。


注 –

lwpexit イベントは、Linux プラットフォームでは使用できません。


sig signal

sig signal イベントは、デバッグ中のプログラムに信号が初めて送られたとき、発生します。signal は、10 進数、または大文字、小文字の信号名のいずれかです。接頭辞は任意です。このイベントは、catch および ignore コマンドからは完全に独立しています。ただし、catch コマンドは次のように実現することができます。


function simple_catch {
    when sig $1 {
            stop;
            echo Stopped due to $sigstr $sig
            whereami
    }
}

注 –

sig イベントを受け取った時点では、プロセスはまだそれを見ることができません。指定の信号を持つプロセスを継続する場合のみ、その信号が転送されます。


sig signal sub-code

指定の sub-code を持つ指定の信号が child に初めて送られたとき、sig signalsub-code イベントが発生します。信号同様、sub-code は 10 進数として、大文字または小文字で入力することができます。接頭辞は任意です。

sysin code | name

指定されたシステムコールが起動された直後で、プロセスがカーネルモードに入ったとき。

dbx の認識するシステムコールは procfs(4) の認識するものに限られます。これらのシステムコールはカーネルでトラップされ、/usr/include/sys/syscall.h に列挙されます。

これは、ABI の言うところのシステムコールとは違います。ABI のシステムコールの一部は部分的にユーザーモードで実装され、非 ABI のカーネルトラップを使用します。ただし、一般的なシステムコールのほとんど (シグナル関係は除く) は syscall.h と ABI で共通です。


注 –

sysin イベントは、Linux プラットフォームでは使用できません。



注 –

/usr/include/sys/syscall.h 内のカーネルシステムコールトラップのリストは、Solaris OS のプライベートインタフェースの一部です。これはリリースによって異なります。dbx が受け付けるトラップ名 (コード) およびトラップ番号のリストは、dbx がサポートするバージョンの Solaris OS によってサポートされているすべてを含みます。dbx によってサポートされている名前が特定のリリースの Solaris OS でサポートされている名前と性格に一致することはありえないため、syscall.h 内のいくつかの名前は利用可能でない場合があります。すべてのトラップ番号 (コード) は dbx で受け入れられ、予測どおりに動作しますが、既知のシステムコールトラップに対応しない場合は、警告が発行されます。


sysout code | name

指定されたシステムコールが終了し、プロセスがユーザーモードに戻る直前。


注 –

sysout イベントは、Linux プラットフォームでは使用できません。


sysin | sysout

引数がないときは、すべてのシステムコールがトレースされます。ここで、modify イベントや RTC (実行時検査) などの特定の dbx は、子プロセスにその目的でシステムコールを引き起こすことがあることに注意してください。トレースした場合にそのシステムコールの内容が示されることがあります。