dbx プラグイン・フレームワーク用の開発
dbx は、新規の dbx サブコマンドとイベント・ハンドラーを追加したいと考えている開発者用のプラグイン・フレームワークとして機能します。
- デフォルトの dbx コマンドは 64 ビット・プロセスであるため、dbx コマンドと一緒に使用するには、すべてのプラグインを 64 ビットにコンパイルする必要があります。 32 ビットのプラグインをロードするには、32 ビット版の dbx コマンドである dbx32 コマンドを使用します。
- dbx コールバック・ルーチンとプラグイン・インターフェース・ルーチンを混同しないよう気を付けなければなりません。
- dbx コールバック・ルーチンとは、プラグイン用に dbx に備えられた一連のサービスのことです。 このプラグインは、一連の関数ポインターを介してそのようなルーチンにアクセスすることができます。
- プラグイン・インターフェース・ルーチンとは、プラグインによってインプリメントされるために dbx に必要な一連のメソッドのことです。
ファイル・フォーマット
すべてのプラグインは、共用オブジェクト・ファイルでなければなりません。
命名
dbx では、サブコマンド入力を正しくリダイレクトするには、 どのプラグインにも固有名 が付いていなければなりません。
^libdbx_.+¥.so$| ファイル名 | 有効かどうか | 固有名 |
|---|---|---|
| libdbx_sample.so | Yes | sample |
| libdbx_xyz.so | Yes | xyz |
| libdbx_my_app.so | Yes | my_app |
| libdbx.so | No | |
| libdbx_.so | No | |
| libdbx_sample.so.plugin | No | |
| plugin_libdbx_sample.so | No |
Location
$ export dbx_PLUGIN_PATH=$HOME/dbx_plugins:/mnt/share/dbx_pluginsロード
- プラグインは、dbx が検索するディレクトリー内に置くことで、自動的にロードされ、初期化されるようにすることができます。 それが行われるのは、dbx の初期化のときです。
- pluginload dbx サブコマンドに対してプラグインのロケーションを指定すると、そのプラグインを手動でロードして初期化することができます。 これは dbx セッション中はいつでも行うことができます。
(dbx) pluginload /home/user/dbx_plugins/libdbx_sample.so
plug-in "/home/user/dbx_plugins/libdbx_sample.so" loaded(dbx) pluginload /mnt/share/dbx_plugins/libdbx_sample.so
could not load plug-in
"/mnt/share/dbx_plugins/libdbx_sample.so":
plug-in "/home/user/dbx_plugins/libdbx_sample.so" already loaded.アンロード
(dbx) pluginunload sample
plug-in "/home/user/dbx_plugins/libdbx_sample.so" unloaded.バージョン管理
他の場合であれば既存のプラグインと以前のバージョンのプラグインとの 互換性をなくすはずの変更をプラグイン・フレームワークに加える場合、 新規のバージョン ID が作成されます。このプロセスは、 プラグイン・インターフェースまたはプラグイン dbx コールバック・ルーチンに 重大な変更や追加を行う場合すべてに当てはまります。
プラグイン・バージョンを頻繁に変更する必要性を最小化するには、 いくつかのプラグイン dbx コールバック・ルーチン で、バッファーのサイズを表す追加のパラメーターが必要になります。 この手法は、dbx によってサイズが制御されないシステム構造に基づいたバッファー・パラメーターの場合、使用します。 これで、プラグイン・バージョンを更新しなくても、システム構造のサイズを変更できるようになります。
現在、唯一のバージョン ID は DBX_PLUGIN_VERSION_1 です。
ヘッダー・ファイル
/usr/include/sys/dbx_plugin.hプラグイン・インターフェース
プラグイン・インターフェース・ルーチンのプロトタイプと定義の詳細は、
dbx_plugin.h ヘッダー・ファイルを参照してください。
int dbx_plugin_version(void)int dbx_plugin_session_init(dbx_plugin_session_t session, constdbx_plugin_service_t *servicep)void dbx_plugin_session_command(dbx_plugin_session_t session, int argc, char *const argv[])void dbx_plugin_session_event(dbx_plugin_session_t session, int event, dbx_plugin_event_info_t *event_infop)
int dbx_plugin_version(void)
このルーチンは、
プラグインが準拠するバージョンに対応する dbx プラグイン・バージョンを戻さなければなりません。 現在の唯一のバージョン ID は DBX_PLUGIN_VERSION_1 です。
int dbx_plugin_session_init(dbx_plugin_session_t session, constdbx_plugin_service_t *servicep)
このルーチンは、制御を dbx に戻すまでに、 プラグインが正しく機能するのに必要なすべての初期化を実行しなければなりません。 これには、必要に応じたプラグイン・サブコマンドのすべての別名のセットアップも含まれます。
このルーチンは、特定のセッション ID をアプリケーション・プログラムまたはファイルに関連付けるプラグイン・セッションを作成しなければなりません。 プロセスまたはコア・ファイルを識別するため、セッション ID は、プラグイン・インターフェース呼び出しにおいては dbx で使用され、プラグイン dbx コールバック・ルーチン要求においてはプラグインで使用されます。 また、このルーチンは、コールバック・ルーチン構造も受け入れます。
このルーチンは、初期化が正常に完了した場合にはゼロを戻すはずです。 初期化が正常に完了しなかった場合は、 dbx はプラグインをアンロードして破棄します。
void dbx_plugin_session_command(dbx_plugin_session_t session, int argc, char *const argv[])
このルーチンは、dbx ユーザーからの、 plugin サブコマンドに指定した引数の形式の入力を受け入れなければなりません。 plugin サブコマンドの構文は次のとおりです。
plugin Name [arg0 arg1 arg2 ... argn]そうすると、dbx ユーザーは、任意の 1 つのプラグインに任意の入力を行うことができます。 そのプラグインは、入力として受け入れた内容に対する全面的な制御権を持ちます。
plugin サブコマンドは、arg* パラメーターで指定されたコマンドを、Name パラメーターで指定されたプラグインに渡します。
(プラグイン名には libdbx_Name.so などがあります。) このルーチンを使用して dbx は arg0 から argn までをプラグインに渡します。 argv[0] は arg0 に対応し、argv[1] は arg1 に対応する、などとなります。
多くの場合、arg0 は、プラグインで定義されているサブコマンドの名前を表し、 arg1 から argn までは、追加のフラグまたは引数を表します。 ただし、このように定められているわけではありません。
開発者に対しては、 プラグインの使用方法の詳細を示す help サブコマンドをインプリメントするようお勧めします。
void dbx_plugin_session_event(dbx_plugin_session_t session, int event, dbx_plugin_event_info_t *event_infop)
| ID (event) | 関連データ (event_infop) | 原因 |
|---|---|---|
| DBX_PLUGIN_EVENT_RESTART | なし | dbx ユーザーが run サブコマンドを実行した。 |
| DBX_PLUGIN_EVENT _EXIT | 終了コード | アプリケーション・プログラムが出口ルーチンによって終了した。 |
| DBX_PLUGIN_EVENT _TERM | 終了シグナル番号 | 未処理のシグナルが原因で、アプリケーション・プログラムが終了した。 |
| DBX_PLUGIN_EVENT _LOAD | ロード済みモジュールの dbx_plugin_modinfo_t 構造 | モジュールがアプリケーション・プログラムにロードされた。 |
| DBX_PLUGIN_EVENT _UNLOAD | アンロードされたモジュールの dbx_plugin_modinfo_t 構造 | モジュールがアプリケーション・プログラムからアンロードされた。 |
| DBX_PLUGIN_EVENT_BP | なし | ユーザーまたは内部の dbx ブレークポイントが原因か、 またはデータ監視ポイントが原因で、アプリケーション・プログラムが停止した。 |
| DBX_PLUGIN_EVENT_SIGNAL | シグナル番号 | シグナルの送付が原因で、アプリケーション・プログラムが停止した。 |
| DBX_PLUGIN_EVENT_SWTHRD | 現在の pthread のハンドル | dbx ユーザーが thread current<handle> サブコマンドを実行した結果、現在の pthread が変更された。 |
DBX_PLUGIN_EVENT_BP イベントと DBX_PLUGIN_EVENT_SIGNAL イベントは、 アプリケーション・プログラムは開始されてから停止されたことを意味します。 これらのイベントは、プラグインが保有するキャッシュ済みデータは既に有効ではないことを示すためのイベントです。 このようなイベントが通知されたら、 データをリフレッシュするよりもキャッシュ済みのすべてのデータを単に無効化したほうがプラグインの効率はよくなります。 キャッシュされたデータの完全リフレッシュは、そのデータが必要になったときのみ行わなければなりません。 それが妥当であるのは、一部のシグナルは dbx によって無視され、 一部のブレークポイントは内部ブレークポイントである可能性があるからです。 アプリケーション・プログラムの再始動の前にユーザーがサブコマンドを実行する機会がない場合、 データを何度もリフレッシュするのはリソースの無駄使いになります。
void dbx_plugin_session_destroy(dbx_plugin_session_t session)このルーチンは、 プラグインで必要とされる最終クリーンアップとメモリー管理のすべてのタスクを実行します。
dbx コールバック・ルーチン
以下は、dbx_plugin_session_init ルーチンを介して各プラグインごとに用意されている
dbx コールバック・ルーチンです。
dbx session コールバック・ルーチンは、dbx セッションの特性を取得するのに役立ちます。 dbx が flagsp パラメーター内に埋め込まれます。
typedef int (*dbx_plugin_session_service_t)(dbx_plugin_session_t session,
dbx_plugin_session_flags_t *flagsp).dbx session コールバック・ルーチンのパラメーターは次のとおりです。
- パラメーター
- 説明
- session
- セッション ID。
- flagsp
- 以下を任意に組み合わせたセッション特性。
- DBX_PLUGIN_SESSION_64BIT
これに設定した場合、セッションは 64 ビット・アプリケーション・プログラムを表します。 それ以外の場合、セッションは 32 ビット・アプリケーション・プログラムを表します。
- DBX_PLUGIN_SESSION_CORE
これに設定した場合、セッションはコア・ファイルを表します。 それ以外の場合、セッションはライブ・プロセスを表します。
- DBX_PLUGIN_SESSION_64BIT
- DBX_PLUGIN_SUCCESS
- DBX_PLUGIN_BAD_SESSION - セッションは有効ではありません。
- DBX_PLUGIN_BAD_POINTER - flagsp は NULL です。
プロセス
dbx process コールバック・ルーチンは、デバッグ対象のプロセスに関する情報を入手するのに役立ちます。 dbx は、infop パラメーターにデータを取り込みます。
typedef int (*dbx_plugin_process_service_t)(dbx_plugin_session_t session,
dbx _plugin_procinfo_t *infop,
size_t procinfo_size) dbx process コールバック・ルーチンのパラメーターは次のとおりです。
- パラメーター
- 説明
- session
- セッション ID。
- infop
- 割り振り済みの dbx_plugin_procinfo_t 構造
- procinfo_size
- dbx_plugin_procinfo_t 構造のサイズ
- DBX_PLUGIN_SUCCESS
- DBX_PLUGIN_BAD_SESSION - session は有効ではありません。
- DBX_PLUGIN_BAD_POINTER - infop は NULL です。
- DBX_PLUGIN_BAD_ARG - procinfo_size は有効ではありません。
- DBX_PLUGIN_UNAVAILABLE - プロセスはアクティブではないか、またはメモリー内に情報がありません。
fds
- 各ファイル・ディスクリプターに関する情報を別々に入手するために対話式で呼び出す。 または
- ファイル・ディスクリプターの合計数を得るために 1 回呼び出し、 すべてのファイル・ディスクリプターに関する情報を同時に得るためにもう 1 回呼び出す。
プラグインが非 NULL の infop バッファーを渡す場合、dbx は、*indexp で参照されているファイル・ディスクリプターから始まる、*countp で要求される数のエントリーをバッファーに記入します。
残っているエントリーの数よりも大きい *countp がプラグインから渡された場合、dbx は残りのエントリーをすべて取り出します。 dbx は、countp を更新して取り出したエントリーの実際の数を反映し、indexp を更新して次のモジュール索引を反映します。 最後のファイル・ディスクリプターが取り出されると、indexp は -1 に設定されます。 プラグインが NULL の infop バッファーを渡した場合でも、 indexp と countp はこれまでどおり更新されます。つまり、 infop が非 NULL であった場合と変わりません。
typedef int (*dbx_plugin_fds_service_t)(dbx_plugin_session_t session,
dbx_plugin_fdinfo_t *infop,
size_t fdinfo_size,
unsigned int *indexp,
unsigned int *countp)dbx fds コールバック・ルーチンのパラメーターは次のとおりです。
- パラメーター
- 説明
- session
- セッション ID。
- infop
- dbx_plugin_fdinfo_t 構造の割り振り済みの配列であるか、または NULL。
- fdinfo_size
- 単一の dbx_plugin_fdinfo_t 構造のサイズ。
- indexp
- 先頭/次のファイル・ディスクリプター (ゼロは最初のファイル・ディスクリプターに対応します)。
- countp
- ファイル・ディスクリプターの数。
- DBX_PLUGIN_SUCCESS
- DBX_PLUGIN_BAD_SESSION - session は有効ではありません。
- DBX_PLUGIN_BAD_POINTER - indexp は NULL であるか、または countp が NULL です。
- DBX_PLUGIN_BAD_ARG - fdinfo_size が有効でないか、または * countp == 0。
- DBX_PLUGIN_UNAVAILABLE - プロセスはアクティブではないか、またはメモリー内に情報がありません。
modules
- 各モジュールに関する情報を別々に入手するために対話式で呼び出す。 または
- モジュールの合計数を得るために 1 回呼び出し、 すべてのモジュールに関する情報を同時に得るためにもう 1 回呼び出す。
プラグインが非 NULL の infop バッファーを渡す場合、 dbx は、*indexp で参照されているモジュールからはじめて、 *countp に要求されている数のエントリーをバッファーに入れます。
-1 に設定されます。 プラグインが NULL の infop バッファーを渡した場合でも、indexp と countp はこれまでどおり更新されます。つまり、infop が非 NULL であった場合と変わりません。 typedef int (*dbx_plugin_modules_service_t)(dbx_plugin_session_t session,
dbx_plugin_modinfo_t *infop,
size_t modinfo_size,
unsigned int *indexp,
unsigned int *countp)dbx modules コールバック・ルーチンのパラメーターは次のとおりです。
- パラメーター
- 説明
- session
- セッション ID。
- infop
- dbx_plugin_modinfo_t 構造の割り振り済みの配列であるか、または NULL。
- modinfo_size
- 単一の dbx_plugin_modinfo_t 構造のサイズ。
- indexp
- 先頭/次のモジュール (ゼロは最初のモジュールに対応します)。
- countp
- モジュールの数。
- DBX_PLUGIN_SUCCESS
- DBX_PLUGIN_BAD_SESSION - session は有効ではありません。
- DBX_PLUGIN_BAD_POINTER - indexp は NULL であるか、または countp が NULL です。
- DBX_PLUGIN_BAD_ARG - modinfo_size が有効でないか、または * countp == 0。
regions
dbx regions コールバック・ルーチンは、プロセスのメモリー領域に関する情報を入手するのに役立ちます。
- メイン・スレッド・スタック領域 (DBX_PLUGIN_REGION_STACK)
- ユーザー・データ領域 (DBX_PLUGIN_REGION_DATA)
- プロセスのプライベート・データ領域 (DBX_PLUGIN_REGION_SDATA)
- メモリーのマップ先の領域 (DBX_PLUGIN_REGION_MMAP)
- 共用メモリー領域 (DBX_PLUGIN_REGION_SHM)
- 1 つの領域に関する情報を別途入手するために対話式で呼び出す。 または
- 領域の合計数を得るために 1 回呼び出し、 すべての領域に関する情報を同時に得るためにもう 1 回呼び出す。
プラグインが非 NULL の infop バッファーを渡す場合、dbx は、*indexp で参照されている領域から始まる、*countp で要求される数のエントリーをバッファーに記入します。
残っているエントリーの数よりも大きい *countp がプラグインから渡された場合、 dbx は残りのエントリーをすべて取り出します。 dbx は、countp を更新して、取り出したエントリーの実際の数を反映し、 indexp を更新して、次の領域索引を反映します。
typedef int (*dbx_plugin_regions_service_t)(dbx_plugin_session_t session,
dbx_plugin_reginfo_t *infop,
size_t reginfo_size,
unsigned int *indexp,
unsigned int *countp)dbx regions コールバック・ルーチンのパラメーターは次のとおりです。
- パラメーター
- 説明
- session
- セッション ID。
- infop
- dbx_plugin_region_t 構造の割り振り済みの配列であるか、または NULL。
- reginfo_size
- 単一の dbx_plugin_reginfo_t 構造のサイズ。
- indexp
- 先頭/次の領域 (ゼロは最初の領域に対応します)。
- countp
- 領域の数。
- DBX_PLUGIN_SUCCESS
- DBX_PLUGIN_BAD_SESSION - session は有効ではありません。
- DBX_PLUGIN_BAD_POINTER - indexp は NULL であるか、または countp が NULL です。
- DBX_PLUGIN_BAD_ARG - reginfo_size が有効でないか、または * countp == 0。
- DBX_PLUGIN_UNAVAILABLE - セッションはライブ・プロセスを表し、領域にはアクセスできません。
スレッド
dbx threads コールバック・ルーチンは、 プロセス中のカーネル・スレッドに関する情報を入手するのに役立ちます。
- 1 つのスレッドに関する情報を別途入手するために対話式で呼び出す。 または
- スレッドの合計数を得るために 1 回呼び出し、 すべてのスレッドに関する情報を同時に得るためにもう 1 回呼び出す。
プラグインが非 NULL の infop バッファーを渡す場合、dbx は、*indexp で参照されているスレッドから始まる、*countp で要求される数のエントリーをバッファーに記入します。
残っているエントリーの数よりも大きいかまたは等しい *countp がプラグインから渡された場合、 dbx は残りのエントリーをすべて取り出して、countp を更新し、 取り出したエントリーの実際の数を反映します。
プラグインが NULL の infop バッファーを渡した場合でも、indexp と countp は更新されます。つまり、infop が非 NULL であった場合と変わりありません。
typedef int (*dbx_plugin_threads_service_t)(dbx_plugin_session_t session,
dbx _plugin_thrdinfo_t *infop,
size_t thrdinfo_size,
tid64_t *indexp,
unsigned int *countp)dbx threads コールバック・ルーチンのパラメーターは次のとおりです。
- パラメーター
- 説明
- session
- セッション ID。
- infop
- dbx_plugin_thrdinfo_t 構造の割り振り済みの配列であるか、または NULL。
- thrdinfo_size
- 単一の dbx_plugin_thrdinfo_t 構造のサイズ。
- indexp
- 先頭/次のスレッド ID (ただし、入力時のゼロは最初のスレッドに対応します)。
- countp
- スレッドの数。
- DBX_PLUGIN_SUCCESS
- DBX_PLUGIN_BAD_SESSION - session は有効ではありません。
- DBX_PLUGIN_BAD_POINTER - indexp は NULL であるか、または countp が NULL です。
- DBX_PLUGIN_BAD_ID - *indexp は有効な ID ではありません。
- DBX_PLUGIN_BAD_ARG - thrdinfo_size は有効ではないか、または *countp ==0。
- DBX_PLUGIN_UNAVAILABLE - プロセスはアクティブではないか、またはメモリー内にエントリーがありません。
pthreads
dbx pthreads コールバック・ルーチンは、すべてのカーネル・スレッドの関係も含め、 プロセス内の pthread に関する情報を入手するのに役立ちます。
- 1 つの pthread に関する情報を別途入手するために対話式で呼び出す。 または
- pthread の合計数を得るために 1 回呼び出し、 すべての pthread に関する情報を同時に得るためにもう 1 回呼び出す。
プラグインが非 NULL の infop バッファーを渡した場合、dbx は、*indexp で参照されている pthread から始まる、*countp で要求される数のエントリーをバッファーに記入します。
残っているエントリーの数よりも大きい *countp がプラグインから渡された場合、 dbx は残りのエントリーをすべて取り出します。 dbx は、countp を更新して、取り出したエントリーの実際の数を反映し、 indexp を更新して、次の要求の pthread ハンドルを反映します。
最後のエントリーが取り出されると、indexp は -1 に設定されます。 プラグインが NULL の infop バッファーを渡した場合でも、 indexp と countp はこれまでどおり更新されます。つまり、 infop が非 NULL であった場合と変わりません。
最初の pthread を要求した場合に、countp がゼロに更新されると、 そのプロセスは pthread 化されません。
typedef int (*dbx_plugin_pthreads_service_t)(dbx_plugin_session_t session,
dbx_plugin_pthinfo_t *infop,
size_t pthrdinfo_size,
pthdb_pthread_t *indexp,
unsigned int *countp)dbx pthreads コールバック・ルーチンのパラメーターは次のとおりです。
- パラメーター
- 説明
- session
- セッション ID。
- infop
- dbx_plugin_pthinfo_t 構造の割り振り済みの配列であるか、または NULL。
- pthrdinfo_size
- 単一の dbx_plugin_pthrdinfo_t 構造のサイズ。
- indexp
- 先頭/次の pthread ハンドル (ただし、入力時のゼロは最初の pthread に対応し、 DBX_PLUGIN_PTHREAD_CURRENT は dbx 内の現在の pthread に対応します)。
- countp
- pthread の数。
- DBX_PLUGIN_SUCCESS
- DBX_PLUGIN_BAD_SESSION - session は有効ではありません。
- DBX_PLUGIN_BAD_POINTER - indexp は NULL であるか、または countp が NULL です。
- DBX_PLUGIN_BAD_ARG - pthrdinfo_size は有効でないか、または * countp == 0。
get_thread_context
dbx get_thread_context コールバック・ルーチンは、 カーネル・スレッドの一般用途、特殊用途、および浮動小数点レジスターを読み取る手段になります。 dbx は、contextp パラメーターにデータを取り込みます。
typedef int (*dbx_plugin_reg_service_t)(dbx_plugin_session_t session,
uint64_t reg_flags,
uint64_t id,
dbx_plugin_context_t *contextp,
size_t context_size)dbx get_thread_context コールバック・ルーチンのパラメーターは次のとおりです。
- パラメーター
- 説明
- session
- セッション ID。
- reg_flags
- DBX_PLUGIN_REG_GPRS、DBX_PLUGIN_REG_SPRS、DBX_PLUGIN_REG_FPRS、 DBX_PLUGIN_REG_EXT のうちの少なくとも 1 つの論理 OR。
- id
- カーネル・スレッドの tid (tid64_t)。
- contextp
- 割り振り済みの dbx_plugin_context_t 構造
- context_size
- dbx_plugin_context_t 構造のサイズ。 DBX_PLUGIN_REG_EXT レジスター・フラグが使用される場合、dbx_plugin_extctx_t 構造のサイズも使用されることになります。 dbx_plugin_extctx_t 構造は dbx_plugin_context_t 構造を拡張したバージョンです。
- DBX_PLUGIN_SUCCESS。
- DBX_PLUGIN_BAD_SESSION - session は有効ではありません。
- DBX_PLUGIN_BAD_ID - id は有効ではありません。
- DBX_PLUGIN_BAD_ARG - reg_flags は有効ではないか、または context_size は有効ではありません。
- DBX_PLUGIN_BAD_POINTER - contextp は NULL です。
- DBX_PLUGIN_UNAVAILABLE - プロセスはアクティブではないか、 またはスレッドはカーネル・モードであるのにレジスターにアクセスできません。
set_thread_context
dbx set_thread_context コールバック・ルーチンは、 カーネル・スレッドの一般用途、特殊用途、および浮動小数点レジスターに書き込む手段になります。
typedef int (*dbx_plugin_reg_service_t) (dbx_plugin_session_t session,
uint64_t reg_flags,
uint64_t id,
dbx_plugin_context_t *contextp,
size_t context_size)dbx set_thread_context コールバック・ルーチンのパラメーターは次のとおりです。
- パラメーター
- 説明
- session
- セッション ID。
- reg_flags
- DBX_PLUGIN_REG_GPRS、DBX_PLUGIN_REG_SPRS、DBX_PLUGIN_REG_FPRS、 DBX_PLUGIN_REG_EXT のうちの少なくとも 1 つの論理 OR。
- id
- カーネル・スレッドの tid (tid64_t)。
- contextp
- 割り振り済みの dbx_plugin_context_t 構造
- context_size
- dbx_plugin_context_t 構造のサイズ。 DBX_PLUGIN_REG_EXT レジスター・フラグが使用される場合、dbx_plugin_extctx_t 構造のサイズも使用されることになります。 dbx_plugin_extctx_t 構造は dbx_plugin_context_t 構造を拡張したバージョンです。
- DBX_PLUGIN_SUCCESS
- DBX_PLUGIN_BAD_SESSION - session は有効ではありません。
- DBX_PLUGIN_BAD_ID - id は有効ではありません。
- DBX_PLUGIN_BAD_ARG - reg_flags は有効ではないか、または context_size は有効ではありません。
- DBX_PLUGIN_BAD_POINTER - contextp は NULL です。
- DBX_PLUGIN_UNAVAILABLE - プロセスはアクティブではないか、 またはスレッドはカーネル・モードであるのにレジスターにアクセスできません。
get_pthread_context
dbx get_pthread_context コールバック・ルーチンは、pthread の一般用途、特殊用途、および浮動小数点レジスターを読み取る手段になります。 dbx は、contextp パラメーターにデータを取り込みます。
typedef int (*dbx_plugin_reg_service_t)(dbx_plugin_session_t session,
uint64_t reg_flags,
uint64_t id,
dbx_plugin_context_t *contextp,
size_t context_size)dbx get_pthread_context コールバック・ルーチンのパラメーターは次のとおりです。
- パラメーター
- 説明
- session
- セッション ID。
- reg_flags
- DBX_PLUGIN_REG_GPRS、DBX_PLUGIN_REG_SPRS、DBX_PLUGIN_REG_FPRS、 DBX_PLUGIN_REG_EXT のうちの少なくとも 1 つの論理 OR。
- id
- pthread のハンドル (pthdb_pthread_t)。
- contextp
- 割り振り済みの dbx_plugin_context_t 構造
- context_size
- dbx_plugin_context_t 構造のサイズ。 DBX_PLUGIN_REG_EXT レジスター・フラグが使用される場合、dbx_plugin_extctx_t 構造のサイズも使用されることになります。 dbx_plugin_extctx_t 構造は dbx_plugin_context_t 構造を拡張したバージョンです。
- DBX_PLUGIN_SUCCESS
- DBX_PLUGIN_BAD_SESSION - session は有効ではありません。
- DBX_PLUGIN_BAD_ID - id は有効ではありません。
- DBX_PLUGIN_BAD_ARG - reg_flags は有効ではないか、または context_size は有効ではありません。
- DBX_PLUGIN_BAD_POINTER - contextp は NULL です。
- DBX_PLUGIN_UNAVAILABLE - プロセスはアクティブではないか、 またはスレッドはカーネル・モードであるのにレジスターにアクセスできません。
set_pthread_context
dbx set_pthread_context コールバック・ルーチンは、 pthread の一般用途、特殊用途、および浮動小数点レジスターに書き込む手段になります。
typedef int (*dbx_plugin_reg_service_t)(dbx_plugin_session_t session,
uint64_t reg_flags,
uint64_t id,
dbx_plugin_context_t *contextp,
size_t context_size)dbx set_pthread_context コールバック・ルーチンのパラメーターは次のとおりです。
- パラメーター
- 説明
- session
- セッション ID。
- reg_flags
- DBX_PLUGIN_REG_GPRS、DBX_PLUGIN_REG_SPRS、DBX_PLUGIN_REG_FPRS、 DBX_PLUGIN_REG_EXT のうちの少なくとも 1 つの論理 OR。
- id
- pthread のハンドル (pthdb_pthread_t)。
- contextp
- 割り振り済みの dbx_plugin_context_t 構造
- context_size
- dbx_plugin_context_t 構造のサイズ。 DBX_PLUGIN_REG_EXT レジスター・フラグが使用される場合、dbx_plugin_extctx_t 構造のサイズも使用されることになります。 dbx_plugin_extctx_t 構造は dbx_plugin_context_t 構造を拡張したバージョンです。
- DBX_PLUGIN_SUCCESS
- DBX_PLUGIN_BAD_SESSION - session は有効ではありません。
- DBX_PLUGIN_BAD_ID - id は有効ではありません。
- DBX_PLUGIN_BAD_ARG - reg_flags は有効ではないか、または context_size は有効ではありません。
- DBX_PLUGIN_BAD_POINTER - contextp は NULL です。
- DBX_PLUGIN_UNAVAILABLE - プロセスはアクティブではないか、 または pthread に関係付けられたカーネル・スレッドはカーネル・モードであるのでレジスターにアクセスできません。
read_memory
dbx read_memory コールバック・ルーチンを使うと、 プロセスのアドレス・スペースからの読み取りが可能になります。 dbx は、バッファー・パラメーターにデータを取り込みます。
typedef int (*dbx_plugin_mem_service_t)(dbx_plugin_session_t session,
uint64_t addr,
void *buffer,
size_t len)dbx read_memory コールバック・ルーチンのパラメーターは次のとおりです。
- パラメーター
- 説明
- session
- セッション ID。
- addr
- 読み取り対象のアドレス。
- buffer
- メモリー内容を収容するために割り振られたバッファー。
- len
- 読み取るバイト数。
- DBX_PLUGIN_SUCCESS
- DBX_PLUGIN_BAD_SESSION - session は有効ではありません。
- DBX_PLUGIN_BAD_POINTER - buffer は NULL です。
- DBX_PLUGIN_UNAVAILABLE - addr から読み取れません。
write_memory
dbx write_memory コールバック・ルーチンを使うと、 プロセスのアドレス・スペースへの書き込みが可能になります。
typedef int (*dbx_plugin_mem_service_t)(dbx_plugin_session_t session,
uint64_t addr,
void *buffer,
size_t len)dbx write_memory コールバック・ルーチンのパラメーターは次のとおりです。
- パラメーター
- 説明
- session
- セッション ID。
- addr
- 書き込み先のアドレス。
- buffer
- 割り振りと初期化済みのバッファー。
- len
- 書き込むバイト数。
- DBX_PLUGIN_SUCCESS
- DBX_PLUGIN_BAD_SESSION - session は有効ではありません。
- DBX_PLUGIN_BAD_POINTER - buffer は NULL です。
- DBX_PLUGIN_UNAVAILABLE - addr に書き込めません。
locate_symbol
dbx locate_symbol コールバック・ルーチンを使うと、シンボル名をアドレスに変換することができます。
プラグインは、シンボル・パラメーター配列内の各エントリーの name フィールドと mod フィールドを初期化するはずです。 name フィールドは、見つけ出すシンボルの名前を指定します。 mod フィールドは、 ルックアップが行われる場所であるモジュールのモジュール索引を指定します。 mod フィールドが -1 に初期化された場合、すべてのモジュールを検索する必要があることを示します。
dbx は、addr フィールドにデータを取り込みます。 不明のシンボルにはすべてゼロのシンボルが付いています。 シンボルが見つかって、すべてのモジュールが検索されると、 dbx は、シンボルの実際のモジュール索引にあわせて mod フィールドを更新します。
typedef int (*dbx_plugin_sym_service_t)(dbx_plugin_session_t session,
dbx_plugin_sym_t *symbols,
size_t syminfo_size,
unsigned int count)dbx locate_symbol コールバック・ルーチンのパラメーターは次のとおりです。
- パラメーター
- 説明
- session
- セッション ID。
- symbols
- name フィールドと mod フィールドを初期化された dbx_plugin_sym_t 構造の割り振り済みの配列。
- syminfo_size
- dbx_plugin_sym_t 構造のサイズ。
- count
- 見つけるシンボル数。
- DBX_PLUGIN_SUCCESS
- DBX_PLUGIN_BAD_SESSION - session は有効ではありません。
- DBX_PLUGIN_BAD_ARG - syminfo_size は有効ではありません。
- DBX_PLUGIN_BAD_POINTER - symbols は NULL です。
what_function
dbx what_function コールバック・ルーチンを使うと、 テキスト・アドレスをシンボルに変換することができます。
プラグインは、シンボル・パラメーター配列内の各エントリーの addr フィールドを初期化します。 addr フィールドは、識別する関数内の命令アドレスを指定します。
dbx は、name フィールドにデータを取り込みます。 不明のテキスト・アドレスにはすべて、NULL の名前が付きます。 dbx は、テキスト・アドレスの実際のモジュール索引を mod フィールドに取り込みます。
typedef int (*dbx_plugin_sym_service_t)(dbx_plugin_session_t session,
dbx_plugin_sym_t *symbols,
size_t syminfo_size,
unsigned int count)dbx what_function コールバック・ルーチンのパラメーターは次のとおりです。
- パラメーター
- 説明
- session
- セッション ID。
- symbols
- テキスト・アドレスを使って addr フィールドを初期化された dbx_plugin_sym_t 構造の割り振り済みの配列。
- syminfo_size
- dbx_plugin_sym_t 構造のサイズ。
- count
- 変換するアドレスの数。
- DBX_PLUGIN_SUCCESS
- DBX_PLUGIN_BAD_SESSION - session は有効ではありません。
- DBX_PLUGIN_BAD_ARG - syminfo_size は有効ではありません。
- DBX_PLUGIN_BAD_POINTER - symbols は NULL です。
dbx print コールバック・ルーチンを使うと、通知出力またはエラー出力を表示することができます。
typedef int (*dbx_plugin_print_service_t)(dbx_plugin_session_t session,
int print_mode,
char *message)dbx print コールバック・ルーチンのパラメーターは次のとおりです。
- パラメーター
- 説明
- session
- セッション ID。
- print_mode
- DBX_PLUGIN_PRINT_MODE_OUT または DBX_PLUGIN_PRINT_MODE_ERR。
- message
- dbx が表示する文字列。
- DBX_PLUGIN_SUCCESS
- DBX_PLUGIN_BAD_SESSION - session は有効ではありません。
- DBX_PLUGIN_BAD_ARG - print_mode は有効ではありません。
- DBX_PLUGIN_BAD_POINTER - message は NULL です。
alias
dbx alias コールバック・ルーチンを使うと、プラグイン・サブコマンドの別名を作成することができます。
plugin dbx サブコマンドの構文では、dbx ユーザーは、各プラグイン・サブコマンドの呼び出しごとに plugin Name の接頭部を入力する必要があります。
そのような呼び出しを短縮する手段として、
dbx ではプラグインに新規の別名を作成することができます。
alias パラメーターと expansion パラメーターは、新規の別名の記述を指定します。 その構文は、alias dbx サブコマンドで定義されている構文と同じです。
alias("intprt", "plugin xyz interpret");alias("intprt2(addr, count, format)", "addr / count format; plugin xyz interpret addr");typedef int (*dbx_plugin_alias_service_t)(dbx_plugin_session_t session,
const char *alias,
const char *expansion)dbx alias コールバック・ルーチンのパラメーターは次のとおりです。
- パラメーター
- 説明
- session
- セッション ID。
- alias
- 別名とオプショナル・パラメーターを表す文字列。
- expansion
- 別名の拡張を表す文字列。
- DBX_PLUGIN_SUCCESS
- DBX_PLUGIN_BAD_SESSION - session は有効ではありません。
- DBX_PLUGIN_BAD_ARG - alias は有効ではありません。
- DBX_PLUGIN_BAD_POINTER - alias は NULL であるか、または expansion が NULL です。
- DBX_PLUGIN_UNAVAILABLE - 同じ名前の付いた別名が既に存在しています。
例
- 以下の例は、help サブコマンドと hello サブコマンドを定義します。
example.c: #include <sys/dbx_plugin.h> dbx_plugin_session_t sid; dbx_plugin_services_t dbx; static void usage(void); static void hello_cmd(void); int dbx_plugin_version(void) { return DBX_PLUGIN_VERSION_1; } int dbx_plugin_session_init(dbx_plugin_session_t session, const dbx_plugin_services_t *servicep) { /* record session identifier */ sid= session; /* record dbx service */ memcpy(&dbx, servicep, sizeof(dbx_plugin_services_t)); (*(dbx.alias))(sid, "hello", "plugin example hello"); (*(dbx.alias))(sid, "help", "plugin example help"); return 0; } void dbx_plugin_session_command(dbx_plugin_session_t session, int argc, char *const argv[]) { if (argc == 0 || (argc == 1 && strcmp(argv[0], "help") == 0)) { usage(); return; } if (argc == 1 && strcmp(argv[0], "hello") == 0) { hello_cmd(); return; } (*(dbx.print))(sid,DBX_PLUGIN_PRINT_MODE_ERR, "unrecognized command¥n"); } void dbx_plugin_session_event(dbx_plugin_session_t session, int event, dbx_plugin_event_info_t *event_infop) { /* ignore event notifications */ } void dbx_plugin_session_destroy(dbx_plugin_session_t session){ /* no clean up to perform */ } static void usage(void) { (*(dbx.print))(sid,DBX_PLUGIN_PRINT_MODE_OUT, "Subcommands for Plug-in ¥"example¥":¥n¥n" ¥ " help - displays this output¥n" ¥ " hello - displays a greeting¥n" ¥ "¥n"); } static void hello_cmd(void) { (*(dbx.print))(sid,DBX_PLUGIN_PRINT_MODE_OUT, "Hello dbx World!¥n"); }example.exp: dbx_plugin_version dbx_plugin_session_init dbx_plugin_session_command dbx_plugin_session_event dbx_plugin_session_destroy - このサンプル・プラグインをコンパイルするには、次のように入力します。
cc -q64 -o libdbx_example.so example.c -bM:Sre -bE:example.exp -bnoentry