私はデバッグとリリースビルドの違いについて認識していますが、デバッガをプロセス(ビルドリリースまたはデバッグ)に接続してプロセスの動作を変更すると、興味がありますか?プロセスにアタッチすると、動作が異なりますか?
私はHP 11.31 Itaniumで開発していますが、一般的なケースではまだ興味があります。
私はデバッグとリリースビルドの違いについて認識していますが、デバッガをプロセス(ビルドリリースまたはデバッグ)に接続してプロセスの動作を変更すると、興味がありますか?プロセスにアタッチすると、動作が異なりますか?
私はHP 11.31 Itaniumで開発していますが、一般的なケースではまだ興味があります。
http://en.wikipedia.org/wiki/Heisenbug#Heisenbug
、デバッガを取り付けること(例えば、スレッド競合状態を変更することができる)タイミングが変更され、デバッガが接続されている場合、いくつかのシステムコールを検出することができます。
プラットフォームやデバッグの方法によっては、確かに可能です。たとえば、debugging on Windowsの場合、実際にはIsDebuggerPresent関数が存在します。上記のように、機能は回避することができますが、他の手段があります。基本的に、それは複雑です。
あなたが言っていることは、アプリケーションが見つけ出すことは可能ですが、それは質問者が知りたいと思っていたことです。アプリケーションがさまざまな方法で動作することができる方法を説明することは、デバッグで最も頻繁に現れるため、説明するほうがずっと便利です。 – PanCrit
この質問は、意図的/意図的でない行動の変化に関して特定されたものではありません。あなたが注意するように、両方があるかもしれません。他の回答者は、デバッグモードの意図しない変更の仕組みについて少し詳しく調べています。前述したように、より遅い診断メモリアロケータは、ある種のエラーを少しでも寛容にすることが比較的一般的である。 –
はい、デバッガをプロセスにアタッチすると、即座にバグが消えて、リリースモードでアプリケーションをコンパイルするときに再表示されることがよくあります。残念ながら私は通常、私のアプリケーションを実行するためだけにすべてのユーザにデバッガを開くように依頼することはできないので、かなりイライラすることがあります。もちろん
ええ、Windowsデータ構造内の多くのものは、デバッガが接続されたときに変更されます。実際には、多くの変更がアンチ・デバッガによってアプリケーションが存在するかどうかを検出するために使用されます(これは、メモリがどのように割り当て/解放されるかを変更します)、ハウスキーピング・コードと「マーカー」をスタックに追加しますデバッグ中です。
インタープリタ言語(Java、.NET)では、例外をトラップして表示したり、元のコードを表示したりするために、デバッガで実行しているときに実行時にさまざまなマシン命令が生成されることがあります。デバッガが添付されています。
これらの変更のいくつかは、ソフトウェアの動作に影響を及ぼし、最適化や非常に細かいタイミング依存関係によって引き起こされる一時的なバグを複雑にする可能性があります。
また、デバッガに接続するマルチスレッドアプリケーションでは、まったく異なる結果が得られることに注意してください。これらは "Heisenbugs"と呼ばれる種類のものです。
もちろん、マルチスレッドアプリケーションでは、デバッガをアタッチすると別の結果が得られます。 しかし、スレッドに関係のないコードはどうですか?
デバッガが接続されているリリースビルドに問題はありません。しかし、デバッガが接続されていない場合は、問題があります。
最初に起動され、デバッガが接続されている場合、同じ問題が表示されます。
対象プラットフォームは何ですか? –
@ojblass:こんにちは、もっと明確にするためにQを書き直しました。あなたはそれでOKであることを願っています。 –
もっとよく見えます... – ojblass