1

我正在用 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");
}

我还应该提到,我在其他文件中确实有其他构造函数(所有这些都是静态声明的),并且每个都可以正常工作。正是这个特殊的构造函数导致了崩溃,这让我很困惑。

有任何想法吗?我不确定如何从这里进一步调试它。

4

0 回答 0