我正在用 Objective-C 编写一个动态库,最近我开始遇到一个非常奇怪的问题,加载 dylib 会在加载后立即触发段错误崩溃。问题是,这只发生在发布版本中 - 调试版本工作得很好。这是崩溃中相关堆栈跟踪的示例:
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");
}
我还应该提到,我在其他文件中确实有其他构造函数(所有这些都是静态声明的),并且每个都可以正常工作。正是这个特殊的构造函数导致了崩溃,这让我很困惑。
有任何想法吗?我不确定如何从这里进一步调试它。