dbx プラグイン・フレームワーク用の開発

dbx は、新規の dbx サブコマンドとイベント・ハンドラーを追加したいと考えている開発者用のプラグイン・フレームワークとして機能します。

どの dbx ユーザーでも、アプリケーションまたはライブラリーに固有のコマンドをデバッグ中に利用して、dbx を拡張するプラグインを作成することができます。
注:
  1. デフォルトの dbx コマンドは 64 ビット・プロセスであるため、dbx コマンドと一緒に使用するには、すべてのプラグインを 64 ビットにコンパイルする必要があります。 32 ビットのプラグインをロードするには、32 ビット版の dbx コマンドである dbx32 コマンドを使用します。
  2. dbx コールバック・ルーチンプラグイン・インターフェース・ルーチンを混同しないよう気を付けなければなりません。
  3. dbx コールバック・ルーチンとは、プラグイン用に dbx に備えられた一連のサービスのことです。 このプラグインは、一連の関数ポインターを介してそのようなルーチンにアクセスすることができます。
  4. プラグイン・インターフェース・ルーチンとは、プラグインによってインプリメントされるために dbx に必要な一連のメソッドのことです。

ファイル・フォーマット

すべてのプラグインは、共用オブジェクト・ファイルでなければなりません。

命名

dbx では、サブコマンド入力を正しくリダイレクトするには、 どのプラグインにも固有名 が付いていなければなりません。

プラグインのファイル名によって、この固有名が dbx に伝えられます。 dbx は、初期化と同時に、一連の事前定義およびユーザー指定のディレクトリーの中で、 以下の正規表現に一致するベース・ネームの付いたファイルを検索します。
^libdbx_.+¥.so$
以下の表は、dbx プラグインに対する有効なファイル名と無効なファイル名の例を示しています。 有効な例ではすべて、対応する固有名 も示してあります。
ファイル名 有効かどうか 固有名
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

dbx では、 DBX_PLUGIN_PATH 環境変数を使って検索するディレクトリーのリストを指定することができます。 このリストでは各ディレクトリーをコロンで区切る必要があります。 以下の例では、2 つのディレクトリーがコロンで区切られています。
$ export dbx_PLUGIN_PATH=$HOME/dbx_plugins:/mnt/share/dbx_plugins
dbx は、初期化と同時にプラグインを検索します。 また、dbx は、実行可能ファイル (分かっている場合) のディレクトリーも検索します。 このディレクトリーは、ユーザー定義のディレクトリーの検索後に検索されます。
注: プロセスを付加するのに dbx を使用すると、 実行可能ファイルの絶対パスを判別することはできません。

ロード

以下の方法のいずれかでプラグインをロードすることができます。
  • プラグインは、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.

アンロード

pluginunload dbx サブコマンドに対してプラグインの名前を指定すれば、 どのようにロードされたものかに関係なく、どのプラグインでも手動でアンロードすることができます。 プラグインのアンロードが正常に完了した後、以下のようなメッセージが表示されます。
(dbx) pluginunload sample 
plug-in "/home/user/dbx_plugins/libdbx_sample.so" unloaded.

バージョン管理

他の場合であれば既存のプラグインと以前のバージョンのプラグインとの 互換性をなくすはずの変更をプラグイン・フレームワークに加える場合、 新規のバージョン ID が作成されます。このプロセスは、 プラグイン・インターフェースまたはプラグイン dbx コールバック・ルーチンに 重大な変更や追加を行う場合すべてに当てはまります。

プラグイン・バージョンを頻繁に変更する必要性を最小化するには、 いくつかのプラグイン dbx コールバック・ルーチン で、バッファーのサイズを表す追加のパラメーターが必要になります。 この手法は、dbx によってサイズが制御されないシステム構造に基づいたバッファー・パラメーターの場合、使用します。 これで、プラグイン・バージョンを更新しなくても、システム構造のサイズを変更できるようになります。

現在、唯一のバージョン ID は DBX_PLUGIN_VERSION_1 です。

ヘッダー・ファイル

dbx プラグインの開発者を対象に、 関数プロトタイプ、データ構造定義、およびマクロ定義が以下のヘッダー・ファイルに置かれています。
/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 などがあります。) このルーチンを使用して dbxarg0 から 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)

このルーチンは、アプリケーション・プログラム・イベントに対する応答として、 プラグインが必要とするすべての内部処理を実行する必要があります。 このルーチンは、各イベントの発生のたびに dbx によって 1 回起動されます。 以下の表は、 プラグインに通知されるイベントのタイプを説明しています。
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 セッションの特性を取得するのに役立ちます。 dbxflagsp パラメーター内に埋め込まれます。

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 session コールバック・ルーチンの戻りコードは次のとおりです。
  • 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 process コールバック・ルーチンの戻りコードは次のとおりです。
  • DBX_PLUGIN_SUCCESS
  • DBX_PLUGIN_BAD_SESSION - session は有効ではありません。
  • DBX_PLUGIN_BAD_POINTER - infop は NULL です。
  • DBX_PLUGIN_BAD_ARG - procinfo_size は有効ではありません。
  • DBX_PLUGIN_UNAVAILABLE - プロセスはアクティブではないか、またはメモリー内に情報がありません。

fds

dbx fds コールバック・ルーチンは、 プロセスのファイル・ディスクリプターに関する情報を入手するのに役立ちます。 以下のいずれかを行うことができます。
  • 各ファイル・ディスクリプターに関する情報を別々に入手するために対話式で呼び出す。 または
  • ファイル・ディスクリプターの合計数を得るために 1 回呼び出し、 すべてのファイル・ディスクリプターに関する情報を同時に得るためにもう 1 回呼び出す。

