【问题标题】:iOS crash in CFStringGetLength in CoreFoundationiOS 在 CoreFoundation 中的 CFStringGetLength 崩溃
【发布时间】:2011-08-04 07:50:23
【问题描述】:

我遇到了崩溃,在我看来,这似乎是 Apple 处理 MKMapView 的goToDefaultLocation 消息的方式中的一个错误。该消息依次调用[ALCityManager localeWithCode:],后者调用[NSLocale componentsFromLocaleIdentifier:],后者调用CFLocaleCreateComponentsFromLocaleIdentifier,后者又调用CFStringGetLength,然后发生崩溃。

如果是我的代码导致了这个问题,或者,如果实际上这是 Apple 代码中的一个错误(不太可能? ?)。

崩溃日志如下:

事件标识符:84198BB6-45BD-493B-955F-75CCB5246DDD CrashReporter 密钥:7dbf53bf1f1a3635d7c3c49e726dedc609ed9f3a 硬件型号:iPhone3,1 进程:MyApp [340] 路径:/var/mobile/Applications/DCE9A5A1-8E24-4D4F-A1ED-9855C6CA1742/MyApp.app/MyApp 标识符:MyApp 版本: ??? (???) 代码类型:ARM(本机) 父进程:launchd [1] 日期/时间:2011-03-25 10:36:06.382 -0700 操作系统版本:iPhone OS 4.3 (8F190) 报告版本:104 异常类型:EXC_BAD_ACCESS (SIGBUS) 异常代码:0x00000000 处的 KERN_PROTECTION_FAILURE 崩溃的线程:0 线程 0 名称:调度队列:com.apple.main-thread 线程 0 崩溃: 0 核心基础 0x00009a66 CFStringGetLength + 6 1 CoreFoundation 0x0002f994 CFLocaleCreateComponentsFromLocaleIdentifier + 60 2 CoreFoundation 0x000483b8 +[NSLocale componentsFromLocaleIdentifier:] + 12 3 AppSupport 0x00016eee -[ALCityManager localeWithCode:] + 130 4 MapKit 0x00038488 - [MKMapView goToDefaultLocation] + 80 5 基础 0x000907c6 __NSFireTimer + 130 6 核心基础 0x00075a40 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 8 7 核心基础 0x00077ec4 __CFRunLoopDoTimer + 844 8 核心基础 0x0007883e __CFRunLoopRun + 1082 9 核心基础 0x00008ebc CFRunLoopRunSpecific + 224 10 核心基础 0x00008dc4 CFRunLoopRunInMode + 52 11 图形服务 0x00004418 GSEventRunModal + 108 12 图形服务 0x000044c4 GSEventRun + 56 13 UIKit 0x0002ed62-[UIApplication_run] + 398 14 UIKit 0x0002c800 UIApplicationMain + 664 15 MyApp 0x000023f0 主 (main.m:34) 16 我的应用程序 0x00002370 开始 + 44

【问题讨论】:

  • 除非您发布代码,否则很难知道您的代码中是否存在错误。 goToDefaultLocation 不是 MKMapView 的文档化公共方法。发生此崩溃时,您实际上在代码中做了什么?
  • Nothing -> 崩溃发生在启动时。

标签: iphone ios ipad mapkit mkmapview


【解决方案1】:

我得到了完全相同的崩溃报告,仅适用于 iOS 4.3 / 4.3.1 和 iPhone 3GS/4 (armv7)

我认为这是一个 Apple Bug,iOS4.3 有其他关于 MapKit 的丑陋回归。 (就像MKReverseGeocoder 提前发布崩溃...)

  1. 一个简单的解决方法是覆盖-[MKMapView goToDefaultLocation],但由于它是一个私有 API,因此有被 Apple 拒绝的风险...... (因错误解决方法而被拒绝......我知道......人很卑鄙)

  2. 另一种解决方案是分析 (reverse...) CFLocaleCreateComponentsFromLocaleIdentifiercomponentsFromLocaleIdentifier:[ALCityManager localeWithCode:] 以了解它是如何崩溃的,被 nil 调用语言环境标识符,并且可能以编程方式修复应用程序语言环境,因为它看起来像是从设备设置(或更糟糕的是,从城市/地理位置)确定用户的语言环境......或者至少警告用户它的语言环境设置可能会导致麻烦...... 我不能(/不想)做的事情,无法重现该错误。

