私は Objective-C で動的ライブラリを作成していますが、最近、dylib をロードするとすぐに segfault クラッシュが発生するという非常に奇妙な問題が発生し始めました。問題は、これがリリース ビルドでのみ発生することです。デバッグ ビルドは問題なく動作します。クラッシュに関連するスタック トレースの例を次に示します。
Terminating due to signal Segmentation fault: 11; backtrace: (
0 <redacted>.dylib 0x003417a9 SignalHandler + 52
1 libsystem_c.dylib 0x39cded33 _sigtramp + 34
2 CoreFoundation 0x31abaac9 CFRelease + 1104
3 ??? 0x2ff07629 0x0 + 804288041
4 ??? 0x2ff04a39 0x0 + 804276793
5 ??? 0x2ff04875 0x0 + 804276341
6 ??? 0x2fefdfff 0x0 + 804249599
7 ??? 0x2ff01a47 0x0 + 804264519
8 libdyld.dylib 0x39c97949 dlopen + 48
9 CoreFoundation 0x31b31b11 <redacted> + 116
10 CoreFoundation 0x31b067cb _CFBundleLoadExecutableAndReturnError + 418
11 Foundation 0x32424159 <redacted> + 848
コードを少し試して、クラッシュの原因をコード内の単一のコンストラクターに絞り込みました。このコンストラクターを削除すると、クラッシュは発生しなくなります。しかし、コンストラクターにステートメントを含めるほどのことをするprintf
と、クラッシュが再発します。これがそれを引き起こすのと同じくらい簡単なもの:
static void __attribute__((constructor)) TestConstructor() {
printf("THIS IS A TEST");
}
また、他のファイル (すべて静的に宣言されている) に他のコンストラクター関数があり、それらのそれぞれが正常に機能することにも言及する必要があります。クラッシュを引き起こしているのはこの特定のコンストラクターであり、それが私を本当に混乱させているのです。
何か案は?ここからさらにデバッグする方法がわかりません。