ベンの崩壊ログ(ピット)を解決iOS-

記事を解析ベンの崩壊ログをたくさん持っているが、実際にはほとんど私のニーズを満たすために、私は私が収集するためにピットが発生した主なポイントを記述するためにここにいます。

ベン崩壊ログシンボルテーブルアドレススタックを取得する(ベースアドレス)

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

iPhoneデバイスのCPU命令

#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 <符号表堆栈地址 > <奔溃堆栈地址>

おすすめ

転載: blog.csdn.net/weixin_33720956/article/details/90844696