ここでは、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 を接続するようにしてください。