还有其他方法能 在exported symbol 被设置为空时怎么通过__builtin_return_address获得objective-c的方法名
时间: 2024-03-17 20:44:50 浏览: 130
除了使用 `__builtin_return_address` 和 Objective-C 的运行时 API `sel_getName` 函数外,还可以使用 `dladdr` 函数获取当前函数所在的动态链接库(或可执行文件)的信息,进而获取当前函数对应的符号名称,再通过 Objective-C 的运行时 API `NSSelectorFromString` 函数将符号名称转换为对应的方法选择器,最终获取方法名。
具体步骤如下:
1. 在代码中调用 `__builtin_return_address` 函数获取当前函数的返回地址,例如:
```c
void *retAddr = __builtin_return_address(0);
```
2. 调用 `dladdr` 函数获取返回地址所在的动态链接库(或可执行文件)的信息,例如:
```c
Dl_info info;
dladdr(retAddr, &info);
```
3. 通过 `info.dli_sname` 可以获取当前函数对应的符号名称,例如:
```c
const char *symbolName = info.dli_sname;
```
4. 将符号名称转换为对应的方法选择器,例如:
```c
SEL sel = NSSelectorFromString([NSString stringWithUTF8String:symbolName]);
```
5. 最后,通过 Objective-C 的运行时 API `sel_getName` 函数获取方法选择器对应的方法名,例如:
```c
const char *methodName = sel_getName(sel);
```
这样就可以通过 `__builtin_return_address` 和 `dladdr` 函数获取当前函数对应的方法名了。需要注意的是,使用 `dladdr` 函数获取符号名称可能存在一定的限制和不稳定性,具体需要根据使用场景进行评估。
阅读全文