Dl_info不全时怎么通过__builtin_return_address获得objective-c的方法名
时间: 2024-03-17 16:45:12 浏览: 20
如果 Dl_info 结构体中没有找到符号信息,你可以尝试从返回地址中提取方法名。在 ARM 架构中,返回地址的最后两位代表着 Thumb 模式下的偏移量,如果最后一位是 1,代表着该地址位于 Thumb 模式下,需要进行对齐。
具体来说,你可以使用以下代码片段:
```objective-c
void *returnAddr = __builtin_return_address(0);
NSString *symbolName = nil;
#if defined(__arm__)
returnAddr = (void *)((uintptr_t)returnAddr & ~0x1);
#endif
// 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 架构下的返回地址进行对齐,然后从返回地址中提取函数指针,再从函数指针中提取符号名,最后转换为方法名。注意,此方法只适用于 Objective-C 方法,如果你需要获取 C 函数名,可以使用 *funcPtr 直接获取。