これらの種類のバグに非常に効果的なテクニックが 1 つありますが、いくつかの特徴を持つバグのサブセットでしか機能しません。
- 破損している値は安定している必要があります (つまり、あなたの例のように、破損が発生した場合は常に 100 です)、または少なくとも単純な式で容易に識別できるものでなければなりません
- 破損はスタック上の特定のアドレスで発生する必要があります
- 破損した値は十分に異常であるため、多数の誤検知に見舞われることはありません
スタックは実行時のアクションに応じて非常に多くの異なる方法で使用できるため、2 番目の条件は一見ありそうにないように見えることに注意してください。ただし、スタックの使用は一般的にかなり決定論的です。問題は、特定のスタックの場所が非常に多くの異なるものに使用される可能性があるため、実際には項目 #3 にあることです。
とにかく、バグにこれらの特徴がある場合は、破損したスタック アドレス (またはそれらの 1 つ) を特定し、そのアドレスへの書き込みにメモリ ブレークポイントを設定して、書き込まれた値が次の場合にのみブレークする条件を設定する必要があります。破損した値。Visual Studio では、[ブレークポイント] ウィンドウで "新しいデータ ブレークポイント..." を作成し、ブレークポイントを右クリックして条件を設定することでこれを行うことができます。
誤検知が多すぎる場合は、バグに近い実行パスのあるポイント (そのような時間を特定できる場合) までブレークポイントを無効のままにするか、ヒットを設定することで、ブレークポイントの範囲を狭めることができます。誤検知のほとんどを取り除くのに十分な数をカウントします。
さらに複雑なのは、スタックのアドレスが実行ごとに変わる可能性があることです。この場合、実行ごとにブレークポイントを設定するように注意する必要があります (アドレスの下位ビットは同じである必要があります)。