ここでは、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 コマンドは、expression の値を variable に割り当てます。dbx 内で使用すると variable の値が永久に変更されます。
assign variable = expression |
pop コマンドは、スタックから 1 つまたは複数のフレームをポップ (解放) します。
カレントフレームをポップ
number 個のフレームをポップ
指定のフレーム数までフレームをポップ
ポップされた呼び出しはすべて、再開時に再び実行されて、プログラムに望ましくない変更が加えられる可能性があります。pop は、ポップされた関数にローカルなオブジェクトのデストラクタも呼び出します。
詳細については、「pop コマンド」を参照してください。
call コマンドを dbx で使用すると、ある手続きが呼び出されて、その手続きは指定どおりに実行されます。
call proc([params]) |
この手続きは、プログラムの一部を変更する可能性があります。dbx は、プログラムソースに呼び出しを組み込んだ場合と同様に、実際に呼び出しを行います。
詳細については、「call コマンド」を参照してください。
print expression, ... |
式に関数呼び出しがある場合は、「call コマンド」 と同じ考慮事項が適用されます。C++ では、多重定義演算子による予期しない副作用にも注意する必要があります。
詳細については、「print コマンド」を参照してください。
when event-specification [modifier] {command; ... } |
イベントが発生すると、command が実行されます。
ある行または手続きに到達すると、コマンドが実行されます。どのコマンドを出したかによって、プログラムの状態が変わる可能性があります。
詳細については、「when コマンド」を参照してください。
fix コマンドを使用すると、プログラムに対して、実行中の変更を加えることができます。
fix |
これは非常に便利なツールですが、fix は変更されたソースファイルを再コンパイルして、変更された関数をアプリケーションに動的にリンクすることに注意してください。
fix と cont の制限事項を必ず確認してください。「メモリーリーク (mel) エラー」を参照してください。
詳細については、「fix コマンド」を参照してください。
cont at コマンドは、プログラムが実行される順序を変更します。実行を line. id で指定した行で続けられます。プログラムがマルチスレッド化されている場合は ID が必要です。
cont at line [ id ] |
これにより、プログラムの結果が変更される可能性があります。