用GCC来跟踪程序的函数调用关系
来源:互联网 发布:java的输出语句 编辑:程序博客网 时间:2024/06/04 18:29
GCC就像一个巨大的宝藏,只要你愿意花时间,总能淘到好东西。
在看一些大中型的软件的源代码时,你是不是非常希望有一个工具能够方便的生成各个函数之间的调用关系图呢?
为了实现这个目标,你可以通过对源代码进行静态扫描得到函数的调用关系,但是你无法通过这种方法获得更多的信息,
(如:对某个函数的调用次数,被调用的函数执行了多长时间等,这些信息对于软件的优化具有很好的参考价值)除了
静态扫描之外,还存在一些动态的方法,即在程序的运行过程中记录相关的信息,不过这些动态的方法通常都需要有编
译器的支持,通过编译器在编译的过程中插入相应的代码。下面简单的介绍一下,GCC的function instrumentation
机制。
简单的来说,gcc function instrumentation就是在每个函数调用之前调用一个名为__cyg_profile_func_enter的函数,
在函数调用介绍的时候调用__cyg_profile_func_exit。这两个函数在gcc看来只是两个普通的函数,是可以由用户自己进行
定制的。下面先看个例子:
编译与运行:
$ gcc -finstrument-functions hello.c -o hello
$ ./hello
__cyg_profile_func_enter: func = 0x8048468, called by = 0xb7e36ebc
Hello World!
__cyg_profile_func_exit: func = 0x8048468, called by = 0xb7e36ebc
呵呵,是不是很神奇,只需要在软件中简单加入__cyg_profile_func_enter __cyg_profile_func_exit这两个函数的定义,
然后再编译的时候加上-finstrument-functions选项,就可以在每个函数调用前后调用这两个函数获取你所感兴趣的信息。为了
对其具体的实现细节有所了解,可以通过”objdump -d hello“来看下程序反汇编之后的结果。
从上面的汇编代码可以看出,gcc是在进入函数完成堆栈的初始化之后调用__cyg_profile_func_enter的,在函数返回清理堆栈
之前调用__cyg_profile_func_exit的。
经过上面的步骤,我们还只能获取到函数调用时的信息,还没有获取到函数之间的调用关系,但是明白了上述的原理之后,参看参看
参考资料[1]就能够很容易的实现目标了。
参考资料
[1] http://www.ibm.com/developerworks/cn/linux/l-graphvis/
[2] http://blog.linux.org.tw/~jserv/archives/001870.html
- 用GCC来跟踪程序的函数调用关系
- 用GCC来跟踪程序的函数调用关系
- Linux C++ 跟踪程序奔溃及函数调用关系
- 用gprof来查看函数的调用时间,调用关系
- 跟踪程序在Linux下的执行的函数调用
- 使用WARN_ON来追溯函数的调用关系
- Intel和ARM GCC程序函数调用的参数传递
- 栈调用关系跟踪
- 栈调用关系跟踪
- 栈调用关系跟踪
- 程序执行过程的跟踪:(用debug来跟踪一个程序的运行过程) 整理总结
- pvtrace和Graphviz实现对linux下C程序的函数调用跟踪
- pvtrace和Graphviz实现对linux下C程序的函数调用跟踪
- 手动跟踪函数的调用过程
- 使用gcc的-finstrument-functions选项进行函数跟踪
- 使用gcc的-finstrument-functions选项进行函数跟踪
- 函数调用跟踪
- ftrace 跟踪函数调用
- 解决ASP.NET中URL传参乱码问题
- (系列4)可视 Mobile 设计器自定义组件:PIM 浏览器
- [转]C/C++中的日期和时间 TIME_T与STRUCT TM转换
- 时间复杂度为O(n+t)的排序
- 三范式
- 用GCC来跟踪程序的函数调用关系
- AJax+Json+JQuery----前沿
- 如何在javascript里用window.close(); 关闭窗口时不提示“是否要关闭本窗口”!
- (系列3)可视 Mobile 设计器自定义组件:SMS 设计程序
- (系列2)可视 Mobile 设计器自定义组件:登录屏幕
- ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’
- socket 的一些函数
- (系列1)可视 Mobile 设计器自定义组件:文件浏览器
- NetBeans 6.0 CLDC/MIDP 开发快速入门指南