64

我正在查看 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 查找与地址位置0x0006573a0x0004fb26对应的代码行时,我得到了完全不同的匹配。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 的结果相同。

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

4

4 回答 4

109

一个更简单的替代方案:您可以使用该atos -l标志让它为您计算。

假设您在崩溃日志中有以下要符号化的行:

5   MyApp                   0x0044e89a 0x29000 + 4348058

第一个十六进制数是堆栈地址,第二个十六进制数是加载地址。您可以忽略最后一个数字。您也不必担心幻灯片地址。

要进行符号化,请执行以下操作:

atos -o MyApp.app/MyApp -arch armv7 -l 0x29000 0x0044e89a

如果您找不到您的 MyApp.app/MyApp 文件,请将您的“.ipa”文件重命名为“.zip”,解压缩它,它将位于 Payload 文件夹中。

如果您不确定要使用哪种架构(例如 armv7 或 armv7s),请滚动到崩溃文件的“二进制图像”部分,您可以在其中找到它。

干杯

于 2013-10-09T23:18:28.163 回答
96

您必须计算与 atos 一起使用的地址,您不能只使用堆栈跟踪中的地址。

symbol address = slide + stack address - load address
  1. slide值是vmaddrin的值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为实际可执行文件的路径。

  2. stack address是崩溃报告中的十六进制值。

  3. load address可以是在Binary Images包含可执行文件的行的最前面部分中显示的第一个地址。(通常是第一个条目)。

因为在过去的值slide等于load addressthis 的值总是有效的。但由于 Apple 从 iOS 4.3 开始引入地址空间布局随机化(在不同的变体中),出于安全原因,应用程序加载地址是随机的。

于 2012-11-27T01:22:50.137 回答
11

只需使用 dwarfdump:

dwarfdump --arch armv7 myApp.dSYM --lookup 0xaabbccdd | grep 'Line table'

根本不需要做任何计算。

(来自按地址获取符号(符号化二进制,iOS 构建))。

于 2013-10-12T00:50:21.707 回答
3

对于某些时间没有像这样的加载地址值的人:

Jan 14 11:02:39 Dennins-iPhone AppName[584] <Critical>: Stack Trace: (
    0   CoreFoundation                      0x2c3084b7 <redacted> + 150
    1   libobjc.A.dylib                     0x39abec8b objc_exception_throw + 38
    2   CoreFoundation                      0x2c21cc35 CFRunLoopRemoveTimer + 0
    3   AppName                             0x0005a7db AppName + 272347  

我创建了一个简单的 bash 来帮助我调试:

#! /bin/bash
read -p "[Path] [App Name] [Stack Address] [DecimalSum] " path appName stackAddress decimalSum
loadAddress=`echo "obase=16;ibase=10;$((stackAddress-decimalSum))" | bc`
atos -o $path/Payload/$appName.app/$appName -l $loadAddress $stackAddress -arch armv7

它只是读取应用程序的路径、应用程序名称、堆栈地址和“+”信号后的值(十进制值),然后找到加载地址的值来运行 atos 命令。

于 2015-01-14T16:31:19.563 回答