美文网首页
iOS crash 文件符号化

iOS crash 文件符号化

作者: 传说中的汽水枪 | 来源:发表于2019-06-17 15:59 被阅读0次

    找到symbolicatecrash 命令行工具

    find /Applications/Xcode.app -name symbolicatecrash -type f
    

    例如对于当前我的电脑出现的如下:

    /Applications/Xcode.app/Contents/Developer/Platforms/WatchSimulator.platform/Developer/Library/PrivateFrameworks/DVTFoundation.framework/symbolicatecrash
    /Applications/Xcode.app/Contents/Developer/Platforms/AppleTVSimulator.platform/Developer/Library/PrivateFrameworks/DVTFoundation.framework/symbolicatecrash
    /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/PrivateFrameworks/DVTFoundation.framework/symbolicatecrash
    /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
    

    复制symbolicatecrash到一个指定目录,例如:/xxxx/symbol

    因为主要是在iOS下,所以
    复制iPhoneSimulator.platformsymbolicatecrash

    定义路径

    export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer
    

    如果不定义就会出现:

    Error: "DEVELOPER_DIR" is not defined at ./symbolicatecrash line 69.
    

    准备好崩溃日志文件和dsym文件

    日志文件有可能的扩展名是: .crash, .ips,不用更改其扩展名
    把日志文件和dsym文件放到同一个文件夹下,例如:/xxxx/symbol
    可以通过如下的命令来查看dsym文件的uuid,然后通过uuid与崩溃日志的uuid进行比较来判断是否匹配

    dwarfdump --uuid xxxxxx.DSYM
    

    进入/xxxx/symbol目录下,并执行:

    ./symbolicatecrash xxx.xxx xxx.dsym > xxxx.crash
    
    1. 一定要是./symbolicatecrash 而不能是symbolicatecrash
    2. xxx.xxx 是崩溃日志文件,就是一个普通的文本文件
    3. xxx.dsym dsym文件
    4. xxxx.crash 符号化后的日志文件

    例外

    在执行:

    dwarfdump --uuid xxx.DSYM
    

    出现了:

    xxx.dSYM/Contents/Resources/DWARF: No such file or directory
    

    原因是:
    右击xxx.dSYM显示包内容的时候:

    image.png

    所以导致在符号化后的日志中,系统库都被正确的符号化了,但是自己的库一个都没有符号化。

    这个时候的解决办法就是:

    1. 复制你需要符号化后的dsym,例如:app-study-iPad-dev-adhoc.app.dSYMAFNetworking.framework.dSYM
    2. 使用如下的命令:
    ./symbolicatecrash xxx.ips app-study-iPad-dev-adhoc.app.dSYM,AFNetworking.framework.dSYM > xxx.symbol.crash
    

    多个dSYM文件使用,隔开,这样就能符号化相关库的代码了。

    例外 有的时候还出现无法符号化

    例如:

    Thread 40 name:  Dispatch queue: com.apple.root.default-qos
    Thread 40 Attributed:
    0   libcompiler_rt.dylib            0x3820f660 0x3820b000 + 18016
    1   libcompiler_rt.dylib            0x3820f40e 0x3820b000 + 17422
    2   libsystem_c.dylib               0x382cf1c4 0x382c1000 + 57796
    3   app                                 0x0060adc8 0x4000 + 6319560
    4   libdispatch.dylib               0x3827e5c8 0x38266000 + 99784
    5   libdispatch.dylib               0x382775e0 0x38266000 + 71136
    6   libdispatch.dylib               0x3827448e _dispatch_root_queue_drain + 386
    7   libdispatch.dylib               0x3827589e _dispatch_worker_thread3 + 102
    8   libsystem_pthread.dylib         0x383e9da6 _pthread_wqthread + 666
    9   libsystem_pthread.dylib         0x383e9af8 start_wqthread + 4
    
    

    例如 3 这一行,就无法符号化了,这个时候可以使用如下的命令来符号化(只符号化那一行):

    atos -o app.dSYM/Contents/Resources/DWARF/app -l 0x4000 0x0060adc8 armv7
    

    其中armv7 换成你的崩溃日志文件中的用到的CPU架构

    参考

    iOS基础之崩溃日志符号化
    iOS app crash日志符号化解析

    相关文章

      网友评论

          本文标题:iOS crash 文件符号化

          本文链接:https://www.haomeiwen.com/subject/nygafctx.html