Dl_info不全时怎么通过__builtin_return_address获得objective-c的方法名
时间: 2024-03-17 14:45:17 浏览: 44
如果 `Dl_info` 结构体中没有找到符号信息,你可以尝试从返回地址中提取方法名。在 ARM 架构中,返回地址的最后两位代表着 Thumb 模式下的偏移量,如果最后一位是 1,代表着该地址位于 Thumb 模式下,需要进行对齐。而在 x86 架构中,返回地址直接指向函数的入口地址。
具体来说,你可以使用以下代码片段:
```objective-c
void *returnAddr = __builtin_return_address(0);
NSString *symbolName = nil;
#if defined(__arm__)
returnAddr = (void *)((uintptr_t)returnAddr & ~0x1);
#endif
Dl_info info;
if (dladdr(returnAddr, &info) && info.dli_sname) {
symbolName = [NSString stringWithUTF8String:info.dli_sname];
} else {
// Assuming the return address is a pointer to a function call instruction,
// we can go back one more word to get the actual function pointer.
void **funcPtr = (void **)returnAddr - 1;
// Assuming the function pointer points to the beginning of the function,
// we can get the address of the symbol name by going back one more word.
char **symPtr = (char **)*funcPtr - 1;
// Check if the symbol name is a valid string.
if (symPtr && *symPtr) {
symbolName = [NSString stringWithUTF8String:*symPtr];
}
}
NSString *methodName = NSStringFromSelector(NSSelectorFromString(symbolName));
```
其中,我们首先对 ARM 架构下的返回地址进行对齐,然后尝试从 `Dl_info` 结构体中获取符号名。如果获取失败,我们假设返回地址是一个指向函数调用指令的指针,从中提取函数指针,再从函数指针中提取符号名,最后转换为方法名。注意,此方法只适用于 Objective-C 方法,如果你需要获取 C 函数名,可以使用 `*funcPtr` 直接获取。
阅读全文