我想试着象征我的iPhone应用程序的崩溃报告.
我从iTunes Connect检索了崩溃报告.我有我提交到App Store的应用程序二进制文件,我有作为构建的一部分生成的dSYM文件.
我将所有这些文件放在一个由聚光灯索引的目录中.
现在怎么办?
我试过调用:
symbolicatecrash crashreport.crash myApp.app.dSYM
Run Code Online (Sandbox Code Playgroud)
它只是输出崩溃报告中的相同文本,而不是符号化.
难道我做错了什么?
我有BugSense的崩溃报告,因此我有关于崩溃的内存位置的信息,但它们没有象征性.此外,Bug Sense不会发送传统的崩溃报告,但仍会给我一个bug跟踪.因此,我尝试使用Atos来获取崩溃的确切位置.我已经在XCode 4中存档了应用程序并使用该版本提交到应用程序商店,因此我有一个dSYM文件.我运行了以下代码:
atos -arch armv7 -o MyApp.app.dSYM 0x001057e9
Run Code Online (Sandbox Code Playgroud)
但是,我没有得到正确的输出,而是收到错误:
atos cannot load symbols for the file MyApp.app.dSYM for architecture armv7
Run Code Online (Sandbox Code Playgroud)
有关为什么会发生这种情况的任何建议?我没有从应用程序中删除调试符号.
问题是,当PLCrashReporter报告的堆栈跟踪地址符号化时,不会返回实际的系统框架/库符号行.我的应用程序行虽然显示了符号化的正确违规行.
一些配置.我在我的OSX 10.9.5上安装了Xcode 5.1.1和Xcode 6.0.1.
使用Xcode 5.1.1并检查设备日志时,我可以看到崩溃,尽管崩溃报告中不会发生任何符号.
使用Xcode 6.0.1崩溃我的应用程序并检查设备日志,我可以看到报告符号正确.
在任何情况下,Atos都不会返回正确的Apple系统框架/库符号行.它只返回与相应框架/库无关的垃圾.请参阅下面的示例.
详细说明了我使用PLCrashReporter向我报告的崩溃堆栈跟踪以及与设备日志符号化报告的比较.
这是使用PLCrashReporter unsymbolicated报告的堆栈跟踪:
0 libsystem_platform.dylib 0x000000019726ce5c 0x197268000 + 20060
1 libsystem_c.dylib 0x00000001971253e0 0x197124000 + 5088
2 MyNewPlugin 0x000000010003ac70 0x10002c000 + 60528
3 UIKit 0x000000018d5f90b0 0x18d5b0000 + 299184
4 UIKit 0x000000018d5f9044 0x18d5b0000 + 299076
5 UIKit 0x000000018d5e2520 0x18d5b0000 + 206112
6 UIKit 0x000000018d5f8a44 0x18d5b0000 + 297540
7 UIKit 0x000000018d5f86d8 0x18d5b0000 + 296664
8 UIKit 0x000000018d5f3370 0x18d5b0000 + 275312
9 UIKit 0x000000018d5c4b50 0x18d5b0000 + 84816
10 UIKit 0x000000018d5c2c40 0x18d5b0000 + 76864
11 …Run Code Online (Sandbox Code Playgroud) 我正在尝试调试一些并发代码,当我记录[NSThread callStackSymbols]; 控制台显示我感兴趣的大部分符号为<redacted>.
有没有办法在运行时解决这个问题?我删除了设备符号文件夹,但Xcode重新符号似乎没有解决问题.
还有一些其他问题,但他们似乎都试图在崩溃文件上解决这个问题.
如何在调试控制台中查看框架符号的方法名称?
我正在运行Xcode 5.
我已经从 iOS 应用程序的 dSYM 文件中解析出地址、文件名和行号。我基本上有一个将地址映射到文件名和行号的表,这对于调试非常有帮助。
为了获取actual lookup address,我使用崩溃报告中的堆栈跟踪地址并使用此答案中指定的公式:/sf/answers/950321991/。所以像这样的事情。
(actual lookup address)
= (stack trace address) + (virtual memory slide) - (image load address)
Run Code Online (Sandbox Code Playgroud)
我使用该地址并在我的桌子上查找它。我得到的文件名是正确的,但行号始终指向被调用的函数或方法的末尾,而不是调用堆栈跟踪上的以下函数的实际行。
我在某处读到,不记得在哪里,必须取消标记帧地址,因为它们对齐到系统指针大小的两倍。因此,对于 32 位系统,指针大小为 4 字节,因此我们使用 8 字节进行脱标记,使用如下公式:
(de-tagged address) = (tagged address) & ~(sizeof(uintptr_t)*2 - 1)
Run Code Online (Sandbox Code Playgroud)
其中uintptr_t是 Objective-C 中指针使用的数据类型。
完成此操作后,查找就可以工作了,但我必须做一些事情,例如找到小于或等于去标记地址的最近地址。
问题#1:
为什么我必须取消堆栈帧地址的标记?为什么堆栈跟踪中的地址没有指向正确的位置?
问题#2:
有时崩溃报告中似乎缺少帧。例如,如果function1()调用function2()哪个调用function3()哪个调用function4(),在我的堆栈跟踪中我会看到类似的内容:
0 Exception
1 function4()
2 function3()
4 function1()
Run Code Online (Sandbox Code Playgroud)
即使在取消标记之后,(上面第 2 帧)的堆栈跟踪地址function3() …
我有分配仪器的快照和有趣符号的地址:

我想知道,这个地址在代码中.我有相应的dSYM文件.我试图使用atosym命令行工具,但它给了我错误的符号(与我的应用程序无关).
怎么弄?
PS:二进制文件是由XCode 4.3.2构建的,代码语言是C++,armv7架构,发布构建配置.