iOS 崩溃:XPC API 滥用

Posted

技术标签:

【中文标题】iOS 崩溃:XPC API 滥用【英文标题】:Crash in iOS: XPC API Misuse 【发布时间】:2015-10-20 11:46:16 【问题描述】:

crashlytics 报告我们的 ios 应用发生崩溃:

崩溃:XPC API 滥用:尝试发送一条消息,期望回复到 (com.apple.networking.connection.0x46bf35a0)

堆栈跟踪是:

Thread : Crashed: XPC API Misuse: Attempt to send a message expecting a reply to  (com.apple.networking.connection.0x46bf35a0)
0  libxpc.dylib                   0x35cc534a _xpc_api_misuse + 41
1  libsystem_c.dylib              0x35ba49e5 __strlcpy_chk + 48
2  libxpc.dylib                   0x35cb5f75 _xpc_serializer_create + 158
3  libxpc.dylib                   0x35cb5ea1 xpc_connection_send_message + 60

它发生在 iPhone 5 上的 iOS 9.0.2 下。我们无法重现崩溃,也不知道如何开始调试/修复。看来我们是not alone with this。

也许这里有人有什么想法。

【问题讨论】:

在装有 iOS 9.1.0 的 iPhone 6 Plus 上遇到同样的崩溃。 【参考方案1】:

在这个问题上有很多未解决的错误:rdar://21832853 是原始错误,还有 rdar://22860899 和 rdar://22874333,两者都在 OpenRadar 上。

我认为这是由 SCNetworkReachability 中的一些基于 C 的网络代码引起的,它正在尝试与 iOS *** 系统(大概是为了确定是否已连接)或用于 NSURLSession 的后台守护进程通信请求,但我不确定。不幸的是,CFNetwork 不是开源的,而且 10.11 的 libdispatch 源代码(尽可能接近 iOS 9)还没有发布,所以我什至无法开始猜测网络代码做错了什么。

无论哪种方式,我认为您无法解决它。话虽如此,假设我对根本原因是正确的,您可以通过运行网络链接调节器并反复打开和关闭飞行模式来重现它。无论如何,值得一试。

【讨论】:

【参考方案2】:

我认为可能是你的代码错误,我以前每次关闭应用程序时都会遇到同样的问题,我有一个销毁函数,它释放 xpc 连接,如下所示:

void XpcComm::destory()

    std::lock_guard< std::mutex > lock( m_Lock );
    if ( m_xpcConn != nullptr )
    
        xpc_connection_cancel( m_xpcConn );
        xpc_release( m_xpcConn );
    
    m_xpcConn = nullptr;

我更新了

void XpcComm::destory()

    std::lock_guard< std::mutex > lock( m_Lock );
    if ( m_xpcConn != nullptr )
    
        xpc_connection_cancel( m_xpcConn );
        xpc_release( m_xpcConn );
        m_xpcConn = nullptr;
    
    

并修复了关闭应用程序时 xpc api 滥用崩溃的问题。

【讨论】:

以上是关于iOS 崩溃:XPC API 滥用的主要内容,如果未能解决你的问题,请参考以下文章

iOS 8 / iPhone 6 XPC 崩溃

iOS 集成测试随机崩溃:与 backboardd 通信时遇到 XPC 错误

XPC 蓝牙通信崩溃

XPC 服务阵列崩溃

带有文本层的视频导出AVFoundation崩溃

FetchedResultsController Swift 3 API滥用:尝试在非拥有协调器上序列化存储访问