Инструмент Objective-C++ командной строки начал падать в [NSApplication sharedApplication]
У меня есть небольшой CLT для копирования и вставки изображений, написанный на Objective-C++. До недавнего времени эта программа компилировалась и запускалась как задумано - но только сейчас, похоже, она начала зависать при вызове [NSApplication sharedApplication]
,
Следы стека показывают, что сбой происходит, когда NSApplication
инициализирует NSUserDefaults
экземпляр, который в конечном итоге вызывает CFDictionary
связанная функция (т.е. CFDictionarySetValue
) который затем падает free
... но изнутри 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 и не связываю с ней что-либо.
Однако: из трассировки стека, похоже, что библиотеки CoreFoundation, которые я использую, на самом деле используют JeMalloc.
Я не знаю много о JeMalloc, но я верю, что он обеспечивает глобальную замену 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)?