プラグインが非 NULL の infop バッファーを渡す場合、dbx は、*indexp で参照されているファイル・ディスクリプターから始まる、*countp で要求される数のエントリーをバッファーに記入します。

残っているエントリーの数よりも大きい *countp がプラグインから渡された場合、dbx は残りのエントリーをすべて取り出します。 dbx は、countp を更新して取り出したエントリーの実際の数を反映し、indexp を更新して次のモジュール索引を反映します。 最後のファイル・ディスクリプターが取り出されると、indexp は -1 に設定されます。 プラグインが NULL の infop バッファーを渡した場合でも、 indexpcountp はこれまでどおり更新されます。つまり、 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 fds コールバック・ルーチンの戻りコードは次のとおりです。
  • 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

dbx modules コールバック・ルーチンは、 プロセスのロード済みモジュールに関する情報を入手するのに役立ちます。 以下のいずれかを行うことができます。
  • 各モジュールに関する情報を別々に入手するために対話式で呼び出す。 または
  • モジュールの合計数を得るために 1 回呼び出し、 すべてのモジュールに関する情報を同時に得るためにもう 1 回呼び出す。

プラグインが非 NULL の infop バッファーを渡す場合、 dbx は、*indexp で参照されているモジュールからはじめて、 *countp に要求されている数のエントリーをバッファーに入れます。

残っているエントリーの数よりも大きい *countp がプラグインから渡された場合、 dbx は残りのエントリーをすべて取り出します。 dbx は、countp を更新して、取り出したエントリーの実際の数を反映し、 indexp を更新して、次のモジュール索引を反映します。 最後のモジュールが取り出されると、indexp-1 に設定されます。 プラグインが NULL の infop バッファーを渡した場合でも、indexpcountp はこれまでどおり更新されます。つまり、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 modules コールバック・ルーチンの戻りコードは次のとおりです。
  • 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 を更新して、次の領域索引を反映します。

最後の領域が取り出されると、indexp は -1 に設定されます。 プラグインが NULL の infop バッファーを渡した場合でも、 indexpcountp はこれまでどおり更新されます。つまり、 infop が非 NULL であった場合と変わりません。
注: 現在このルーチンは、コア・ファイルを表すセッション用にのみインプリメントされています。 ライブ・プロセスを表すセッションに対して、dbx で利用できる十分な情報はありません。 そのようなセッションを呼び出すと、DBX_PLUGIN_UNAVAILABLE が戻されます。
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 regions コールバック・ルーチンの戻りコードは次のとおりです。
  • 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 を更新し、 取り出したエントリーの実際の数を反映します。

最後のエントリーが取り出されたときに countp の値が渡された値よりも小さくなった場合、 indexp は -1 に設定されます。 そうでなければ、次の要求のスレッド ID を反映するように indexp が更新されます。
注: 渡された countp の値が使用可能なエントリーの数と等しい場合、countp は同じままになりますが、indexp は -1 に設定されません。

プラグインが NULL の infop バッファーを渡した場合でも、indexpcountp は更新されます。つまり、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 threads コールバック・ルーチンの戻りコードは次のとおりです。
  • 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 バッファーを渡した場合でも、 indexpcountp はこれまでどおり更新されます。つまり、 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 pthreads コールバック・ルーチンの戻りコードは次のとおりです。
  • 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 get_thread_context コールバック・ルーチンの戻りコードは次のとおりです。
  • 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 set_thread_context コールバック・ルーチンの戻りコードは次のとおりです。
  • 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 get_pthread_context コールバック・ルーチンの戻りコードは次のとおりです。
  • 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 set_pthread_context コールバック・ルーチンの戻りコードは次のとおりです。
  • 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 read_memory コールバック・ルーチンの戻りコードは次のとおりです。
  • 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 write_memory コールバック・ルーチンの戻りコードは次のとおりです。
  • 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 locate_symbol コールバック・ルーチンの戻りコードは次のとおりです。
  • 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 what_function コールバック・ルーチンの戻りコードは次のとおりです。
  • DBX_PLUGIN_SUCCESS
  • DBX_PLUGIN_BAD_SESSION - session は有効ではありません。
  • DBX_PLUGIN_BAD_ARG - syminfo_size は有効ではありません。
  • DBX_PLUGIN_BAD_POINTER - symbols は NULL です。

print

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 print コールバック・ルーチンの戻りコードは次のとおりです。
  • 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 サブコマンドで定義されている構文と同じです。

以下に、dbx alias コールバック・ルーチンを呼び出す例を示します。
alias("intprt", "plugin xyz interpret");
alias("intprt2(addr, count, format)", "addr / count format; plugin xyz interpret addr");
注: 既存の別名と同名の別名を作成した場合、 その要求は拒否されて、警告メッセージが表示されます。 ユーザーが別名の競合を解決できるような方法で別名を作成するよう、プラグイン開発者に対してお勧めします。 プラグインと一緒にパッケージに入れられた構成ファイルから別名定義を読み取るのが、 そのような方法の 1 つです。
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 alias コールバック・ルーチンの戻りコードは次のとおりです。
  • DBX_PLUGIN_SUCCESS
  • DBX_PLUGIN_BAD_SESSION - session は有効ではありません。
  • DBX_PLUGIN_BAD_ARG - alias は有効ではありません。
  • DBX_PLUGIN_BAD_POINTER - alias は NULL であるか、または expansion が NULL です。
  • DBX_PLUGIN_UNAVAILABLE - 同じ名前の付いた別名が既に存在しています。

  1. 以下の例は、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
  2. このサンプル・プラグインをコンパイルするには、次のように入力します。
    cc -q64 -o libdbx_example.so example.c -bM:Sre -bE:example.exp -bnoentry