記事を解析ベンの崩壊ログをたくさん持っているが、実際にはほとんど私のニーズを満たすために、私は私が収集するためにピットが発生した主なポイントを記述するためにここにいます。
ベン崩壊ログシンボルテーブルアドレススタックを取得する(ベースアドレス)
static NSString *GetLoadAddres(void) {
NSString *imageLoadAddress = @"";
for (uint32_t i = 0; i < _dyld_image_count(); i++) {
const struct mach_header* imageHeader = _dyld_get_image_header(i);
if (imageHeader == NULL) {
continue;
}
if (imageHeader->filetype == MH_EXECUTE) {
imageLoadAddress = [NSString stringWithFormat:@"0x%llX", (uint64_t)imageHeader];
break;
}
}
return imageLoadAddress;
}
検証方法符号表堆栈地址
正しい:
ベンの崩壊は、次のようにメッセージが表示されたら
5デモ0x0000000100bd15acデモ+ 21932
これは、スタックアドレスとオフセット値情報ベンの崩壊ことがわかります。
アドレスをスタック:0x0000000100bd15ac
オフセット:21932 符号表堆栈地址
= 堆栈地址
- 偏移值
あなたが検証できるように符号表堆栈地址
の正しさを。
CPUの種類を取得2
#include <mach/mach_host.h>
- (NSString *)cpuType {
host_basic_info_data_t hostInfo;
mach_msg_type_number_t infoCount;
infoCount = HOST_BASIC_INFO_COUNT;
host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&hostInfo, &infoCount);
NSString *architecture = @"";
if (hostInfo.cpu_type == CPU_TYPE_ARM64)
architecture = @"arm64";
else if (hostInfo.cpu_type == CPU_TYPE_ARM)
{
///WJDeviceInfo 这个库我自己封装的 这边只是获取设备名如: iPhone5,1 等等自己搜
NSString* device = WJDeviceInfo.currentDevice.deviceName;
NSInteger modelNo = [[device substringFromIndex:device.length - 1] integerValue];
if (([device hasPrefix:@"iPhone5,"] && modelNo >= 1 && modelNo <= 4) ||
([device hasPrefix:@"iPad3,"] && modelNo >= 4 && modelNo <= 6))
architecture = @"armv7s";
else
architecture = @"armv7";
}
return architecture;
}
単一の構文解析3ログ
大雑把にコマンドを記述し
使用することができdwarfdump
、アプリやdSYMをチェックアウトと同じです。
> dwarfdump --uuid <dSYM地址>
使用することができますatos
ベン崩壊ログを解決するために
> atos -o <dSYM地址> -arch <CPUType> -l <符号表堆栈地址 > <奔溃堆栈地址>