bin*_*inW 18 c gcc function-pointers
我正在使用gnu工具链.我怎样才能在运行时找到函数的调用者?即,例如函数B()被许多函数使用函数指针调用.现在,每当B被调用时,我想打印调用者名称.我需要这个来调试某个问题.
函数调用的代码位置由__builtin_return_address()内部的gcc保存.要检索该名称,您必须解析程序的符号表; 虽然这是可能的,通过dladdr(),这是有限制的:
backtrace()/ dladdr()(例如,从信号处理程序,或在多线程程序中同时执行,或从您无法调用的上下文中调用malloc())可能不安全.backtrace()manpage也说明了这一点,就像dladdr()"BUGS"部分中的那样).这通常是解耦跟踪和函数名称解析的更好方法; 即只输出返回地址(作为十六进制/二进制),然后根据程序运行时检索到的符号表对结果日志进行后处理.
Vasil Dimov在回答类似问题时指出的另一种方法是用报告或传递调用函数名称的包装宏替换函数调用.这将适用于内联函数,其中backtrace不会.另一方面,如果您通过引用调用该函数或以其他方式获取其地址,则它将不起作用.
例如:
int B(int x){
...
}
Run Code Online (Sandbox Code Playgroud)
可能成为:
int _B(int x, char *caller){
printf("caller is %s\n", caller);
...
}
#define B(x) _B((x), __func__)
Run Code Online (Sandbox Code Playgroud)
每次调用B()都会打印出来的姓名.Vasil Dimov以不同的方式构造它,直接在宏中打印名称并保持函数不变.
| 归档时间: |
|
| 查看次数: |
21667 次 |
| 最近记录: |