LinuxSir.cn,穿越时空的Linuxsir!

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

如何在一个函数中得到当前的函数调用堆栈?

[复制链接]
发表于 2007-12-11 17:14:05 | 显示全部楼层 |阅读模式
也就是说比如现在程序已经进入了c()函数,如何在c()函数中得到调用它的上一级函数,类似用gdb的bt命令打印出core文件里的信息
发表于 2007-12-12 08:52:39 | 显示全部楼层
前些日子有人讨论过这个问题, 找不到原始帖子了, 楼主可以查找一下 glibc 中的 backtrace 命令的相关帮助
回复 支持 反对

使用道具 举报

发表于 2007-12-18 15:48:59 | 显示全部楼层
要获得调用者的地址,知道堆栈的格式就可以了

+---------------------------+ (高地址)
+_参数1____________+
+---------------------------+
+_参数2____________+
+---------------------------+ 参数的顺序依赖于调用方式
+_参数_____________+
+---------------------------+
+_参数N____________+
+---------------------------+
+_eip______________+ 返回本次调用后,下一条指令的地址
+---------------------------+
+_ebp_____________+ 这里保存的调用者的ebp
+---------------------------+
(ebp 指向这里:相当于调用者和被调用者的分界线)
+----------------------------+
+_临时变量1_________+
+----------------------------+
+_临时变量2_________+
+----------------------------+
+_临时变量.__________+
+----------------------------+
+----------------------------+
+_临时变量N_______+
+----------------------------+(低地址)
由于优化、调用方式、编译器的不同,上述布局部可能有所不同,但一般来说,第一个局部变量前是调用者的ebp,ebp前是返回后下一条指令的地址。

由地址转换到对应文件以及行号倒有些麻烦
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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