CoreAnalytics::Client / FrameworkConfiguration::init 内神秘崩溃

bha*_*ler 5 crash macos cocoa

我遇到了奇怪的崩溃,事实证明很难调试。我可以在启动应用程序后立即随意触发它,只需按下并释放 Command 键几次即可;不需要与我的应用程序进行其他交互。不用说,当命令键更改状态时,我的应用程序不会执行任何操作。实际上,其他按键也会引发崩溃,包括字母键;Command 没有什么特别之处,只是它似乎不太可能有其他副作用。

\n\n

崩溃始终发生在后台线程中,始终具有相同的回溯,但不包含我的任何代码:

\n\n
#0  0x00007fff603da3ec in __cxa_throw ()\n#1  0x00007fff42e90492 in nlohmann::basic_json<std::__1::map, std::__1::vector, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, bool, long long, unsigned long long, double, std::__1::allocator, nlohmann::adl_serializer>::parser::unexpect(nlohmann::basic_json<std::__1::map, std::__1::vector, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, bool, long long, unsigned long long, double, std::__1::allocator, nlohmann::adl_serializer>::lexer::token_type) const ()\n#2  0x00007fff42e8ccad in nlohmann::basic_json<std::__1::map, std::__1::vector, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, bool, long long, unsigned long long, double, std::__1::allocator, nlohmann::adl_serializer>::parser::parse_internal(bool) ()\n#3  0x00007fff42e8fe63 in nlohmann::basic_json<std::__1::map, std::__1::vector, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, bool, long long, unsigned long long, double, std::__1::allocator, nlohmann::adl_serializer>::parser::parse() ()\n#4  0x00007fff42e8fcd4 in nlohmann::basic_json<std::__1::map, std::__1::vector, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, bool, long long, unsigned long long, double, std::__1::allocator, nlohmann::adl_serializer> nlohmann::basic_json<std::__1::map, std::__1::vector, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, bool, long long, unsigned long long, double, std::__1::allocator, nlohmann::adl_serializer>::parse<char const*, 0>(char const*, char const*, std::__1::function<bool (int, nlohmann::basic_json<std::__1::map, std::__1::vector, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, bool, long long, unsigned long long, double, std::__1::allocator, nlohmann::adl_serializer>::parse_event_t, nlohmann::basic_json<std::__1::map, std::__1::vector, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, bool, long long, unsigned long long, double, std::__1::allocator, nlohmann::adl_serializer>&)>) ()\n#5  0x00007fff42e826be in FrameworkConfiguration::init() ()\n#6  0x00007fff42e82478 in FrameworkConfiguration::create(applesauce::xpc::object) ()\n#7  0x00007fff42e82100 in CoreAnalytics::Client::handleConfigurationChange_sync(applesauce::xpc::dict const&) ()\n#8  0x00007fff42e81f52 in CoreAnalytics::Client::handleServerMessage_sync(applesauce::xpc::dict) ()\n#9  0x00007fff42e94039 in ___ZZN13CoreAnalytics6Client4initEvENK3$_1clEv_block_invoke ()\n#10 0x00007fff634b8a54 in _xpc_connection_call_event_handler ()\n#11 0x00007fff634b795c in _xpc_connection_mach_event ()\n#12 0x000000010040482f in _dispatch_client_callout4 ()\n#13 0x0000000100421b3a in _dispatch_mach_msg_invoke ()\n#14 0x000000010040bb40 in _dispatch_lane_serial_drain ()\n#15 0x0000000100422eda in _dispatch_mach_invoke ()\n#16 0x000000010040bb40 in _dispatch_lane_serial_drain ()\n#17 0x000000010040cae8 in _dispatch_lane_invoke ()\n#18 0x0000000100419f2e in _dispatch_workloop_worker_thread ()\n#19 0x000000010049002c in _pthread_wqthread ()\n#20 0x000000010048f157 in start_wqthread ()\n
Run Code Online (Sandbox Code Playgroud)\n\n

nlohmann:: stuff 是一个我认识的 JSON 库,因为我在其他项目中使用过它,但我在这个项目中没有使用它。根据 Google 的说法,FrameworkConfiguration:: 和 CoreAnalytics:: 与我无法直接控制的内部 Apple 分析收集相关。我已在这台计算机上的“系统偏好设置”的“安全和隐私”面板中关闭了所有分析,然后重新启动了计算机;该错误仍然是 100% 可重现的。

\n\n

发生这种情况时,应用程序中的主线程不执行任何操作;通常它位于 mach_msg_trap() 中。主线程上的回溯也没有我的代码,并且是空闲的 CFRunLoop 的典型 macOS 回溯。

\n\n

我尝试打开 Xcode 提供的各种调试功能 \xe2\x80\x93 地址清理程序、未定义行为清理程序、malloc 乱码/保护边缘/保护 malloc/僵尸对象/malloc 堆栈。这些都不会产生与问题相关的任何输出。(即,除了 malloc 内容的初始输出表明它已启用之外,没有任何输出,等等等等。)

\n\n

我使用的是 Catalina 10.15.3,Xcode 11.3.1。我的下一步将是升级这两个;我忘记了我已经过时了,但只是稍微过时了,所以如果这有什么不同的话,那将是令人惊讶的。

\n\n

显然,当我按下按键时,我系统上的其他应用程序不会崩溃,所以我的应用程序一定正在执行某些操作来触发此问题,但我无法想象是什么,而且我不知道如何调试此问题。我想如果升级没有帮助,我将复制我的项目并开始删除大块代码,直到错误不再重现,并尝试缩小应用程序的负责部分。不过,我想我应该先检查一下这里,看看是否有人看到过这个。谢谢。

\n\n
\n\n

添加:我刚刚更新到 macOS 10.15.4 和 Xcode 11.4.1。这次崩溃没有任何变化。是时候开始雕刻了。如果我找出原因,我会在这里发布,以便其他人看看他们是否遇到了这个问题。

\n

bha*_*ler 3

嗯,有点不太令人满意的答案是,它似乎是某种损坏的 Xcode 项目文件的结果。我从 11.4.1 中创建的一个新的 Cocoa 应用程序项目开始,并一一添加源文件和资源,边测试边进行。我最终重新创建了完整的项目,并且错误不再存在。旧的 Xcode 项目是从旧版本继承下来的,遵循 Xcode 的所有项目升级建议。我已经仔细检查了这两个项目的所有构建设置,但看不到任何可以解释差异的内容。这是一个谜。但对于后代:如果您看到这个问题,请从头开始重建您的项目。