Dl_info不全时还有什么办法能通过__builtin_return_address获得objective-c的方法名
时间: 2024-03-17 20:45:18 浏览: 22
如果 `Dl_info` 结构体中没有找到符号信息,也无法从返回地址中提取方法名,你可以尝试利用 Objective-C 运行时库中的函数进行符号化。
具体来说,你可以使用以下代码片段:
```objective-c
void *returnAddr = __builtin_return_address(0);
NSString *methodName = nil;
#if defined(__arm__)
returnAddr = (void *)((uintptr_t)returnAddr & ~0x1);
#endif
// Define a block to enumerate all loaded modules.
void (^enumerateModulesBlock)(const char *, const struct mach_header *, uintptr_t) = ^(const char *moduleName, const struct mach_header *header, uintptr_t slide) {
Dl_info info;
if (dladdr((void *)returnAddr, &info) && info.dli_sname) {
const char *symbolName = info.dli_sname;
if (strstr(symbolName, "+")) {
methodName = [NSString stringWithFormat:@"%s", strtok(symbolName, "+")];
} else {
methodName = [NSString stringWithFormat:@"%s", symbolName];
}
}
};
// Enumerate all loaded modules and try to symbolicate the return address.
_dyld_image_count = (uint32_t)_dyld_image_count();
for (uint32_t i = 0; i < _dyld_image_count; i++) {
enumerateModulesBlock(_dyld_get_image_name(i), _dyld_get_image_header(i), _dyld_get_image_vmaddr_slide(i));
if (methodName) {
break;
}
}
```
其中,我们首先对 ARM 架构下的返回地址进行对齐,然后枚举所有已加载的模块,尝试从中获取符号信息。如果找到了符号信息,则从中提取方法名。注意,此方法可能存在误差,因为有些符号信息可能无法被正确解析,从而无法获取方法名。