//
// 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) <d202e08b-6dd8-3a73-83c8-e7019fe049b3>
内存地址(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)