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

RTC の 8M バイト制限

アクセス検査を実行するために、dbx の RTC 機能は各ロードおよびストア命令を、パッチ領域への分岐命令と置き換えます。この分岐命令の有効範囲は 8Mバイトです。これは、デバッグされたプログラムが、置き換えられた特定のロード/ストア命令の 8Mバイトのアドレス空間をすべて使いきってしまった場合、パッチ領域を保存する場所がなくなることを意味します。

RTC がメモリーへのすべてのロードおよびストアにまったく割り込めない場合、RTC は正確な情報を提供できないので完全に無効になります。リークのチェックは影響を受けません。

この制約にぶつかった場合、dbx は何らかの処置を施します。その結果、問題が修正できれば続行しますが、問題が修正できない場合は、エラーメッセージを表示しアクセス検査を終了します。

8Mバイトの制限にぶつかった場合

dbx には、8Mバイトの限界に達したユーザーのために、いくつかの回避策が用意されています。これらの回避策では、SUN WorkShop に含まれる rtc_patch_area と呼ばれるユーティリティを使用する必要があります。

このユーティリティは、ユーザーのプログラムにリンク可能なオブジェクトファイルまたは共有オブジェクトファイルを作成し、RTC が使用するパッチ領域を作成します。

実行可能イメージ内のすべてのロードおよびストア命令から 8Mバイト以内で、dbx がパッチ領域を見つけられない場合、考えられる原因は次の 2 つです。

ケース 1: 静的にリンクされた a.out ファイルが大きすぎる。

ケース 2: 動的にリンクされた共有ライブラリ (1 つ以上) が大きすぎる。

dbx はこの限界に達すると、どのくらいのパッチ領域が必要かを示すメッセージを出力して、該当するケース (ケース 1 または 2) を指示します。

ケース 1

ケース 1 では、rtc_patch_area を使用して、パッチ領域として機能する 1 つまたは複数のオブジェクトファイルを作成し、それらを a.out にリンクすることができます。

次のようなメッセージが表示されたら、以下の手順に従ってください。


実行時検査を有効にしています... dbx: warning: rtc: cannot find patch space within 8Mb (need 6490432 bytes for ./a.out)
dbx: patch area too far (8Mb limitation); Access checking disabled
         (See `help rtc8M', case 1)


rtc_patch_area -o patch.o -size 6490432 

-size フラグは任意指定です。デフォルト値は 8000000 です。

  1. エラーメッセージからのサイズ要求を満たしたら、次の手順に進みます。それ以外の場合は、手順 1 を繰り返して、さらに多くの .o ファイルを必要に応じて作成します。

  2. a.out を再リンクして、patch.o ファイルをリンク行に追加します。

  3. RTC を新しいバイナリで再試行します。

    それでも RTC が失敗する場合は、リンク行上の patch.o ファイルを再配置することができます。

代替手段として、a.out をより小さい a.out と共有ライブラリに分割する方法があります。

ケース 2

RTC を接続されたプロセスで実行する場合は、ケース 2a を参照してください。それ以外の場合、唯一の対策は、余分なパッチスペースを持つ共有ライブラリの再作成です。

次のようなメッセージが表示されたら、以下の手順に従ってください。


実行時検査を有効にしています... dbx: warning: rtc: cannot find patch space within 8Mb (need 563332 bytes for ./sh1.so)
dbx: patch area too far (8Mb limitation); Access checking disabled
         (See `help rtc8M', case 2)


rtc_patch_area -o patch.o -size 563332

-size フラグは任意指定です。デフォルト値は 8000000 です。

  1. エラーメッセージからのサイズ要求を満たしたら、次の手順に進みます。それ以外の場合は、手順 1 を繰り返して、さらに多くの .o ファイルを必要に応じて作成します。

  2. sh1.so を再リンクして、patch.o ファイルをリンク行に追加します。

  3. RTC を新しいバイナリで再試行します。dbx が、別の共有ライブラリに対してパッチスペースを要求する場合は、そのライブラリについて、手順 1 〜 手順 2 を繰り返します。

ケース 2a

ケース 2a では、dbx によって要求される共有ライブラリのパッチスペースが 8Mバイト以下の場合、rtc_patch_area を使用して、パッチ領域として機能する共有ライブラリを作成し、それを a.out にリンクすることができます。

次のようなメッセージが表示されたら、以下の手順に従ってください。


実行時検査を有効にしています... dbx: warning: rtc: cannot find patch space within 8Mb (need 563332 bytes for ./sh1.so)
dbx: patch area too far (8Mb limitation); Access checking disabled
         (See `help rtc8M', case 2)


rtc_patch_area -so patch1.so -size 563332

-size フラグは任意指定です。デフォルト値は 8000000 です。

  1. リンク行で sh1.so の隣に patch1.so を置いてプログラムを再リンクします。dbx が同じ sh1.so に対してさらにパッチスペースを要求する場合は、patch1.so を sh1.so の直前に入れてみてください。

    必要な共有ライブラリ順序を得るには、ld -l オプションではなくフルパス名を使用する必要があります。

  2. 新しいバイナリで RTC を再試行します。dbx が、別の共有ライブラリに対してパッチスペースを要求する場合は、そのライブラリについて手順 1〜2 を繰り返します。

    dbx によって要求されるパッチスペースが、指定の共有ライブラリごとに 8Mバイトを超える場合は、上記のケース 2 の手順に従ってください。