XPC 服务阵列崩溃

Posted

技术标签:

【中文标题】XPC 服务阵列崩溃【英文标题】:XPC service array crashes 【发布时间】:2014-12-21 20:00:26 【问题描述】:

我将 C 接口用于 XPC 服务;顺便说一句,我的 XPC 服务运行得非常好,除了以下问题。

前几天我尝试通过 XPC 发送一个“大”数组;大约 200,000 个条目。通常,我的应用程序处理几千个条目的数据并且没有问题。对于其他用途,这种大小的数组可能并不特殊。

这是我用于生成数组的 C++ 服务器代码:

  xpc_connection_t remote = xpc_dictionary_get_remote_connection(event);
  xpc_object_t reply = xpc_dictionary_create_reply(event);

  xpc_object_t times;
  times = xpc_array_create(NULL, 0);

  for(unsigned int s = 0; s < data.size(); s++)
  
    xpc_object_t index = xpc_uint64_create(data[s]);
    xpc_array_append_value(times, index);
  

  xpc_dictionary_set_value(reply, "times", times);
  xpc_connection_send_message(remote, reply);

  xpc_release(times);
  xpc_release(reply);

这是客户端代码:

  xpc_object_t times = xpc_dictionary_get_value(reply, "times");
  size_t count = xpc_array_get_count(times);
  for(int c = 0; c < count; c++)
  
    long my_time = xpc_array_get_uint64(times, c);
    local_times.push_back(my_time);
  

如果我尝试处理大型数组,我会遇到 seg 错误 (SIGSEGV)

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   libxpc.dylib                    0x00007fff90e5cc02 xpc_array_get_count + 0

【问题讨论】:

过度喂养是圣诞节期间的常见问题。 那么每个条目的大小是多少?只有当条目数量像 20 万这样大时,您才会看到这一点?看起来像堆栈溢出 【参考方案1】:

当您说“非常大的阵列”时,您是指 launchd 可能会视为资源消耗并杀死的东西吗?

XPC 仅适用于短时间快速事务运行,而不是冗长的基于服务的运行。

如果您要拨打使 launchd 等待的电话,那么我建议您尝试https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLaunchdJobs.html

当服务终止时.. 除了 SIG_ABORTS 等之外的任何特定事件...被触发了吗?

您是否收到“xpc 服务已失效”(这通常意味着 launchD 将其杀死,或者您是否收到“xpc 服务/过早退出”,这通常是处理程序代码错误。

【讨论】:

您可以在我的问题中看到我想要处理的数据大小。这不是服务运行,我只是从子进程中传输一些数据。

以上是关于XPC 服务阵列崩溃的主要内容,如果未能解决你的问题,请参考以下文章

服务器数据恢复StorNext文件系统下RAID5硬盘存在大量坏道离线导致阵列崩溃的数据恢复案例

存储崩溃强制上线是否完全不可行?

2003系统怎么装磁盘阵列

存储数据恢复服务器存储由于多次断电导致raid5阵列崩溃的数据恢复案例

raid阵列崩溃后对物理硬盘做完整镜像的步骤

服务器数据恢复案例 / raid5阵列多块硬盘离线处理方法