2010-11-26 9 views
2

私のiPhoneアプリケーション(XCode 3.2.4、iOS3.1.3)では、RELEASEモードでアプリケーションを実行すると、すべて正常ですが、DEBUGモードではアプリケーションがEXC_BAD_ACCESS例外でクラッシュします。 アプリケーションはいくつかの複雑な計算を行います。すべてのメインコードはいくつかのC++静的ライブラリに含まれており、UIApplicationはこれらのライブラリのいずれかからオブジェクトを作成し、このオブジェクトのメソッドを呼び出します。セカンダリスレッドのスタックサイズ、DEBUGとRELEASEバージョンの重要な違い

複雑な計算を呼び出すコードをセカンダリスレッドに入れても、DEBUGモードではEXC_BAD_ACCESS例外が、RELEASEモードでは問題はありません。

次に、スレッドのスタックサイズを調べました。デフォルトでは、iOSはセカンダリスレッドで512Kバイト、メインスレッドで1024Kバイトのスレッドスタックサイズを設定します。 アプリケーションを正しく実行するには、スレッドスタックサイズに必要な最小限の値を見ました。 次の結果が見つかりました: RELEASEバージョンでは40キロバイトです。 DEBUGバージョンでは1168 KBです。

DEBUGバージョンの1168 Kバイトは、メインスレッドでアプリケーションがクラッシュする理由を説明しています(メインスレッドのデフォルトスタックサイズは1024 Kバイトです)。

私のアプリケーションのRELEASEとDEBUGバージョン(40 KB vs 1168 Kb !!!)の間で、必要なスレッドスタックサイズがどうして違うのか分かりません。私はこの問題を理解する助けをしたいと思います。

ありがとうございます。 Marc

答えて

1

コードとライブラリのデバッグバージョンで余分なセルフテスト、追加のローカル変数と検証が含まれることは珍しくありません。おそらくこれらはあなたのコードのニーズを高めているでしょう。

特に、いくつかのバッファをローカル変数として定義し、大量のスタックを取ることは比較的簡単です。あなたの全体の40Kスタックの1/4を使用している、「bufferSizeの」は10Kと定義した場合

#ifdef _DEBUG 
    testBuffer[bufferSize]; 
#endif 

:あなたは、スタックを取って一の以上の場所でこのような何かを見つけるかもしれません。

おそらく、デバッグ専用の関数は大量のスタックを使用しています。

また、デバッグビルドの設定でAppleのテスト設定をいくつでも使用している可能性があります。 MallocStack、GuardMalloc、NSZombiesEnabledのようなものは、より多くのメモリを必要とします。

関連する問題