Oracle Solaris Studio 12.2: dbx コマンドによるデバッグ

プログラムスコープ

スコープとは、変数または関数の可視性について定義されたプログラムのサブセットです。あるシンボルの名前が特定の実行地点において可視となる場合、そのシンボルは「スコープ範囲内にある」ことになります。C 言語では、関数はグローバルまたはファイル固有のスコープを保持します。変数は、グローバル、ファイル固有、関数、またはブロックのスコープを保持します。

現在のスコープを反映する変数

次の変数は現在のスレッドまたは LWP の現在のプログラムカウンタを常に反映し、表示スコープを変更するコマンドには影響されません。

$scope

現在のプログラムカウンタのスコープ

$lineno

現在の行番号

$func

現在の関数

$class

$func が所属するクラス

$file

現在のソースファイル

$loadobj

現在のロードオブジェクト

表示スコープ

プログラムのさまざまな要素を dbx を使用して検査する場合、 表示スコープを変更します。dbx は、式の評価中にあいまいなシンボルを解析するなどの目的で表示スコープを使用します。たとえば、次のコマンドを入力すると、dbx は表示スコープを使用して印刷する i を判断します。


(dbx) print i

各スレッドまたは LWP は独自の表示スコープを持っています。スレッド間を切り替えるときに、各スレッドはそれぞれの表示スコープを記憶します。

表示スコープのコンポーネント

表示スコープのいくつかのコンポーネントは、次の事前定義済み ksh 変数内で可視になります。

$vscope

現在の表示スコープ

$vloadobj

現在の表示ロードオブジェクト

$vfile

現在の表示ソースファイル

$vlineno

現在の表示行番号

$vclass

$vfunc が属するクラス

$vfunc

現在の表示関数

現在の表示スコープのすべてのコンポーネントは、相互互換性があります。たとえば、関数を含まないファイルを表示する場合、現在の表示ソースファイルが新しいファイル名に更新され、現在の表示関数が NULL に更新されます。

表示スコープの変更

次のコマンドは表示スコープを変更するもっとも一般的な方法です。

debug コマンドおよび attach コマンドは最初の表示スコープを設定します。

ブレークポイントに達すると、dbx によって表示スコープが現在の位置に設定されます。stack_find_source 環境変数 (dbx 環境変数の設定」参照) が ON に設定されている場合、dbx はソースコードを持っているスタックフレームを検索してアクティブにします。

up コマンド (up コマンド」参照)、down コマンド (down コマンド」参照)、frame number コマンド (frame コマンド」参照)、または pop コマンド (pop コマンド」参照) を使用して現在のスタックフレームを変更すると、新しいスタックフレームからのプログラムカウンタに従って dbx によって表示スコープが設定されます。

list コマンド (list コマンド」を参照) によって使用される行番号位置は、list function または list file コマンドを使用した場合にのみ表示スコープを変更します。表示スコープが設定されると、list コマンド用の行番号位置が表示スコープの最初の行番号に設定されます。続けて list コマンドを使用すると、list コマンド用の現在の行番号位置が更新されますが、現在のファイル内で行をリストしているかぎり表示スコープは変更されません。たとえば、次のように入力すると、dbx によって my_func のソースの開始位置がリストされ、表示スコープが my_func に変更されます。


(dbx) list my_func

次のように入力すると、dbx によって現在のソースファイル内の行 127 がリストされ、表示スコープは変更されません。


(dbx) list 127

file コマンドまたは func コマンドを使用して現在のファイルまたは現在の関数を変更すると、表示スコープも更新されます。