iOS崩溃报告:atos无法按预期工作

Geo*_*ell 58 iphone crash-reports symbolicate symbolicatecrash ios

我正在查看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
Run Code Online (Sandbox Code Playgroud)

有趣的是,当我使用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
Run Code Online (Sandbox Code Playgroud)

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

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

Chr*_*ris 100

一个更简单的选择:你可以使用atos -l标志让它为你做数学运算.

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

5   MyApp                   0x0044e89a 0x29000 + 4348058
Run Code Online (Sandbox Code Playgroud)

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

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

atos -o MyApp.app/MyApp -arch armv7 -l 0x29000 0x0044e89a
Run Code Online (Sandbox Code Playgroud)

如果找不到MyApp.app/MyApp文件,请将'.ipa'文件重命名为'.zip',解压缩,然后它将位于Payload文件夹中.

如果你不确定使用哪种架构(例如,armv7或armv7s),滚动到崩溃文件的"二进制图像"部分,你可以在那里找到它.

干杯

  • 请注意,如果您的应用程序不包含调试符号,您可以将-o部分替换为.dSYM文件中的符号(`MyApp.app.dSYM/Contents/Resources/DWARF/MyApp`) (10认同)
  • @chris你是天才 (3认同)
  • 我今天在从 OS X 应用程序符号化 .crash 日志时遇到了很多麻烦——显然 Xcode 已经有一段时间不支持 OS X 应用程序的符号化了,即使你有一个 .dSYM——你的回答让我能够最后得到一个崩溃的行号。谢谢! (2认同)
  • "+"之后的数字是十进制数,它是"堆栈地址 - 加载地址"的结果.所以你会发现第一个十六进制数是后两个数的总和. (2认同)

Ker*_*rni 90

你必须计算与atos一起使用的地址,你不能只使用stacktrace中的地址.

symbol address = slide + stack address - load address
Run Code Online (Sandbox Code Playgroud)
  1. slide值的值vmaddrLC_SEGMENT cmd(晴这是0x1000).运行以下命令:

    otool -arch ARCHITECTURE -l "APP_BUNDLE/APP_EXECUTABLE" | grep -B 3 -A 8 -m 2 "__TEXT"
    
    Run Code Online (Sandbox Code Playgroud)

    替换ARCHITECTURE崩溃报告显示的实际架构,例如armv7.替换APP_BUNDLE/APP_EXECUTABLE为实际可执行文件的路径.

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

  3. load address可就是在显示的第一个地址Binary Images,在其中包含可执行行的最前部.(通常是第一个条目).

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

  • 或者你可以使用`atos -l`并让它为你做数学运算.我也很确定"滑动"是指标称和实际加载地址之间的*差*,而不是加载地址本身. (9认同)

Cpn*_*nch 11

只需使用dwarfdump:

dwarfdump --arch armv7 myApp.dSYM --lookup 0xaabbccdd | grep 'Line table'
Run Code Online (Sandbox Code Playgroud)

根本不需要做任何计算.

(从地址获取符号(符号二进制,iOS构建)).

  • FWIW,dwarfdump对于我的armv7s拱门失败了,而用atos做数学运算. (2认同)