4

メモリの上書きの問題があります。プログラムの進行中のある時点で、メモリの場所が上書きされ、プログラムがクラッシュします。問題はリリース モードでのみ発生します。デバッグ中は、すべて問題ありません。これは古典的な C/C++ のバグであり、見つけるのが非常に困難です。

このメモリの場所を監視し、変更されたらコールバックを呼び出す「デバッグ コード」を追加する方法があるかどうか疑問に思いました。これは基本的にデバッガがデバッグ モード (「データ ブレークポイント」) で実行できることですが、リリースでは同様のことが必要です。

4

5 に答える 5

10

変数の場所を制御できる場合は、変数を専用ページに割り当て、VirtualProtectを使用して読み取りのみを許可するようにページのアクセス許可を設定できます(Windows の場合 ... Linux の場合はわかりません)。

この方法では、誰かが書き込みを試みたときにアクセス違反が発生します。例外トランスレーター関数を使用すると、これをコールバックとして扱うことができます。

変数を直接移動できない場合でも (たとえば、クラス メンバーの場合)、変数の周りに十分なパディングを追加して、変数が専用ページにあることを確認し、同じ方法を使用することができます。

于 2009-11-06T17:23:37.620 に答える
7

コードの「リリース」部分のデバッグ シンボルを引き続き生成できます。これは、「デバッグ」モードの場合と同様に、デバッガーを介して実行できます。

最近、vtune で実行できるように、リリース ドライバーの 1 つに似たようなことをしました。Microsfot LINK の場合は-DEBUGフラグを追加し、Microsoft CC の場合は を追加しまし-Ziた。すべて正常に動作します。MSKB リンク

このリンクは役に立つかもしれません。

于 2009-11-06T17:28:55.467 に答える
3

assuming you're using windows use windbg to debug your program and check out the ba command-this will break when the memory is accessed.

于 2009-11-06T17:36:02.790 に答える
1

There are tools for this - like heap agent and boundschecker and many others that will discover overwrites. Basically you need some sentinels at the end of your memory allocations and they need to be checked.

于 2009-11-06T17:31:48.007 に答える
0

デバッグAPIはプラットフォーム固有ですが、存在します。 WindowsおよびUNIXAPIはオンラインで見つけることができます。

于 2009-11-06T18:03:35.333 に答える