[发明专利]基于寄存器传输语言确定动态函数调用关系的方法有效
申请号: | 201410015881.4 | 申请日: | 2014-01-14 |
公开(公告)号: | CN103761089B | 公开(公告)日: | 2017-09-15 |
发明(设计)人: | 向勇;汤卫东;杜香燕;孙卫真;马东超;邓雪峰 | 申请(专利权)人: | 清华大学 |
主分类号: | G06F9/44 | 分类号: | G06F9/44 |
代理公司: | 北京中伟智信专利商标代理事务所11325 | 代理人: | 张岱 |
地址: | 100084*** | 国省代码: | 北京;11 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 基于 寄存器 传输 语言 确定 动态 函数 调用 关系 方法 | ||
技术领域
本发明涉及函数调用关系技术领域,具体涉及一种基于寄存器传输语言确定动态函数调用关系的方法。
背景技术
对源代码的阅读分析可以通过函数调用图来实现,函数调用图可以是宏观的(源码模块间调用关系),也可以是微观的(具体到某一个函数的调入和调出关系)。函数调用图可以展现源代码静态的一种函数调用走向,也可以用来展示系统或程序运行时函数调用状态。为了分析的精确、方便以及高效,研究者开发许多函数调用图的生成工具。
静态函数调用图生成工具是指建立在已知源码的基础上,根据不同的分析需要开发的工具,这些工具中有些作用对象仅为源码如Source Insight、Understand等,有些作用对象是编译过程生成的中间结果如Codeviz、Egypt、LLVM以及Open64等。
动态函数调用图生成工具是建立在获取系统或软件在运行过程中发生的函数调用关系并绘制成调用图的工具,为了获取运行时的函数调用情况也开发了一些工具如Systemtap、gprof、KCachegrind、ftrace、pprof tool等,它们有些是针对于内核有些是针对有软件的,其基于的目的也各不相同,但它们都是基于函数调用关系分析。
Gprof是在编译时让每个函数均调用mcount函数,同时会在内存中保存函数调用图,这样做会降低系统的性能,如果对系统全部函数调用跟踪的话,会造成内存使用不足。Ftrace的原理类似于gprof的原理,只是它不会在内存中保存函数调用图,而且mcount的使用也是动态的,可以根据用户的要求在需要时替换nop为mcount指令。SystemTap是监控和跟踪运行中的Linux内核的操作的动态方法,SystemTap没有使用工具构建一个特殊的内核,而是允许您在运行时动态地安装该工具,它通过一个名为Kprobes的应用编程接口(API)来实现该目的。pprof tool主要用于分析cpu运行瓶颈需要对应用软件产生中断后记录相关信息。Gprof、ftrace以及KCachegrind都是基于静态的插桩技术,ftrace其本质也是静态的插桩技术只是实现上有所不同。而本文将要采用的跟踪工具是建立在虚拟机之上的,不会对源代码插入代码,因此不会影响系统执行本身的性能。
KCachegrind无法跟踪到系统调用,而gprof、ftrace等可以跟踪到系统调用但无法跟踪到系统启动过程,这些问题都将在本文的工具中得到解决。SimSight基于Simics的动态跟踪工具,与本文设计理念最为接近,但SimSight无法给出静态与动态相结合的函数调用图。
发明内容
针对上述问题,本发明提供一种能够清楚描述指针函数以及可加载模块的调用关系的基于寄存器传输语言确定动态函数调用关系的方法。
为达到上述目的,本发明基于寄存器传输语言确定动态函数调用关系的方法,所述方法包括:
在系统运行过程中检测函数调用执行事件,
若检测到调用指令后,解析该指令调用的函数入口地址对应的函数名,统计指令次数,输出函数名、调用发生时间、所属进程号、所属线程号、所属栈顶指针以及模块号,并保存到跟踪数据文件;
若检测的指令是返回指令后,输出时间、所属进程号、所属线程号以及所属栈顶指针到跟踪数据文件;
对所述跟踪数据文件进行处理获得预定标准的数据格式,将处理后的跟踪数据文件传输至静态函数调用关系生成装置中,生成描述函数调用关系的动态函数调用图。
进一步地,所述跟踪数据文件的生成方法包括:
通过对目标文件的解析获取函数入口地址对应的函数名、函数所在文件及行号的列表;
解析操作系统内核符号表,获取函数入口地址和函数名,根据地址和函数名查找获取的函数所在文件及行号补全函数信息,并记录到函数列表数组中;
读取模块符号表,获取模块的函数符号表,并记录到模块函数列表数组中;
若给定的地址在函数列表数组中找到,则返回模块名和函数名;
若给定的地址在模块函数列表数组中找到,则返回系统的模块名和函数名;
若给定的地址在所述函数列表数组和所述模块函数列表数组均找不到,则判断函数是否在内存中存在,
若在内存中存在,则从内存中读取内存地址,在此地址之后依次读取符号地址判断与需查询地址是否一致,并记录内存位置,从记录位置读取内存信息为函数名索引地址,若查到则根据索引地址和符号地址起始地址读取符号名长度,计算出所查地址的偏移,获取函数名长度,进而返回函数名;
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于清华大学,未经清华大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201410015881.4/2.html,转载请声明来源钻瓜专利网。
- 上一篇:一种防水外墙板
- 下一篇:一种人造洞石保温装饰一体板