0

我有一个用于复制和粘贴图像的小 CLT,用 Objective-C++ 编写。直到最近,这个程序才按预期编译和运行——但似乎只是现在,它在调用[NSApplication sharedApplication].

堆栈跟踪表明崩溃发生在NSApplication初始化NSUserDefaults实例时,该实例最终调用了一个CFDictionary-related 函数(即CFDictionarySetValue),然后该函数在free... 但从inside 中崩溃libjemalloc

这是一个示例堆栈跟踪:

-   Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   libjemalloc.2.dylib             0x000000010e7b4ec5 free + 164
1   libjemalloc.2.dylib             0x000000010e7e3d50 zone_free + 168
2   com.apple.CoreFoundation        0x00007fffc5a912c5 __CFBasicHashRehash + 3461
3   com.apple.CoreFoundation        0x00007fffc5a96927 __CFBasicHashAddValue + 103
4   com.apple.CoreFoundation        0x00007fffc5a97a3d CFDictionarySetValue + 221
5   com.apple.CoreFoundation        0x00007fffc5c467da __63-[_CFXPreferences(SearchListAdditions) withSnapshotSearchList:]_block_invoke + 554
6   com.apple.CoreFoundation        0x00007fffc5c4710f -[_CFXPreferences(SearchListAdditions) withSearchLists:] + 79
7   com.apple.CoreFoundation        0x00007fffc5c4655b -[_CFXPreferences(SearchListAdditions) withSnapshotSearchList:] + 155
8   com.apple.CoreFoundation        0x00007fffc5ad08bb __CFXPreferencesCopyCurrentApplicationState + 123
9   com.apple.CoreFoundation        0x00007fffc5ad04dc _CFLocaleCopyCurrentGuts + 268
10  com.apple.CoreFoundation        0x00007fffc5ad0399 +[NSLocale currentLocale] + 9
11  com.apple.Foundation            0x00007fffc7508026 -[NSUserDefaults(NSUserDefaults) init] + 1589
12  com.apple.Foundation            0x00007fffc7507995 +[NSUserDefaults(NSUserDefaults) standardUserDefaults] + 81
13  com.apple.AppKit                0x00007fffc35c9254 +[NSApplication initialize] + 90
14  libobjc.A.dylib                 0x00007fffda9b0b04 CALLING_SOME_+initialize_METHOD + 19
15  libobjc.A.dylib                 0x00007fffda9a16b9 _class_initialize + 579
16  libobjc.A.dylib                 0x00007fffda9a105b lookUpImpOrForward + 240
17  libobjc.A.dylib                 0x00007fffda9a0ad4 _objc_msgSend_uncached + 68
18  impaste                         0x0000000106197198 void objc::run_thread<AXDryRunThread>(NSDictionary*) + 120
19  impaste                         0x0000000106196820 main + 2608
20  libdyld.dylib                   0x00007fffdb294235 start + 1

…最后一点是最好奇的,因为我没有使用 JeMalloc 库。我的 CLT 程序和构建它的库 都与 JeMalloc 没有任何关系,并且构建系统目前根本不引用它。在任何时候,我都不包含 JeMalloc 库中的任何内容或链接到 JeMalloc 库的任何内容。

但是:从堆栈跟踪来看,我正在使用的 CoreFoundation 库实际上是在使用 JeMalloc。

我对 JeMalloc 了解不多,但我相信它为 and 提供一个全局的替代品mallocfree(除了提供大量自定义的、细粒度的内存管理功能)。

我的调用[NSApplication sharedApplication](如上面堆栈跟踪的第 18 行所示)如下所示:

template <typename OCThreadType> inline
void run_thread(NSDictionary* options = @{}) {
    @autoreleasepool {
        [NSApplication sharedApplication];
        [[[OCThreadType alloc] initWithOptions:options] start];
        AXAppDelegate* delegate = [[AXAppDelegate alloc] init];
        NSApp.delegate = delegate;
        [NSApp run];
    };
}

任何人都可以对此有所了解吗?什么可能导致该程序以这种方式崩溃(特别是最近在 CoreFoundation 中可能发生了什么变化)?

4

0 回答 0