dbx コマンドによるデバッグ | ![]() ![]() ![]() ![]() ![]() |
付録 A
プログラム状態の変更
ここでは、
dbx
を使用しないでプログラムを実行する場合と比べながら、dbx
で実行する際のプログラムまたはプログラムの動作を変更するdbx
の使用法とコマンドについて説明します。プログラムに変更を加えるコマンドがどれかを理解する必要があります。
dbx
のもとでプログラムを実行することの影響アプリケーションは、
dbx
のもとで実行される場合、本来と動作が異なることがあります。dbx
は被デバッグプログラムに対する影響を最小限に抑えようとはしますが、次の点に注意する必要があります。
-C
オプション付きで起動しないでください。また、RTC は無効にしてください。
RTC のライブラリのlibrtc.so
をプログラムに読み込むと、プログラムの動作が変わる可能性があります。dbx
初期化スクリプトで環境変数が設定されていることを忘れないでください。スタックベースは、dbx
のもとで実行する場合、異なるアドレスから始まります。これは、各自の環境とargv[]
の内容によっても異なり、ローカル変数の割り当てが若干異なります。これらが初期化されていないと、異なる乱数を受け取ります。この問題は実行時検査によって検出できます。- プログラムは、使用前に
malloc()
されたメモリーを初期化しません。これは、前述の状態と似ています。この問題は、実行時検査によって検出できます。dbx
は LWP 作成イベントとdlopen
イベントを捕獲しなければならず、これによって、タイミングに左右されやすいマルチスレッドアプリケーションが影響を受ける可能性があります。dbx
は、シグナルに対するコンテキスト切り替えを実行するため、タイミングに影響を受けるシグナルを多用する場合、動作が異なってしまうおそれがあります。- プログラムは、
mmap()
が、マップされたセグメントについて常に同じベースアドレスを返すことを期待します。dbx
のもとで実行すると、アドレス空間が混乱して、mmap
() は、dbx
を使用しないでプログラムを実行したときと同じアドレスを返せなくなります。プログラムでこのことが問題になるかどうかを判断するには、mmap()
の使用場所をすべて調べて、返される値がハードコードされたアドレスではなく、プログラムによって実際に使用されることを確認してください。- プログラムがマルチスレッド化されている場合、データの競合が存在するか、またはスレッドスケジュールに依存する可能性があります。
dbx
のもとで実行すると、スレッドスケジュールが混乱して、プログラムが通常の順序とは異なる順序でスレッドを実行するおそれがあります。このような状態を検出するには、lock_lint
を使用してください。あるいは、
adb
またはtruss
を使用して実行した場合に同じ問題が起こるか確認してください。
dbx
によって強いられる混乱を最小限に抑えるには、アプリケーションが自然な環境で実行されているときにdbx
を接続するようにしてください。プログラムの状態を変更するコマンドの使用
assign
コマンド
assign
コマンドは、expresions の値を variable に割り当てます。dbx
内で使用すると var の値が永久に変更されます。
assign
variable=
expression
pop
コマンド
dbx
のpop
コマンドは、スタックから 1 つまたは複数のフレームをポップ (解放) します。
pop
カレントフレームをポップ pop
numbernumber 個のフレームをポップ pop -f
number指定のフレーム数までフレームをポップ
ポップされた呼び出しはすべて、再開時に再び実行されて、プログラムに望ましくない変更が加えられる可能性があります。
pop
は、ポップされた関数にローカルなオブジェクトのデストラクタも呼び出します。
call
コマンド
call
コマンドをdbx
で使用すると、ある手続きが呼び出されて、その手続きは指定通りに実行されます。
call proc([params]
)この手続きは、プログラムの一部を変更する可能性があります。
dbx
は、プログラムソースに呼び出しを組み込んだ場合と同様に、実際に呼び出しを行います。
print expression, ...式に関数呼び出しがある場合は、
call
コマンドと同じ考慮事項が適用されます。C++ では、多重定義演算子による予期しない副作用にも注意する必要があります。
when
コマンド
when
event-
specification[
modifier] {
command... ;}
ある行または手続きに到達すると、コマンドが実行されます。どのコマンドを出したかによって、プログラムの状態が変わる可能性があります。
fix
コマンド
fix
を使用すると、プログラムに対して、実行中の変更を加えることができます。
fixこれは非常に便利なツールですが、
fix
は変更されたソースファイルを再コンパイルして、変更された関数をアプリケーションに動的にリンクすることに注意してください。第 11 章「修正継続機能 (fix と continue)」を参照して、
fix
とcontinue
の制限事項を必ず確認してください。
cont
at
コマンド
この
cont at
コマンドは、プログラムが実行される順序を変更します。実行を line で指定した行で続けられます。プログラムがマルチスレッド化されている場合は ID が必要です。
cont at line id
サン・マイクロシステムズ株式会社 Copyright information. All rights reserved. |
ホーム | 目次 | 前ページへ | 次ページへ | 索引 |