dbx は dlopen() または dlclose() の発生を自動的に検出し、読み込まれたオブジェクトの記号テーブルを読み込みます。dlopen() で共有オブジェクトを読み込むと、そのオブジェクトにブレークポイントを設定できます。またプログラムのその他の任意の場所で行う場合と同様にデバッグも可能です。
共有オブジェクトを dlclose() で読み込み解除しても、dbx はそのオブジェクトに設定されていたブレークポイントを記憶しているので、たとえアプリケーションを再実行しても、共有オブジェクトが dlopen() で再び読み込まれれば再びそのブレークポイントを設定し直します。
ただし、dlopen() で共有オブジェクトが読み込まれるのを待たなくても共有オブジェクトにブレークポイントを設定したり、その関数やソースコードを検索することはできます。デバッグするプログラムが dlopen() で読み込む共有オブジェクトの名前がわかっていれば、loadobject -load コマンドを使用してその記号テーブルをあらかじめ dbx に読み込んでおくことができます。
loadobject -load /usr/java1.1/lib/libjava_g.so |
これで、dlopen() で読み込む前でも、この読み込みオブジェクト内でモジュールと関数を検索してその中にブレークポイントを設定できます。読み込みオブジェクトの読み込みが済んだら、dbx はブレークポイントを自動的に設定します。
動的にリンクしたライブラリにブレークポイントを設定する場合、次の制約があります。
dlopen() で読み込んだ「フィルタ」ライブラリには、その中の最初の関数が呼び出されるまでブレークポイントは設定できません。
dlopen() でライブラリを読み込むと、初期化ルーチン _init() が呼び出されます。このルーチンがライブラリ内のほかのルーチンを呼び出すこともあります。この初期化が終了するまで、dbx は読み込んだライブラリにブレークポイントを設定できません。具体的には、dbx は、dlopen で読み込んだライブラリ内の _init() では停止できません。