• ios手动符号表解析


    //
    //  ViewController.m
    //  demo
    //
    //  Created by
    //
    
    #import "ViewController.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        // 创建按钮
        UIButton *myButton = [UIButton buttonWithType:UIButtonTypeSystem];
        
        // 设置按钮的标题
        [myButton setTitle:@"点击我" forState:UIControlStateNormal];
        
        // 设置按钮的位置和大小
        myButton.frame = CGRectMake(100, 100, 100, 50); // (x, y, width, height)
        
        // 设置按钮的目标动作(点击事件处理器)
        [myButton addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];
        
        // 将按钮添加到视图
        [self.view addSubview:myButton];
    }
    
    // 定义点击事件处理器
    - (void)buttonTapped:(UIButton *)sender {
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths firstObject];
        NSLog(@"Documents Directory: %@", documentsDirectory);
        NSArray *array= @[@"a",@"b",@"c"];
        [array objectAtIndex:5];
        NSLog(@"按钮被点击了!");
    }
    
    @end
    
    

    模拟崩溃数组越界

    获取崩溃信息

    4   demo       0x0000000103164eb2
    

    获取Binary Images:

    0x103163000 -  0x103166fff hello.demo (1.0) 
    
    

    内存地址(Memory Address):内存中每个数据单元的唯一标识符,用于在运行时访问数据,即 0x0000000103164eb2

    基地址(Base Address):内存块或内存区域的起始地址,用于表示数据段或代码段的起始位置。即 0x103163000

    结束地址(End Address):内存块或内存区域的终止地址,用于表示该内存块的范围。即 0x103166fff

    计算偏移量

    0x0000000103164eb2 - 0x103163000 = 4346760882 - 4346753024 = 7858
    

    获取符号表 路径是 Xcode > Preferences > Locations 下的 Derived Data

    demo.app.dSYM
    

    解析来根据偏移量 7858 获取符号表中的原始行

    1e8b	1e9c	-[ViewController buttonTapped:]	ViewController.m:40
    1e9c	1ea0	-[ViewController buttonTapped:]	ViewController.m:41
    1ea0	1eba	-[ViewController buttonTapped:]	ViewController.m:41
    1eba	1ec8	-[ViewController buttonTapped:]	ViewController.m:42
    

    16进制转换10进制展示

    7819 7835 -[ViewController buttonTapped:]	ViewController.m:40
    7836 7839 -[ViewController buttonTapped:]	ViewController.m:41
    7840 7865 -[ViewController buttonTapped:]	ViewController.m:41
    7866 7879 -[ViewController buttonTapped:]	ViewController.m:42
    

    7858 在 (7866,7879) 这个区间内 为

    7840 7865 -[ViewController buttonTapped:]	ViewController.m:41
    

    再来看原始代码行号,验证找到的是正确的
    在这里插入图片描述

    解析符号表使用bugly提供的jar执行,即可

    java_opts=" -Xms512m -Xmx1024m -Dfile.encoding=UTF8 "
    jar_path = "buglySymboliOS.jar"
    fils_path = "demo.app.dSYM"
    output_path = "~/Downloads/ios"
    java $java_opts -jar $jar_path -i $file_path -o $output_path -symbol "$@" > /dev/null 2>&1
    

    最后需要符号还原

    pip install symbolic==8.3.2

    from symbolic.demangle import demangle_name
    
    decode = demangle_name(item)
    
  • 相关阅读:
    详细梳理山姆·奥特曼离职闹剧 仍试图重返OpenAI
    【藏经阁一起读】(70)__《看见新力量(第七期)》
    Python基础分享之面向对象的进一步拓展
    对话MySQL之父:一个优秀程序员可抵5个普通程序员
    【论文阅读】用于自动中文作文评分的多阶段预训练
    前端跨页面通信,你知道哪些方法?
    Linux:进程的状态理解
    php农村生态游服务平台
    MySQL夺命连环15问,你能坚持到第几问?
    读《Linux内核设计与实现》我想到了这些书
  • 原文地址:https://blog.csdn.net/qq_37362891/article/details/140954308