【问题标题】:iOS EXC_BAD_ACCESS Attempted to dereference garbage pointer TwilioPocoiOS EXC_BAD_ACCESS 试图取消引用垃圾指针 TwilioPoco
【发布时间】:2019-01-27 03:09:26
【问题描述】:

我很难弄清楚我在 sentry 和 crashlytics 上看到的这个问题。我不确定如何复制该错误,并且堆栈跟踪对我来说有点神秘。有人有什么主意吗?

OS Version: iOS 11.4.1 (15G77)
Report Version: 104

Exception Type: EXC_BAD_ACCESS (SIGBUS)
Exception Codes: BUS_NOOP at 0x0000000102cb2c30
Crashed Thread: 8

Application Specific Information:
Final state > onDisconnectedImpl >>  > pMethodNf > src/ActiveDispatcher.cpp >
Attempted to dereference garbage pointer 0x102cb2c30.

Thread 8 Crashed:
0   <unknown>                       0x102cb2c30         _ZTVNSt3__120__shared_ptr_emplaceIN5boost4asio20basic_waitable_timerINS_6chrono12steady_clockENS2_11wait_traitsIS5_EENS2_22waitable_timer_serviceIS5_S7_EEEENS_9allocatorISA_EEEE
1   TwilioChatClient                0x102a81588         rtd::TNTwilsockClient::onDisconnectedImpl(std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::shared_ptr<rtd::TNTwilsockClient> > const&)
2   TwilioChatClient                0x102a9397c         TwilioPoco::ActiveRunnable<void, std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::shared_ptr<rtd::TNTwilsockClient> >, rtd::TNTwilsockClient>::run()
3   TwilioChatClient                0x1027fb47c         TwilioPoco::ActiveDispatcher::run()
4   TwilioChatClient                0x1027f802c         TwilioPoco::ThreadImpl::runnableEntry(void*)
5   libsystem_pthread.dylib         0x3037d8220         <redacted>
6   libsystem_pthread.dylib         0x3037d8110         _pthread_start

【问题讨论】:

  • 当 Twilio Chat 的 websocket 连接断开时,这似乎发生了一些事情。您是否有在断开连接时运行的委托方法?能故意断开聊天客户端吗?

标签: ios twilio


【解决方案1】:

由于在 NSLocalizedString 中使用了不正确的类型,我遇到了同样的问题。

static func errorCodeFormatter(_ errcode: Int) -> String {
   let formatter = NSLocalizedString("Error (%@)", comment: "comment")
   return String(format: formatter, errcode)
}

调用此函数将崩溃并显示相同的错误消息。解决办法是把errCode改成String,或者把string param改成@d

所以下面的任何一个选项都可以为我解决这个问题:

static func errorCodeFormatter(_ errcode: String) -> String {
   let formatter = NSLocalizedString("Error (%@)", comment: "comment")
   return String(format: formatter, errcode)
}

或者:

static func errorCodeFormatter(_ errcode: Int) -> String {
   let formatter = NSLocalizedString("Error (%d)", comment: "comment")
   return String(format: formatter, errcode)
}

【讨论】:

    【解决方案2】:

    我第一次尝试回答的细节不够详细,无法提供帮助 - 抱歉。让我们再试一次。

    根据应用程序特定信息Attempted to dereference garbage pointer,以及您在分配器中的几帧这一事实,我相信您遇到了堆损坏。这类崩溃真的很难调试。

    堆损坏是内存损坏的一种特殊情况,很难追踪。主要原因是堆栈跟踪通常根本没有捕获损坏的来源。通常,崩溃只是症状。

    您甚至无法确信 TwilioChatClient 库对此负责。对于一个不相关的系统来说,只覆盖 Twilio 使用的一点内存是完全有可能的,而且很常见。更糟糕的是,这可能在现在无效的内存被使用之前发生得更早。

    在这些情况下我一般建议:

    • 查找其他看起来与内存损坏相关的崩溃
    • 在 Instruments 中试用 Zombies
    • 试试 malloc scribble 或 guardmalloc,这两个很好的内存调试工具

    很难,甚至通常不可能推断堆损坏。复制错误也可能是不可能的,因为内存损坏崩溃通常不是确定性的。

    因此,请尝试尽可能多地查找并解决问题。完全有可能其中一个负责各种崩溃,其中一个可能就是这个。

    【讨论】:

    • 感谢大家的建议和细心的节制。我已经大大扩展了我的答案,希望它现在更有帮助。
    猜你喜欢
    • 2013-08-21
    • 2020-06-05
    • 1970-01-01
    • 2016-04-16
    • 2016-05-16
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 2011-06-07
    相关资源
    最近更新 更多