符号化的正确姿势

这篇具有很好参考价值的文章主要介绍了符号化的正确姿势。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

符号化的正确姿势,iOS开发,ios,crash,symbolicator,ips

GUI方式

将 .ips crash report 文件拖放到 Xcode > Window > Devices and Simulators > View Device Logs中, 然后导出 .crash 符号化文件.

使用条件: crash report 对应的 Archive 包是在本机构建的

symbolicatecrash

symbolicatecrash 是一个 exec (可执行文件), Xcode自带, iOS 15 之前的系统产生的 crash report, 可以直接被整个符号化, 文件路径可以通过 find 来查找1 , 结果是:

/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

使用方式参考如下示例:

// 若执行路径与文件路径不同, 需要补充完整的URI绝对路径
$ symbolicatecrash xxx.ips xxx.dSYM > symbolicated.crash

常见问题

1. Error: “DEVELOPER_DIR” is not defined at /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash line 69.

DEVELOPER_DIR是执行所依赖的环境变量, 解决办法如下:

```shell
$ export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer
```
2. Error: No crash report version in xxx.ips at /Applications/Xcode.app/…/symbolicatecrash line 1365.

iOS 15 及之后的版本产生的 crash report, 格式有变, 已经无法使用 symbolicatecrash 符号化

> **Xcode 13 Release Notes > Instruments > New Features**
> To support the new JSON-format crash logs generated in macOS Monterey and iOS 15, Instruments includes a new CrashSymbolicator.py script. This Python 3 script replaces the symbolicatecrash utility for JSON-format logs and supports inlined frames with its default options. For more information, see: CrashSymbolicator.py --help. CrashSymbolicator.py is located in the Contents/SharedFrameworks/CoreSymbolicationDT.framework/Resources/ subdirectory within Xcode 13. (78891800)
3. UUID2 不匹配
// 查看dSYM文件的UUID
$ dwarfdump --uuid <dSYM path>

atos命令

The atos command converts numeric (数字的) addresses to their symbolic (符号的) equivalents (复数, 等同物, 对应物). If full debug symbol information is available, for example in a .app.dSYM sitting beside a .app, then the output of atos will include file name and source line number information.

常用参数 (参数顺序没有要求)

  1. -o <binary-image-file> | <dSYM>

    The path to a binary image file or dSYM in which to look up symbols.

  2. -l <load-address>

    The load address of the binary image. This value is always assumed to be in hex, even without a “0x” prefix. The input addresses are assumed to be in a binary image
    with that load address. Load addresses for binary images can be found in the Binary Images: section at the bottom of crash, sample, leaks, and malloc_history reports.

  3. -arch architecture

    The particular architecure of a binary image file in which to look up symbols.

使用方式

// atos -arch 指令集 -0 dsym -l 调用地址 符号模块地址
// load adress:可执行指令部分相对镜像文件中的起始加载地址 address to symbolicate:调用函数的地址
atos -arch <Binary Architecture> -o <Path to dSYM file>/Contents/Resources/DWARF/<binary image name> -l <load address> <address to symbolicate>

