我正在查看Apple提供的崩溃报告

Hardware Model:      iPhone4,1
Version:         ??? (???)
Code Type:       ARM (Native)
Parent Process:  launchd [1]

Date/Time:       2012-11-18 16:03:44.951 -0600
OS Version:      iOS 6.0.1 (10A523)
Report Version:  104

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x51fe5264
Crashed Thread:  0

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libobjc.A.dylib                 0x352925b0 objc_msgSend + 16
1   MYAPP                           0x0006573a -[MyViewController(Images) didReceiveImage:context:etag:expires:] + 42
2   MYAPP                           0x0004fb26 -[MyImageTask didReceiveImage:] + 98
3   Foundation                      0x361ac8e8 __NSThreadPerformPerform
4   CoreFoundation                  0x3b37d680 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__
5   CoreFoundation                  0x3b37cee4 __CFRunLoopDoSources0
6   CoreFoundation                  0x3b37bcb2 __CFRunLoopRun
7   CoreFoundation                  0x3b2eeeb8 CFRunLoopRunSpecific
8   CoreFoundation                  0x3b2eed44 CFRunLoopRunInMode
9   GraphicsServices                0x396bc2e6 GSEventRunModal
10  UIKit                           0x3452e2f4 UIApplicationMain
11  MYAPP                           0x0004934a main + 70
12  MYAPP                           0x000492fc start + 36

有趣的是,当我使用atos查找与地址位置 0x0006573a 0x0004fb26 对应的代码行时,我得到了完全不同的匹配。 atos的输出甚至与崩溃日志中提到的同一类(MyViewController,MyImageTask)不同。相反,atos将我指向完全无关的类中的完全良性的代码行。我再次确认我正在使用提交给Apple的确切dSYM和IPA。

我的atos命令
/Applications/Xcode.app/Contents/Developer/usr/bin/atos -arch armv7 -o MYAPP.app/MYAPP 0x0004fb26

与/usr/bin/atos和armv7s相同的结果。

还有其他人遇到过这个问题吗?你能给些建议么?谢谢。

最佳答案

您必须计算要与atos一起使用的地址,而不能只使用stacktrace中的地址。

symbol address = slide + stack address - load address
  • slide的值是vmaddr中的LC_SEGMENT cmd的值(通常是0x1000)。运行以下命令以获取它:
    otool -arch ARCHITECTURE -l "APP_BUNDLE/APP_EXECUTABLE" | grep -B 3 -A 8 -m 2 "__TEXT"
    

    用崩溃报告显示的实际体系结构替换ARCHITECTURE,例如armv7
    APP_BUNDLE/APP_EXECUTABLE替换为实际可执行文件的路径。
  • stack address是崩溃报告中的十六进制值。
  • load address可以是包含可执行文件的行最前面的Binary Images部分中显示的第一个地址。 (通常是第一个条目)。

  • 由于过去slide的值等于load address的值,因此始终有效。但是,由于Apple从iOS 4.3开始引入了Address space layout randomization(具有不同的变体),出于安全原因,应用程序的加载地址是随机的。

    10-08 11:51