免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 990 | 回复: 0
打印 上一主题 下一主题

关于ltrace跟踪函数的技巧 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-02 16:26 |只看该作者 |倒序浏览
ltrace可以跟踪函数调用,前面我已经说过了。
转载请注明:
http://blog.chinaunix.net/u/30686

下午突然发现了ltrace的一个新功能,ltrace不光能跟踪函数的进入,函数的返回也能够获得。有了进入和退出,那么他就可以获得该函数的运行时间。

那么ltrace是如何获得函数的返回呢?
我以前介绍的,是不够的。

总的来说,是通过堆栈。
struct callstack_element {
union {
  int syscall;
  struct library_symbol * libfunc;
} c_un;
int is_syscall;
void * return_addr;
struct timeval time_spent;
};

在函数调用后,程序就会执行到我们前面插入的断点,这时候,已经做了一些基本的堆栈操作,包括函数返回后运行指令的指针,压入栈中。当新进入一个函数时,他就通过ptrace获取堆栈所在的内存,然后将返回指针所对应的指令,插入断点。
这时,在proc维护的全局堆栈数组总增加一项。

当离开一个函数时,根据当前指针,查找以前维护的堆栈信息,就可以知道从哪个函数中退出来的。

那么如何来区分,是进入函数还是退出函数呢?
这里使用了最简单的方法,根据当前的运行的指针来查找维护的堆栈,如果找不到,就意味着是新进入一个函数;否则,就意味着离开一个函数。



本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/30686/showart_269650.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP