dbx コマンドによるデバッグ

起動手順

あらかじめ読み込まれた共有オブジェクトにブレークポイントを置くためには、ルーチンのアドレスを dbx に知らせる必要があり、dbx がルーチンのアドレスを知るためには、共有オブジェクトのベースアドレスを知らなければなりません。たとえば次のような作業を行うとします。


stop in printf
run

このような単純な作業でも、dbx には特別な配慮が必要です。新しいプログラムが読み込まれるたびに 、dbxrtld がリンクマップの作成を完了した場所までプログラムを自動的に実行します。dbx はリンクマップを読み取り、ベースアドレスを格納します。その後、プロセスは終了し、メッセージとプロンプトが表示されます。dbx は、これらの動作中にメッセージを表示しません。

この時点で、ベース読み込みアドレスとともに libc.so のシンボルテーブルを調べることができるため、printf のアドレスがわかります。

rtld によってリンクマップが作成されるのを待機し、リンクマップの先頭にアクセスするまでの dbx の動作を「rtld ハンドシェーク」と呼びます。rtld がリンクマップを作成し、dbx がすべてのシンボルテーブルを読み取ると、イベント syncrtld が発生します。

この方式では、dbx はプログラムの実行時、各共有ライブラリが同じベースアドレスに読み込まれていることを前提とします。ただし、プログラムを読み込んで実行するまでに LD_LIBRARY_PATH を変更した場合にかぎり、ライブラリは同じアドレスに読み込まれません。この変数が変更された場合、dbx は新しいアドレスのメッセージを出力しますが、変更後の共有オブジェクト内のブレークポイントが正しくない場合があります。