如何对由苹果公司发出的Mac OSX崩溃报告进行符号化处理?

30

对于iOS崩溃报告,只需将其拖放到组织者中即可。

符号化iPhone应用程序崩溃报告

但是,这种方法不适用于Mac OSX崩溃报告。

我该如何符号化我的Mac OSX崩溃报告?

谢谢!!


20
这不是一个重复的问题,它是关于OS X应用而不是iPhone的。 - Cal
抱歉,我只是想插一句话;-) - Billy Gray
3个回答

56

你可以使用atos命令获取应用程序崩溃的行号。

以下是一个快速指南:

  1. 创建一个工作文件夹
  2. 打开Xcode,选择窗口->组织器,转到存档选项卡,找到发生崩溃的应用程序版本。
  3. 右键单击应用程序存档,选择“在查找器中显示”
  4. 右键单击.xarchive,选择“显示内容”,找到AppName.dSYM目录和应用程序并将它们复制到您的工作文件夹中。
  5. 将堆栈跟踪复制到您的工作文件夹中
  6. 打开终端并切换到您的工作文件夹。ls 命令应该会显示 YourApp.app、YourApp.app.dSYM 和 stacktrace.txt
  7. 在TextEdit中打开堆栈跟踪。您需要从标题(系统体系结构-例如 X86-64)中找到代码类型以及崩溃地址。搜索线程以找到崩溃线程(它将显示类似于“线程2崩溃”),然后找到您的对象。您需要从那一行获取两个地址(十六进制数字)以获取代码行。
  8. 一旦您获得了所有所需的信息,请在终端中运行以下命令:

    atos -o YourApp.app/Contents/MacOS/YourApp -arch x86_64 -l [load-address] [address]

例如,以下是从堆栈跟踪中提取的内容:

Process:         MyApp [228]
Path:            /Applications/MyApp.app/Contents/MacOS/MyApp
Identifier:      uk.co.company.app
Version:         1.0 (1)
App Item ID:     774943227
App External ID: 218062633
Code Type:       X86-64 (Native)
Parent Process:  launchd [154]
Responsible:     MyApp [228]
User ID:         501

Date/Time:       2013-12-17 10:20:45.816 +0100
OS Version:      Mac OS X 10.9 (13A603)
Report Version:  11
Anonymous UUID:  7AA662B1-7696-A2C5-AF56-9D4BA2CE9515


Crashed Thread:  2

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000

<snip>

Thread 2 Crashed:
0   libsystem_kernel.dylib          0x00007fff8b95a866 __pthread_kill + 10
1   libsystem_pthread.dylib         0x00007fff8bf4f35c pthread_kill + 92
2   libsystem_c.dylib               0x00007fff87571bba abort + 125
3   libsystem_malloc.dylib          0x00007fff897ae093 free + 411
4   uk.co.company.app           0x0000000103580606 0x10356e000 + 75270
5   uk.co.company.app               0x00000001035803da 0x10356e000 + 74714
6   com.apple.Foundation            0x00007fff8d00970b __NSThread__main__ + 1318
7   libsystem_pthread.dylib         0x00007fff8bf4e899 _pthread_body + 138
8   libsystem_pthread.dylib         0x00007fff8bf4e72a _pthread_start + 137
9   libsystem_pthread.dylib         0x00007fff8bf52fc9 thread_start + 13

我可以看到 "代码类型" 是 x86_64,第 2 线程崩溃了,在第 4 行代码运行时,我们有了需要的地址。根据这些信息,我执行以下操作:

$ atos -o MyApp.app/Contents/MacOS/MyApp -arch x86_64 -l 0x10356e000 0x0000000103580606

这将返回:

got symbolicator for MyApp.app/Contents/MacOS/MyApp, base address 100000000
obj_free (in MyApp) (somefile.c:135)

告诉我我的应用程序在somefile.c的第135行崩溃了。


3
我喜欢这个答案。在所有相关的SO答案中,这是唯一一个真正解释了应该如何做的。 - Kane Cheshire
4
我编写了一个名为Xsymbolicate的工具,它可以自动化大部分处理过程:http://www.mattrajca.com/xsymbolicate - Matt
4
谢谢@MattRajca,但是也可以注明这个工具是商业的,不是免费的。 - Motti Shneor
没有什么比创造出完美运行的东西更让人感到愉悦了。谢谢你,苹果。 - Duck
提示 - 如果您看到的不是“load-address”,而是您的应用程序名称(或任何其他二进制图像的名称),请在日志的“二进制图像”部分中查找实际地址。 - Arieleo
显示剩余2条评论

19

@inkjet的评论应该得到自己的答案。 他建立了一个可以从您的dsym和.crash文件中进行完整符号化的应用程序。

我制作了一个Sumbolon的免费替代品:bch.us.to/apps/macsymbolicator - 它以Rich Able下面描述的方式使用atos。- inket Dec 24 '13 at 4:39

将它们全部组合起来:

  1. 此处下载Mac Symbolicator

  2. 打开Xcode,选择“窗口”->“组织器”,转到存档选项卡并找到经历了崩溃的您的应用程序的版本。

  3. 右键单击应用程序存档并选择“在Finder中显示”

  4. 右键单击.xarchive,选择“显示内容”并找到AppName.dSYM目录

  5. 将您的.crash文件和AppName.dSYM拖到Sumbolon中

  6. 神奇的事情发生了


1
截至2016年6月,该链接仍然有效并发挥着它的作用。干得好,谢谢! - deko
这个应用程序对我来说很好用,可以将Mac应用程序崩溃的符号化。谢谢! - duncanc4
应用程序非常棒,但是否有可能将其适应“示例进程”输出?它生成的输出与.crash基本相同,但即使您将其重命名,应用程序也不接受它们。 - Shf
1
我的存档中没有 AppName.dSYM 目录,只有一个空的 dSYM 文件夹。 - Arthur Rees
链接已失效,我只能在不可信的下载网站上找到它。 - Lucas van Dongen
显示剩余2条评论

-1

这个链接

这个链接详细解释了如何使用行号来符号化崩溃日志。你只需要将.dsyms文件、.app文件和崩溃日志放在同一个文件夹中即可。

我找了很多资料,但没有比这更好的了。所以我希望这篇文章能帮到其他人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接