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

第 7 章 呼び出しスタックの検査

この章では、dbx による呼び出しスタックの使用方法と、呼び出しスタックを処理するときの wherehide、および unhide コマンドの使用方法について説明します。

呼び出しスタックは、現在活動中のルーチン、すなわち、呼び出されているがそれぞれの呼び出し側に戻っていない関数群を表します。

呼び出しスタックがメモリー上位からメモリー下位に成長することから、「上に移動する」(up) はメモリーを上位に移動して呼び出し側に向かうこと、「下に移動する」(down) はメモリー内を下位に移動することを意味します。プログラムの現在位置 (ブレークポイント、ステップ実行の後、プログラムが異常終了してコアファイルが作成された、のいずれかの時点で実行されていたルーチン) はメモリー上位に存在しますが、main() のような呼び出し側ルーチンはメモリー下位に位置します。

この章は次の各節から構成されています。

スタック上での現在位置の検索

where コマンドを使用すると、スタックでの現在位置を検索できます。


where [-f] [-h] [-q] [-v] number_id

where コマンドは、クラッシュしてコアファイルを作成したプログラムの状態を知る場合にも役立ちます。プログラムがクラッシュしてコアファイルを作成した場合、そのコアファイルを dbx に読み込むことができます。

スタックを移動してホームに戻る

スタックを上下に移動して関数を表示すると、dbx はスタックの状態を表示し、矢印でその関数を示します。プログラムが停止している位置を「ホーム」と呼び、このホームを起点にし、up コマンド、down コマンド、frame コマンドを使用してスタックを上下に移動することができます。

dbx コマンドの up および down は、ともに引数として、スタック内で現在のフレームから移動するフレームの数を指定する値 (number) を受け付けます。number を指定しない場合、デフォルトは 1 です。-h オプションを指定すると、隠されたフレームもカウントされます。

スタックを上下に移動する

現在の関数以外の関数にあるローカル変数を調べることができます。呼び出しスタックを number で指定されたレベル分、上に (main に向かって) 移動するには、次のように入力します。


up [-h] number

呼び出しスタックを number で指定されたレベル分、下に (現在の停止点に向かって) 移動するには、次のように入力します。


down [-h] number

特定フレームへの移動

frame コマンドは、up コマンドや down コマンドと同じような働きをします。このコマンドに where コマンドで得た番号を指定すると、その番号によって特定されるフレームに直接移動できます。このコマンドは、コマンド行でしか実行できません。


frame
frame -h
frame [-h] number
frame [-h] +number
frame [-h] -number

引数なしの frame コマンドは、現在のフレーム番号を出力します。number を指定すると、その番号によって示されるフレームに直接移動できます。“+”または“-”だけを指定すると、現在のフレームから 1 レベルだけ上 (+) または下 (-) に移動できます。また、正負の符号と number をともに指定すると、指定した数のレベルだけ上または下に移動できます。-h オプションをつけると、隠されたフレームもカウントされます。

コマンド参照

where

where コマンドは、現在のプロセスの呼び出しスタックを表示します。手続きの追跡を出力するには、次のように入力します。


where

追跡内の上位フレームから number で指定された数だけ出力するには、次のように入力します。


where number

number で指定されたフレームから追跡を開始するには、次のように入力します。


where -f number

隠されたフレームを含めるには、次のように入力します。


where -h

関数名だけを出力するには、次のように入力します。


where -q

関数の引数と行情報を含めるには、次のように入力します。


where -v

where コマンドには、呼び出しスタックを表示するスレッドまたは LWP ID を続けて指定できます。

hide/unhide

hide コマンドを使用すると、現在有効なスタックフレームフィルタをリストで表示することができます

正規表現に一致するスタックフレームすべてを隠すか、または削除するには、次のように入力します。


hide [ regexp ]

regexp は関数名またはロードオブジェクト名を表す正規表現で、sh または ksh の正規表現スタイルをとります。

すべてのスタックフレームフィルタを削除するには、unhide を使用します。


unhide 0

hide コマンドは、番号とともにフィルタをリスト表示するため、このフィルタ番号を使用して unhide コマンドを使用することもできます。


unhide [ number | regexp  ]