LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1197|回复: 12

请问如何在函数中打印调用本函数的父亲函数、爷爷函数的名字?

[复制链接]
发表于 2004-7-9 20:44:54 | 显示全部楼层 |阅读模式
换句话说,
请问,如何打印函数的调用栈?

例如:
我有一个公用函数fun(), 会在很多地方被调用。
如被函数A、函数B、函数C调用。
请问我如何在函数fun()中打印到底是被函数A、B还是C调用了呢?

请指教,多谢!!!
 楼主| 发表于 2004-7-9 20:45:57 | 显示全部楼层
补充一下,是在linux下的用C语言编程。
发表于 2004-7-10 09:57:50 | 显示全部楼层
如果靠用C语言本身编程来实现这种需求是有难度的。
一般了解函数的调用次序,都是告一些工具。如cflow。
http://www.opengroup.org/onlinep ... tilities/cflow.html
发表于 2004-7-10 09:59:12 | 显示全部楼层
这里有不少工具,你可以看看。
http://linux.maruhn.com/cat/Development/Tool.html
 楼主| 发表于 2004-7-10 12:50:35 | 显示全部楼层
多谢赐教!找到了一些好工具。
:)

但是,有没有办法在程序内打印调用父函数的名字呢?
比如说:
我想在fun()中打印:
       printf("This fun() is called by the father function---%s\n", __FATHER_FUN_NAME__);

呵呵,这个__FATHER_FUN_NAME__是我假象的。

然后运行时,就会打印:
# ./fun
This fun() is called by the father function---A()
#
#

__FATHER_FUN_NAME__这样的宏定义吗?或有什么方法实现?
发表于 2004-7-10 15:35:20 | 显示全部楼层
没有听说有这个宏。
发表于 2004-7-10 21:22:47 | 显示全部楼层
函数堆栈是动态产生的,所以不会有__FATHER_FUN_NAME__类似这样的宏。而且ELF文件中函数名字也不一定和你在源代码中看到的一样。
发表于 2004-7-11 09:31:23 | 显示全部楼层
其实函数名在编译时就转化成地址了。要打印出函数名,除非自己把它保留在字符串中。
发表于 2004-7-11 15:16:10 | 显示全部楼层
弄个全局的stack,进入一个函数时候先把函数名push进去,return之前pop掉
需要的时候遍利一下就可以了
用条件编译控制release的时候不编译这些,不会影响效率的
发表于 2004-7-19 10:08:49 | 显示全部楼层
__PARENT_FUNCTION__这样的宏没有,有__FUNCTION__
也许可以这样做:

在源代码中,使用条件编译

#ifdef DEBUG
void father_function(args, __FUNCTION__);
#else
viod father_function(args);
#endif
{
....
#ifdef DEBUG
void call_child_function(args, __FUNCTION__);
#else
viod call_child_function(args);
#endif
....
}

明白我的意思?

另外,在gdb中使用bt命令,可以打印出函数堆栈的,一样可以看出函数的调用关系。
或者用sourcenav这样的工具,一样可以分析源代码的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表