如何在函数中打印出调用者的函数名称?

时间:2022-10-01 18:59:33
void caller_ONE()
{
     called();
}
void caller_TWO()
{
     called();
}

void called()
{
     //如何知道调用这个函数的函数名?     
}

想知道called被谁调用了。

13 个解决方案

#1


第一种方法是在每一个函数里面都加入一些追踪函数进出的操作, 自己分析追踪的数据来获取.
还有一种方法, 在 called 里面可以获得这个函数执行完了后会返回到哪个地址上去, 用 DbgHelp.dll 加在生成这个代码的 pdb 文件, 就可以把地址翻译成对应的函数符号.

#2


gdb调试,bt吧

#3


用pdb符号也太强了吧。如果都是自己写的代码,不如简单点:
或者定义全局变量,调用called()之前,设置自己的信息;
或者为called()增加一个const char* caller的参数,调用者填写这个参数,called就知道是谁调用自己了。

#5


引用 4 楼 zilaishuichina 的回复:
可以参考我的博客

自己的底层代码库(八)——获取函数调用堆栈 

强大!长见识了~

#6


#define called printf(__FUNCTION__), called

这只是个思路,可能要根据实际使用情况进行调整

#7


不用那么麻烦 直接用函数指针数组

#9


写日志就可以了

#10


char * 传进去

#11


不如果不操作, 不在调用函数加额外的参数的话,应该就比较困难的事情了

#12


看了大家提供的资料,受益匪浅。

大致总结一下:
1.传递参数或者每个函数去手工方式插庄工作量较大,可行性不大
2.看了【4 楼 zilaishuichina】Windows下的方式,也看了【8 楼 my_live_123】的linux的相关知识,通过Linux下反汇编看,可能可以从堆栈帧epb来处理;将ebp记录下来,然后根据epb去找函数名称。

#13


收藏。。。。。。。。。。

#1


第一种方法是在每一个函数里面都加入一些追踪函数进出的操作, 自己分析追踪的数据来获取.
还有一种方法, 在 called 里面可以获得这个函数执行完了后会返回到哪个地址上去, 用 DbgHelp.dll 加在生成这个代码的 pdb 文件, 就可以把地址翻译成对应的函数符号.

#2


gdb调试,bt吧

#3


用pdb符号也太强了吧。如果都是自己写的代码,不如简单点:
或者定义全局变量,调用called()之前,设置自己的信息;
或者为called()增加一个const char* caller的参数,调用者填写这个参数,called就知道是谁调用自己了。

#4


#5


引用 4 楼 zilaishuichina 的回复:
可以参考我的博客

自己的底层代码库(八)——获取函数调用堆栈 

强大!长见识了~

#6


#define called printf(__FUNCTION__), called

这只是个思路,可能要根据实际使用情况进行调整

#7


不用那么麻烦 直接用函数指针数组

#8


#9


写日志就可以了

#10


char * 传进去

#11


不如果不操作, 不在调用函数加额外的参数的话,应该就比较困难的事情了

#12


看了大家提供的资料,受益匪浅。

大致总结一下:
1.传递参数或者每个函数去手工方式插庄工作量较大,可行性不大
2.看了【4 楼 zilaishuichina】Windows下的方式,也看了【8 楼 my_live_123】的linux的相关知识,通过Linux下反汇编看,可能可以从堆栈帧epb来处理;将ebp记录下来,然后根据epb去找函数名称。

#13


收藏。。。。。。。。。。