【讨论】:

  • 谢谢!这也符合我的想法。 幸运的是,看到崩溃的客户将带着他的设备进入办公室 - 希望我可以用手中的崩溃设备修复/解决它,然后评论修复(错误,可能,解决方法)。
  • 很高兴听到这个消息,请确保 1. 在运行时检查其语言环境,可能是 - [NSLocale currentLocale] 2. 尝试使用 gdb 到 fb -[ALCityManager localeWithCode:] 和它的 朋友 在堆栈跟踪中断点之前崩溃和分析寄存器等等......如果你能阅读一些arm汇编代码,也许可以一步一步来......我希望你能找到修复并分享你的经验!跨度>
  • 抱歉忘记更新。你是对的,文森特,经过几次与 Apple 支持的反复讨论,这确实是 Apple 的问题。非常感谢您的帮助!
  • P.S.解决方法是将语言环境设置为 En 以外的其他内容,然后将其重新设置。供参考。等待修复。
  • P.S.我不知道“检测”它。它只是很少发生。如果有人在启动时报告奇怪的崩溃,请发布引用已知 Apple 崩溃的免责声明,并指示他们转到设置->常规->国际->区域格式并将其设置为“美国”以外的其他内容,然后把它放回去。
【解决方案2】:

你的异常代码是EXC_BAD_ACCESS。这通常是一个内存管理错误(即一些代码试图访问一个已经被释放/释放的对象)。

这可能是 Apple/框架代码中的错误,但可能性很小。您更有可能在代码中的某个地方过度释放某些东西或挂在自动释放的对象实例上,或者以其他方式访问不应访问的东西。

鉴于崩溃发生在 MapKit 中,我建议您查看与地图相关的代码,以了解此崩溃的可能来源。请注意,MapKit 可能有点喜怒无常;当用户关闭位置服务时尝试访问 LocationManager 的当前位置时,我已经看到了崩溃。我希望这种情况会失败(例如,通过返回 nil 位置),但不会导致应用程序崩溃。

【讨论】:

  • 是的,我意识到“EXC_BAD_ACCESS”是什么,并且我已经尝试查看我的所有 Mapkit 引用,以查找错误版本等。问题实际上在于,在数百个中的设备,我们只在 2 上看到这种崩溃,而且,崩溃似乎只是在 iOS 4.3 发布后才开始发生。此外,崩溃发生在应用程序启动时,这使得确定某些内容可能被过度释放或设置为 nil 等的原因/位置变得更加困难(即,当崩溃发生时,那时我的代码尚未触摸任何与 MapKit 相关的东西)。
  • 我会继续寻找,但似乎 MapKit 对“goToDefaultLocation”的调用以某种方式导致了导致 CFStringGetLength 崩溃的位置......
  • 最好能得到它发送给[ALCityManager localeWithCode:] 的代码以及它如何确定它。试过断点吗?
  • 看那个:stackoverflow.com/questions/3327828/… 我认为你需要的是 1. 在 gdb 中 fb -[ALCityManager localeWithCode:] 2. 在断点命中 po $r0
  • 忘记更新这个 -> 原来这是 Apple 代码中每个 iOS 4.3 更新的错误。解决方法是将语言环境设置为 En 以外的其他内容,然后将其设置回来。供参考。等待修复。
猜你喜欢
  • 2015-03-28
  • 1970-01-01
  • 1970-01-01
  • 2013-07-31
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-08
相关资源
最近更新 更多