Sun Studio 12: dbx コマンドによるデバッグ

既存のコアファイルのデバッグ

コアダンプしたプログラムが共有ライブラリと動的にリンクしている場合、それが作成された同じオペレーティング環境でコアファイルをデバッグすることが重要です。dbx では、一致しないコアファイル (たとえば、バージョンまたはパッチレベルの異なる Solaris オペレーティングシステムで生成されたコアファイル) のデバッグに対しサポートが制限されます。


注 –

ネイティブコードのときと異なり、コアファイルから Java アプリケーションの状態情報を入手することはできません。


同じオペレーティング環境でのコアファイルのデバッグ

コアファイルをデバッグするには、次のように入力します。


$ dbx program_name core

dbx がすでに起動していれば、debug コマンドを使用してコアファイルをデバッグすることもできます。


(dbx) debug -c core program_name

プログラム名として - を指定すると、dbx はコアファイルからプログラム名を抽出します。実行可能ファイルのフルパス名をコアファイルから抽出できない場合は、実行可能ファイルを特定できないことがあります。この場合は、dbx でコアファイルを読み込むときに、バイナリの完全なパス名を指定します。

コアファイルが現在のディレクトリに存在しない場合、パス名を指定できます (/tmp/core など)。

プログラムがコアをダンプしたときにどこで実行されていたかを確認するには、where コマンド (where コマンド」を参照) を使用してください。

コアファイルをデバッグする場合、変数と式を評価して、プログラムがクラッシュした時点での値を確認することもできますが、関数呼び出しを行なった式を評価することはできません。ステップ実行したりブレークポイントを設定することはできません。

コアファイルが切り捨てられている場合

コアファイルの読み込みに問題がある場合は、コアファイルが切り捨てられているかどうかを確認してください。コアファイルの生成時に、コアファイルの最大サイズの設定が小さすぎる場合は、コアファイルが切り捨てられ、dbx で読み込めないことがあります。C シェルでは、limit コマンドを使用して、コアファイルの最大サイズを設定することができます (limit(1) マニュアルページを参照)。Bourne シェルおよび Korn シェルでは、ulimit コマンドを使用します (limit(1) マニュアルページを参照)。シェルの起動ファイルでコアファイルのサイズの上限を変更してその設定を有効にし、コアファイルを生成したプログラムを再実行すれば、完全なコアファイルが生成されます。

コアファイルが不完全で、スタックセグメントが欠落している場合、スタックのトレース情報は利用できません。実行時リンカー情報が欠落している場合、ロードオブジェクトのリストは利用できません。この場合は、librtld_db.so が初期化されていないというエラーメッセージが表示されます。LWP のリストが欠落している場合、スレッド情報、lwp 情報、またはスタックトレース情報は利用できません。where コマンドを実行すると、プログラムがアクティブでないというエラーメッセージが表示されます。

一致しないコアファイルのデバッグ

特定のシステム (コアホスト) で作成されたコアファイルを、デバッグのためにそのファイルを別のマシン (dbx ホスト) に読み込む場合があります。この場合、ライブラリに関する 2 つの問題が発生する可能性があります。

ユーザーライブラリとシステムライブラリは、パッチや主要な Solaris オペレーティング環境のアップグレードで変更できるため、収集したコアファイルで dbx を実行する前にパッチをインストールした場合など、この問題が同一ホストでも発生する可能性があります。

dbx は、一致しないコアファイルを読み込むと、次のエラーメッセージを 1 つ以上表示することがあります。


dbx: コアファイル読み取りエラー: アドレス 0xff3dd1bc は利用できません
dbx: 警告: librtld_db.so.1 を初期化できませんでした -- trying libDP_rtld_db.so
dbx: 1 のスレッド情報を取得できません -- 一般的な libthread_db.so エラー
dbx: レジスタをフェッチしようとして失敗しました - スタックが破壊されました
dbx: (0xff363430) からのレジスタの読み取りに失敗しました -- デバッガは失敗しました

共有ライブラリ問題の回避

Procedureライブラリ問題を回避し、一致しないコアファイルを dbx でデバッグするには、次の手順を実行します。

  1. dbx 環境変数 core_lo_pathmapon に設定します。

  2. pathmap コマンドを使用して、コアファイルの正しいライブラリの配置場所を dbx に伝えます。

  3. debug コマンドを使用して、プログラムとコアファイルを読み込みます。

    たとえば、コアホストのルートパーティションが NFS を介してエクスポートされており、dbx ホストマシンの /net/core-host/ からアクセスできると仮定した場合、次のコマンドを使用して、プログラム prog とコアファイル prog.core をデバッグのために読み込みます。


    (dbx) dbxenv core_lo_pathmap on
    (dbx) pathmap /usr /net/core-host/usr
    (dbx) pathmap /appstuff /net/core-host/appstuff
    (dbx) debug prog prog.core
    

    コアホストのルートパーティションをエクスポートしていない場合、手動でライブラリをコピーする必要があります。シンボリックリンクを再作成する必要はありません (たとえば、libc.so から libc.so.1 へのリンクを作成する必要はありません。libc.so.1 が利用可能であることだけを確認してください)。

注意点

一致しないコアファイルをデバッグする際に、次の点に注意してください。