JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
Oracle Solaris Studio 12.3: dbx コマンドによるデバッグ     Oracle Solaris Studio 12.3 Information Library (日本語)
search filter icon
search icon

ドキュメントの情報

はじめに

1.  dbx の概要

2.  dbx の起動

3.  dbx のカスタマイズ

4.  コードの表示とコードへの移動

5.  プログラムの実行制御

6.  ブレークポイントとトレースの設定

ブレークポイントを設定する

ソースコードの特定の行に stop ブレークポイントを設定する

関数に stop ブレークポイントを設定する

C++ プログラムに複数のブレークポイントを設定する

異なるクラスのメンバー関数にブレークポイントを設定する

クラスのすべてのメンバー関数にブレークポイントを設定する

非メンバー関数に複数のブレークポイントを設定する

オブジェクトにブレークポイントを設定する

データ変更ブレークポイントを設定する

特定アドレスへのアクセス時にプログラムを停止する

変数の変更時にプログラムを停止する

条件付きでプログラムを停止する

ブレークポイントのフィルタの設定

関数の戻り値をフィルタとして使用

局所変数にデータ変更ブレークポイントを設定する

条件付イベントでのフィルタの使用

トレースの実行

トレースを設定する

トレース速度を制御する

ファイルにトレース出力を転送する

ソース行で when ブレークポイントを設定する

動的にロードされたライブラリにブレークポイントを設定する

ブレークポイントをリストおよびクリアする

ブレークポイントとトレースポイントの表示

ハンドラ ID を使用して特定のブレークポイントを削除

ブレークポイントを有効および無効にする

イベント効率

7.  呼び出しスタックの使用

8.  データの評価と表示

9.  実行時検査

10.  修正継続機能 (fix と cont)

11.  マルチスレッドアプリケーションのデバッグ

12.  子プロセスのデバッグ

13.  OpenMP プログラムのデバッグ

14.  シグナルの処理

15.  dbx を使用してプログラムをデバッグする

16.  dbx を使用した Fortran のデバッグ

17.  dbx による Java アプリケーションのデバッグ

18.  機械命令レベルでのデバッグ

19.  dbx の Korn シェル機能

20.  共有ライブラリのデバッグ

A.  プログラム状態の変更

B.  イベント管理

C.  マクロ

D.  コマンドリファレンス

索引

ブレークポイントのフィルタの設定

dbx では、ほとんどのイベント管理コマンドが event filter 修飾子をオプションでサポートします。もっとも単純なフィルタは、プログラムがブレークポイントかトレースハンドラに到達したあと、またはデータ変更ブレークポイントが発生したあとに、dbx に対してある特定の条件をテストするように指示します。

このフィルタの条件が真 (非 0) と評価された場合、イベントコマンドが適用され、プログラムはブレークポイントで停止します。条件が偽 (0) と評価された場合、dbx は、イベントが発生しなかったかのようにプログラムの実行を継続します。

フィルタを含む行または関数にブレークポイントを設定するには、オプションの -if condition 修飾文を stop コマンドまたは trace コマンドの末尾に追加します。

condition には、任意の有効な式を指定できます。コマンドの入力時に有効だった言語で書かれた、ブール値または整数値を返す関数呼び出しも有効な式に含まれます。

inat など位置に基づくブレークポイントでは、条件の構文解析を行うスコープはブレークポイント位置のスコープになります。それ以外の場合、イベントではなくエントリ発生時のスコープになります。スコープを正確に指定するために逆引用符演算子 (「逆引用符演算子」を参照) を使用する必要があることがあります。

次の 2 つのフィルタは異なります。

stop in foo -if a>5
stop cond a>5

前者は foo にブレークポイントが設定され、条件を検査します。後者は自動的に条件を検査します。

関数の戻り値をフィルタとして使用

関数呼び出しをブレークポイントフィルタとして使用できます。次の例では、文字列 str の値が abcde の場合、プログラムが関数 foo() で停止します。

(dbx) stop in foo -if !strcmp(“abcde”,str)

局所変数にデータ変更ブレークポイントを設定する

局所変数にデータ変更ブレークポイントを配置する際に、フィルタを使用すると便利です。次の例では、現在のスコープは関数 foo() にあり、対象となる変数 index は関数 bar() にあります。

(dbx) stop access w &bar`index -in bar

bar`index により、関数 foo にある index() 変数や index という名称のグローバル変数ではなく、関数 bar にある index 変数が確実に取り出されます。

-in bar には、次のような意味があります。

index に対応するスタック位置は、ほかのいずれかの関数のいずれかの局所変数によって再度利用できます。-in により、ブレークポイントが起動するのは bar`index がアクセスされた場合のみになります。

条件付イベントでのフィルタの使用

最初のうちは、条件付イベントコマンド (watch タイプのコマンド) の設定と、フィルタの使用とを混同してしまうかもしれません。概念的には、watch タイプのコマンドは、各行の実行前に検査される「前提条件」を作成します (watch のスコープ内で)。ただし、条件付トリガーのあるブレークポイントコマンドでも、それに接続するフィルタを持つことができます。

次に具体的な例を示します。

(dbx) stop access w &speed -if speed==fast_enough

このコマンドは、変数 speed を監視するように dbx に指令します。speed に書き込みが行われると (watch 部分)、-if フィルタが有効になります。dbxspeed の新しい値が fast_enough と等しいかどうかチェックします。等しくない場合、プログラムは実行を継続し、stop を「無視」します。

dbx 構文では、フィルタはブレークの「事後」、構文の最後で [-if condition] 文の形式で指定されます。

stop in function [-if condition]

マルチスレッドプログラムでブレークポイントに関数呼び出しを含むフィルタを設定すると、dbx がブレークポイントに達するとすべてのスレッドの実行が停止し、条件が評価されます。条件が合致して関数が呼び出されると、dbx がその呼び出し中すべてのスレッドを再開します。

たとえば、次のブレークポイントを、多くのスレッドが lookup() を呼び出すマルチスレッドアプリケーションで設定する場合があります。

(dbx) stop in lookup -if strcmp(name, “troublesome”) == 0

dbx は、スレッド t@1 lookup() を呼び出して条件を評価すると停止し、strcmp() を呼び出してすべてのスレッドを再開します。dbx が関数呼び出し中に別のスレッドでブレークポイントに達すると、次のいずれかの警告が表示されます。

event infinite loop causes missed events in the following handlers:
...
Event reentrancy
first event BPT(VID 6m TID 6, PC echo+0x8)
second event BPT*VID 10, TID 10, PC echo+0x8)
the following handlers will miss events:
...

そのような場合、条件式内で呼び出された関数が mutex を取得しないことを確認できる場合は、-resumeone イベント指定修飾子を使用して、dbx がブレークポイントに達した最初のスレッドのみを再開させることができます。たとえば、次のブレークポイントを設定する場合があります。

(dbx) stop in lookup -resumeone -if strcmp(name, “troublesome”) == 0

-resumeone 修飾子はすべての場合において問題を防ぐことはしません。たとえば、次の場合にも何も行いません。

イベント修飾子の詳細については、「イベント指定のための修飾子」を参照してください。