0

Windows と Linux で既に動作するプログラムを MacOS (Lion) に移植しようとしていますが、非常に奇妙な問題が発生しています。

非常に長い関数 (約 3000 行の C++ コード) がありますが、メイン スレッドから直接呼び出すと問題なく動作します。

ただし、別の pthread を作成してそこから同じ関数を呼び出すと、クラッシュします。メインスレッドが何もしていなくても (スリープ)。クラッシュは常にまったく同じ場所で発生します (タイミングの問題ではありません)。この関数には約 2000 行あります。数行のコードを削除すると、少し下に移動します。

gcc 4.2 ではデバッグ モードでエラーが発生し、いくつかの最適化を有効にすると消えます (ただし、-O3 を使用すると再び発生します)。gcc 4.9 では、-O2 または -O3 を有効にした場合にリリース モードでのみ発生します。そのため、gcc 4.2 で何が起こるかを理解しようとしています (デバッグ モードで再現できるため)。

さらに奇妙なことに、2 つのブール値 (loudness_on と en) があり、次の行でクラッシュが発生します。

bool en2 = loudness_on && en;

この行から Loudness_on または en のいずれかを削除すると、エラーの発生が停止します。(これは、en2 が範囲外になる点よりもかなり下に、数行下に移動します)。

valgrind を実行しましたが、エラーは報告されません。

スタックの問題が疑われます (スレッドのスタックの方が小さいのではないでしょうか?) が、gdb は、スタックにまったく関連していないように見える何かを報告します。

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0000000109588ec7
[Switching to process 12928 thread 0x4203]
0x00000001002e4809 in ParSet::refresh_parameters () at /Users/User/BUILD/Param.cpp: 3017
3017     bool en2 = loudness_on && en;

ここで何が起こっているのか、どんなアイデアでも大歓迎です。後で関数を小さな部分に分割して、それが役立つかどうかを確認します (スタックの問題の場合はそうなる可能性があります)。

4

1 に答える 1