示例

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libswiftCore.dylib              0x00000001cb264b00 specialized _fatalErrorMessage+ 2112256 (_:_:file:line:flags:) + 296
1   libswiftCore.dylib              0x00000001cb264b00 specialized _fatalErrorMessage+ 2112256 (_:_:file:line:flags:) + 296
2   libswiftCore.dylib              0x00000001cb070524 _ArrayBuffer._checkInoutAndNativeTypeCheckedBounds+ 62756 (_:wasNativeTypeChecked:) + 232
3   libswiftCore.dylib              0x00000001cb073510 Array.subscript.getter + 84
4   appName                             0x00000001005feba0 0x1004f0000 + 1108896
5   appName                             0x00000001005fcc88 0x1004f0000 + 1100936
6   appName                             0x00000001005fce84 0x1004f0000 + 1101444
7   UIKitCore                       0x00000001c9f180f0 -[UIApplication 
借助xcrun实现交互式
// 执行如下命令
$ xcrun atos -o appName.dSYM/Contents/Resources/DWARF/appName -l 0x1004f0000 -arch arm64
// 然后在换行处输入
0x00000001005feba0
// 终端输出
AppDelegate.updateRootViewController() (in ) (AppDelegate.swift:104)
直接使用 atos
// 解析整个
atos -o xxx.app.dSYM/Contents/Resources/DWARF/xxx -l 0x00000001c4fe7000 -arch arm64
// 解析单行
atos -arch arm64 -o xxx.app.dSYM/Contents/Resources/DWARF/xxx -l 0x00000001c4fe7000 0x00000001a2d6e29c

CrashSymbolicator.py

  • 脚本所在位置:

/Applications/Xcode.app/Contents/SharedFrameworks/CoreSymbolicationDT.framework/Versions/A/Resources/CrashSymbolicator.py

  • 怎样使用
// -d: dSYM符号表文件, -o: 输出符号化的文件, -p: iOS系统生成的crashReport
$ python3 CrashSymbolicator.py -d <dSYM> -o <symbolicated.crash> -p <xxx.ips>

思考

  1. 怎么查看 crash report 的 UUID ?

  1. 怎样使用find快速查找文件路径 ; ↩︎

  2. 什么是UUID ? ; ↩︎文章来源地址https://www.toymoban.com/news/detail-544240.html

到了这里,关于符号化的正确姿势的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • XCTest iOS Swift单元测试(1),涨姿势

    // // XCTestDemoTests.swift // XCTestDemoTests // // Created by Nvr on 2018/7/6. // Copyright © 2018年 ZY. All rights reserved. // import XCTest @testable import XCTestDemo class XCTestDemoTests: XCTestCase { var f1:Float? var f2:Float? override func setUp() { super.setUp() // Put setup code here. This method is called before the invocation of each test me

    2024年04月22日
    浏览(33)
  • java.io.EOFException异常的正确解决方法

    本文将探讨java.io.EOFException异常及其正确的解决方法。EOFException是Java I/O操作中常见的异常之一,通常表示程序试图读取文件或数据流的末尾之外的内容。我们将从报错问题、报错原因和解决方案三个方面详细解析这一异常,并提供有效的处理方法。 当Java程序在进行输入流操

    2024年04月29日
    浏览(45)
  • ios客户端学习笔记(五):学习Swift的关键字和容易弄混的符号

    新找到一篇文,也比较全 swift 5.1语法 1小时入门 下面是Swift语言中的常见及其说明和代码应用实例: class:定义一个类,用于封装一组相关的属性和方法。 示例代码: struct:定义一个结构体,用于封装一组相关的值类型数据。 示例代码: enum:定义一个枚举类型,用

    2023年04月22日
    浏览(47)
  • 已解决java.io.InterruptedIOException异常的正确解决方法,亲测有效!!!

    已解决java.lang.InterruptedIOException异常的正确解决方法,亲测有效!!! 文章目录 问题分析 报错原因 解决思路 解决方法 步骤一:捕获异常并识别中断源 步骤二:合理设计中断逻辑 步骤三:资源清理 步骤四:还原线程中断状态 总结 ​ 进行I/O操作时可能会遇到 java.io.Interru

    2024年01月25日
    浏览(47)
  • 已解决java.io.ObjectStreamException异常的正确解决方法,亲测有效!!!

    已解决java.lang.ObjectStreamException异常的正确解决方法,亲测有效!!! 文章目录 问题分析 报错原因 解决思路 解决方法 步骤一:检查对象的序列化兼容性 步骤二:处理serialVersionUID 步骤三:实现自定义的序列化方法 步骤四:确保类的可访问性 步骤五:异常处理和资源管理

    2024年01月19日
    浏览(39)
  • 已解决java.io.UnsupportedEncodingException异常的正确解决方法,亲测有效!!!

    已解决java.io.UnsupportedEncodingException异常的正确解决方法,亲测有效!!! 文章目录 问题分析 报错原因 解决思路 解决方法 步骤一:检查编码名称 步骤二:查询支持的编码 步骤三:使用通用字符编码 步骤四:异常处理 步骤五:环境配置 总结 在Java编程中,处理文本数据时经

    2024年01月19日
    浏览(50)
  • 5G时代音视频开发前景怎么样?音视频开发需要掌握哪些技术?(1),手把手教你5G时代Webview的正确使用姿势

    你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你

    2024年04月11日
    浏览(58)
  • 已解决java.io.FileNotFoundException: E:\work\work (拒绝访问。)的正确解决方法,亲测有效!!!

    已解决java.io.FileNotFoundException: E:workwork (拒绝访问。)的正确解决方法,亲测有效!!! 这个错误提示表示在指定路径下找不到名为\\\"work\\\"的文件。可能的原因是路径错误或文件不存在。请确保路径和文件名都是正确的,并且文件确实存在于指定的位置。 这个错误提示表示在指

    2024年02月07日
    浏览(45)
  • iOS开发进阶(二):走近iOS原生开发

    在应用 uni-app 进行跨平台APP开发过程中,发现并不支持视频播放小窗功能,且插件市场提供的插件用户体验不好,遂决定自行开发 uni-app 原生插件。 uni-app 原生插件指的是将原生开发的功能按照规范封装成插件包,然后即可在 uni-app 前端项目中通过 js 调用开发的原生能力。

    2024年02月12日
    浏览(35)
  • 已解决java.lang.RuntimeException: java.io.IOException: invalid constant type: 18异常的正确解决方法,亲测有效!!!

    已解决java.lang.RuntimeException: java.io.IOException: invalid constant type: 18异常的正确解决方法,亲测有效!!! java.lang.RuntimeException: java.io.IOException: invalid constant type: 18 ## 思路 这个错误通常出现在Java代码中使用了无效的常量类型。这可能是由于以下原因导致的: 版本不匹配:您正在

    2024年02月05日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包