ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码
当前位置:首页 >> yabo亚博体育 >> IOS开发 >> iOS 如何获取 Mach-O 的 UUID

iOS 如何获取 Mach-O 的 UUID(1/3)

来源:网络整理?????时间:2018-11-01?????关键词:

yabo亚博体育 本篇文章主要介绍了" iOS 如何获取 Mach-O 的 UUID",主要涉及到方面的内容,对于IOS开发感兴趣的同学可以参考一下: LC_UUID 一般简称为 UUID,是用来标示 Mach-O 文件的,做过崩溃堆栈符号化还原的同学应该都知道有 UUID 这个东西,你在进行符号解析的时候,就...

LC_UUID 一般简称为 UUID,是用来标示 Mach-O 文件的,做过崩溃堆栈符号化还原的同学应该都知道有 UUID 这个东西,你在进行符号解析的时候,就需要找到与系统库和你 APP 的 UUID 相同的 dSYM 文件来进行堆栈地址还原。

获取 dSYM 文件的 UUID 比较简单,随便用一个工具就能查看 UUID,那么如何获取 APP 及其动态库的 UUID 呢?


$?xcrun?dwarfdump?--uuid?
UUID:?E73A4300-F6E5-3124-98DF-1578B8D4F96A?(armv7)?GYMonitorExample.app.dSYM/Contents/Resources/DWARF/GYMonitorExample
UUID:?44E27054-508E-37EF-9296-44400C5F19E1?(arm64)?GYMonitorExample.app.dSYM/Contents/Resources/DWARF/GYMonitorExample

获取 APP 的 UUID

当初想只获取 APP 的 dSYM 文件的 UUID 和堆栈发生时对应设备的 APP UUID,所以直接 Google 一搜就有答案:https://stackoverflow.com/questions/10119700/how-to-get-mach-o-uuid-of-a-running-process


#import?
NSString?*executableUUID()
{
????const?uint8_t?*command?=?(const?uint8_t?*)(&_mh_execute_header?+?1);
????for?(uint32_t?idx?=?0;?idx?????????if?(((const?struct?load_command?*)command)->cmd?==?LC_UUID)?{
????????????command?+=?sizeof(struct?load_command);
????????????return?[NSString?stringWithFormat:@"XXXX-XX-XX-XX-XXXXXX",
????????????????????command[0],?command[1],?command[2],?command[3],
????????????????????command[4],?command[5],
????????????????????command[6],?command[7],
????????????????????command[8],?command[9],
????????????????????command[10],?command[11],?command[12],?command[13],?command[14],?command[15]];
????????}?else?{
????????????command?+=?((const?struct?load_command?*)command)->cmdsize;
????????}
????}
????return?nil;
}

把上述方法放在 AppDelegate 中进行测试,测试结果完全正确,喜出望外。上述代码的大概意思是获取 MH_EXECUTE (可执行的主 image )文件的 Load Command,并且利用 For 循环遍历所有的 Load Command,找到类型为 LC_UUID 的 Load Command,进而获取 UUID。

在 Pod 中获取 APP 的 UUID

因为崩溃采集是在一个独立的库中进行的,在崩溃时想要采集 UUID 的话也应该在当前库中获取 UUID,因为 Pod 使用了 use_frameworks ,所以问题就变成了如何在一个动态库中获取 APP 的 UUID,静态库会把代码复制到主 APP 中,而动态库是一个独立的 Mach-O 文件。把上面代码直接丢在 Pod 中使用是行不通的,因为 _mh_execute_header 在 MH_DYLIB 中无法使用。

相关图片

相关文章