我有一个用于复制和粘贴图像的小 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 提供了一个全局的替代品malloc
free
(除了提供大量自定义的、细粒度的内存管理功能)。
我的调用[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 中可能发生了什么变化)?