大きなデータセットで一度に数日間動作する大規模なMacアプリケーションがあります。 Objective-C++とC++の組み合わせです。マウンテンライオンでは素晴らしい走りを見せていますが、マーベリックスでは約10〜20分(数百万のオブジェクトが割り当てられて破壊されています)に走った後、クラッシュします。無効なポインタ(つまり、削除されたC++オブジェクトで関数を呼び出す)でクラッシュするかのように動作しますが、ポインタが指しているオブジェクトは意味をなさない状態にあります。マーベリックスでNonsensical C++とObjective-C++がクラッシュする
すべての私のC++クラスは、コンストラクタは次のようになり、共通の基本クラスから継承:
MyClass::MyClass()
{
mCreated = 12345; //int member variable set here and NEVER TOUCHED AGAIN.
//other initialization stuff
}
それがクラッシュすると、デバッガは悪い物では、mCreated
の値が0であることを示していることがありますオブジェクトがコンストラクタを実行したことがないかのように動作します。
この値は0またはその期待値以外のものではないため、オブジェクトの他のフィールドの値はメモリのストンプミングで予想されるガベージのような値を持たないため、メモリがストンプしているとは思わない。
私はまた、不透明度をオンにして試してみましたが、0x555
と0xaaa
の値はどこにも表示されません。私もGuard Edgeを試しました。
詳細な調査では何も明らかにされていません。悪いオブジェクトは常に同じクラスではありません。私が考えることができるのは、マーベリックス(未使用のメモリを圧縮する)の新しいメモリを持つものが何らかの新しい動作を引き起こしているということです(バグか、以前は不明だった、
誰も似たような人はいますか?あるいは、マーベリックスの下でより強く適用される、ほとんど知られていないメモリルールを知っている人はいますか?
最近、非常に便利な**デバッグテクニックが学びました。(GDB(と確かにLLDB)が読み書き中のメモリアドレスを見ることができます)。私は正確なコマンドを覚えていませんが、確かに "gdb watch memory access"を探してください。 –
aw待ち、いいえ、[ここにあります](http:// stackoverflow。com/questions/58851/can-i-set-a-breakpoint-on-memory-access-in-gdb/59146#59146)。 –
@ H2CO3 - 知っておいてよかったですが、どんなアドレスが詰まるのか分かりません。 –