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