我正在使用gnu工具链。 我怎样才能在运行时找到函数的调用者? 即例如函数B()被许多函数使用函数指针调用。 现在,每当B被调用时,我想打印调用者名称。 我需要这个来调试某个问题。
如果您使用的是GNU,则可以使用回溯function。 在该手册页上有一个使用示例。
调用函数的代码位置由__builtin_return_address()
内在函数中的gcc保存。 要检索该名称 ,您必须解析程序的符号表; 虽然这是可以做到的,通过dladdr()
,这是有限制的:
这通常是解耦跟踪和函数名称解析的更好方法; 即只输出返回地址(作为hex/二进制),然后根据程序运行时检索到的符号表对结果日志进行后处理。
Vasil Dimov在回答类似问题时指出的另一种方法是用报告或传递调用函数名称的包装宏替换函数调用。 这将适用于内联函数,其中backtrace不会。 另一方面,如果您通过引用调用函数或以其他方式获取其地址,它将无法工作。
例如:
int B(int x){ ... }
可能成为:
int _B(int x, char *caller){ printf("caller is %sn", caller); ... } #define B(x) _B((x), __func__)
每次调用B()都会打印出来的姓名。 Vasil Dimov以不同方式构造它,直接在宏中打印名称并保持函数不变。
需要了解更多c/c++开发分享如何获取调用函数的名称?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
以上就是c/c++开发分享如何获取调用函数的名称?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/980442.html