- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
我通过 AirBrake.io 收到了一份没有符号化的崩溃报告。由于崩溃报告与 Apple 崩溃日志的格式不完全相同,我不能像往常一样将它放在 XCode 上,所以我从我的 XCode 存档中获取了完全相同的构建,试图在命令行上对其进行符号化。结果如下:
$ atos -o kidsapp.app/kidsapp 0x0002fc4c
0x0002fc4c (in kidsapp)
我绝对确定我使用的是与崩溃报告来源相同的版本。所以我也尝试了 dwarfdump:
$ dwarfdump --lookup 0x0002fc4c --arch armv7 kidsapp.app.dSYM
----------------------------------------------------------------------
File: kidsapp.app.dSYM/Contents/Resources/DWARF/kidsapp (armv7)
----------------------------------------------------------------------
Looking up address: 0x000000000002fc4c in .debug_info... not found.
Looking up address: 0x000000000002fc4c in .debug_frame... not found.
同样没有结果。除了使用错误的 dSYM 文件之外,还有什么我可能做错的吗?我知道它是正确的,因为这是 AirBrake 崩溃报告中提到的版本,它在我的 XCode 存档中。
欢迎任何想法/提示!
最佳答案
我使用了以下算法来计算:
slide
+ stack address
- load address
= symbol address
和
stack address
是我从堆栈转储崩溃报告中获得的十六进制值(不是 .crash 文件,只是堆栈转储)。
和
slide
是运行时 LC_SEGMENT cmd 的 vmaddr otool -arch armv7 -l APP_BINARY_PATH
.我的通常最终是 0x00001000。
和
load address
是复杂的一 block 。它实际上是主线程的最底部堆栈地址与运行时我的二进制文件中包含符号的部分的第一个地址之间的差异 dwarfdump --arch armv7 --all DSYM_BINARY_PATH
.这只是 main
的符号地址功能。所以如果你最底部的崩溃地址是 0x8000 而你的主函数的符号地址是 0x2000 那么你的 load address
是 0x6000。
现在有了所有这些片段,我可以计算符号地址并将其放入 atos 或 dwarfdump 中:dwarfdump --lookup SYM_ADDR --arch armv7 APP_BINARY_PATH
.
转储示例(您可以看到 load address
是 0x00003af4):
----------------------------------------------------------------------
File: /Users/user/Desktop/MyApp.xcarchive/dSYMs/MyApp.app.dSYM/Contents/Resources/DWARF/MyApp (armv7)
----------------------------------------------------------------------
0x00000024: [0x00003af4 - 0x00003b4e) main
0x00000098: [0x00003b50 - 0x00003d8c) -[MyAppDelegate application: didFinishLaunchingWithOptions:]
... the rest of the dump
最困难的部分是意识到我包含的 2 个静态库之一在链接到我的应用程序的二进制文件之前删除了它们的符号!这留下了巨大的符号地址缺口,所以我最终只得到了我的 dSYM 中所需符号的三分之二。
确保在您的静态库 xcode 项目中将以下标志设置为 NO,这样当您链接到它时,您可以将符号拉入您的应用程序的二进制文件(稍后可以删除):COPY_PHASE_STRIP
, DEAD_CODE_STRIPPING
, 和 STRIP_INSTALLED_PRODUCT
.
现在你可能会问,“如果堆栈转储不包括 main 函数,我该怎么办,因为它不在主线程上,所以我无法获取 main 函数的堆栈地址?”。对此我会回答,“我他妈的一点线索都没有!”。祈祷你能得到包含符号地址的堆栈跟踪,或者使用模仿 Apple 崩溃日志的崩溃报告系统,如 PLCrashReporter。
[2013 年 5 月 26 日编辑]-
我注意到 load address
实际上是 mach-o 二进制文件的地址。虽然我上面描述的通常可以工作——但实际上并不正确。这可以通过 CRASH REPORT 获得,但是这个答案的重点是在您没有崩溃报告时提供崩溃的符号。我找出 load address
的最好方法当想要符号化时,请确保我记录了 load address
与 stack addresses
.
我个人创建了一个系统来记录崩溃(不是崩溃报告)并将它们发送到一个 S3 存储桶,我可以稍后在其中检索它们以进行调试。当我启动我的应用程序时,我缓存 slide
, load address
和 main function address
如果我的应用程序崩溃并且我发送了 stack addresses
时使用.
注意:dyld 函数使用 #include <mach-o/dyld.h>
slide
= _dyld_get_image_vmaddr_slide(0)
返回的地址
load address
= _dyld_get_image_header(0)
返回的地址
main function address
= [NSThread callStackReturnAddresses]
中的最后一个地址什么时候在主线程上调用
在崩溃时我肯定会记录 [NSThread callStackReturnAddresses]
和 [NSThread callStackSymbols]
以及可以通过此方法检索的体系结构:
- (NSString*) arch
{
NSString* arch =
#ifdef _ARM_ARCH_7
@"armv7";
#elif defined (_ARM_ARCH_6)
@"armv6";
#else
nil;
#endif
return arch;
}
虽然我还不知道如何区分 armv7 和 armv7s。
所以这在将来可能会有所帮助。我计划利用我所学的一切并将其变成一个简单的崩溃工具——比 natos 工具(可能是 natos v2)更好。
我已经更新了 natos 以支持提供 load address
手动:https://github.com/NSProgrammer/natos
关于ios - atos 和 dwarfdump 不会代表我的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10242766/
我有几个系统使用 docker-compose 并且没有问题。 但是,我在这里有一个“向下”根本不做任何事情的地方。 'up'虽然完美。这是在 MacOS 上。 该项目的昵称是“ Storm ”,脚本
解释起来确实很奇怪,所以就这样...... 我正在从 phpmyadmin 获取包含未转义单引号的数据。我正在尝试转换'至'通过使用Content-Type: text/html;在 php
伙计们?在这里需要一些帮助。我使用委托(delegate)协议(protocol)将一些字符串从“第二个 View Controller ”传回给它的前一个。 我的数组附加了我在委托(delegate
我有以下 eval() 东西: c = Customer() eval("c.name = row.value('customer', '{c}')".format(c=column_name), {
我写了这个测试类: @ContextConfiguration(locations = { "classpath:/test/BeanConfig.xml" }) public class Candi
我这样写代码: @ContextConfiguration(locations = { "classpath:/test/BeanConfig.xml" }) @RunWith(SpringJUnit
假设我更改了文件,然后进行 pull 。 Git 会报错,因为本地仓库还没有保存,将被覆盖。如果我然后删除该添加并使文件与以前相同(与远程 repo 相同),那么会发生 pull 吗? 最佳答案 是的
我正在阅读《Java for Dummies》一书,但遇到了问题。我不明白为什么 @Override 不起作用。我确信这与我的代码有关,因为我之前已经获得了一个多态数组来使用覆盖,但它对我来说太简单了
我从我的项目中提取了这段代码,因为我试图找到我犯的一个错误,该错误使我的 BeginStoryboard 无法自行停止。我尽可能地简化了代码,但仍然没有发现问题。你认为它可能是什么?
这个问题在这里已经有了答案: Difference between char[] and char * in C [duplicate] (3 个答案) 关闭 7 年前。 我想我知道自己问题的答案,
我一直在使用 java 的 Scanner 类时遇到问题。我可以让它很好地读取我的输入,但问题是当我想要输出一些东西时。给定多行输入,我想在完全读取所有输入后只打印一行。这是我用来读取输入的代码:
对于这个问题,我已经用最简单的术语表达了这一点。 如果元素被点击,'active'类被添加到元素,'active'类从其他元素中移除。 但是,如果该元素是“事件的”并且它被第二次单击,则“事件”类不应
这会在桌面上创建一个新文件夹,但不会将文件夹 .pfrom 的内容 move 到文件夹 .pTo。 int main() { SHFILEOPSTRUCT sf = {0}; TCHA
我有一个关于多线程调试 DLL (/MDd) 和多线程调试 (/MTd) 设置的问题。它们之间的区别很明显:一个是使用动态库,一个是使用静态库。当我使用/MDd 编译我的程序时,一切都进行得很好。但是
我的问题是,如果我在页面加载时创建一个克隆变量,jQuery 只会 append 它一次。奇怪! Click to copy This is an element! $(document)
所以...我是一个开发 django 应用程序的新手,但是当我尝试通过 virtualbox heroku 运行 heroku run python manage.py syncdb 时,它一直在下面
我在 Spring Boot 初始化时遇到了问题。我在一个简单的 Spring Boot 项目中有这个结构。 com.project.name |----App.java (Annoted with
我在 www.7hermanosmx.com/menu.php 页面上有以下代码 - 一切正常,除了黄色框(类 menuholder)应该每行三个相互 float 。他们坚决拒绝这样做!我知道我做错了
我正在尝试在我正在构建的小型网站上添加一个下拉菜单。出于某种原因,我可以获得我想要向下滑动到 fadeOut() 的 div 并执行其他类似的操作,但我无法将它获取到 slideDown()。我不知道
我有一个不能正确 float 的 div。当您切换可见性时,它会覆盖一些当前文本,但我可以稍后移动它。只是好奇为什么它不能正确 float ! Simple Tabs with CSS &am
我是一名优秀的程序员,十分优秀!