CN103092759A - 一种嵌入式环境下的代码动态性能剖析器 - Google Patents
一种嵌入式环境下的代码动态性能剖析器 Download PDFInfo
- Publication number
- CN103092759A CN103092759A CN2013100315685A CN201310031568A CN103092759A CN 103092759 A CN103092759 A CN 103092759A CN 2013100315685 A CN2013100315685 A CN 2013100315685A CN 201310031568 A CN201310031568 A CN 201310031568A CN 103092759 A CN103092759 A CN 103092759A
- Authority
- CN
- China
- Prior art keywords
- objective function
- code
- module
- dynamic property
- program
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种嵌入式环境下的代码动态性能剖析器,包括对目标函数进行运行时性能跟踪的桩代码模块、用于截取目标函数的控制权使控制流转移到桩代码模块中的桩代码上并保存和恢复寄存器上下文的胶水代码模块、生成用于剖析的可执行文件的前期数据处理子模块、对采集到的数据进行整理统计的后期处理子模块;实现目机标与主机的IDE通信,以此实现主机与目标机之间的数据传送的守护程序和结果显示模块。本发明可以分析嵌入式下用户函数及库函数的执行时间和被调用次数,通过分析比较,该方法比现有工具统计速度更快、准确度更高。
Description
技术领域
本发明涉及软件程序质量动态分析技术领域,具体涉及一种嵌入式环境下的代码动态性能剖析器。
背景技术
在现代的软件发展中,人们对软件质量的要求越高,程序分析就越发占有一席之地。程序分析有静态分析和动态分析两种:静态分析如数据依赖分析方法主要是在不执行程序的前提下对程序的源代码进行分析,得到程序的结构信息、逆向提取的对象模型和类关系及程序的复杂度度量等;而动态分析如K-TAILS方法则是在程序的执行中,对程序的行为进行分析的技术。Daikon是一个把动态分析和技术和静态分析技术的优点结合在一起的软件分析工具。动态分析一般分为源代码植入技术和目标码插装技术,一个简单的做法是随机产生输入数据并观察程序对这些输入返回的结果。相对于静态分析来说,动态分析就比较复杂,同时需要的时间开销就可能更多,此外有时可能要付出更大的代价。
目前,大多数动态程序分析工具所测出的程序执行时间相当的不精确,比如说gprof由于其本身的工作原理,对于执行时间较短的函数测出的时间大多是零,而执行再快的程序总是要消耗时间的。相对于gprof来说,ltrace精确度还是能接受的,但在测递归函数时占用的时间过长。
程序插装的概念是由J.C.Huang教授首次提出的。插装技术有很多种:从插装的对象来分,有源代码插装和二进制代码插装;从插装的阶段来分,有静态插装和动态插装,在编译时的插装方式属于动态插装。各种插装技术都有其优缺点以及适用场合。
发明内容
针对上述现有技术,本发明要解决的技术问题是:现有的动态程序分析工具所测出的程序执行时间不精确。
为了解决上述技术问题,本发明采用如下技术方案:
一种嵌入式环境下的代码动态性能剖析器,其特征在于,包括如下模块,
桩代码模块:对目标函数进行运行时性能跟踪;
胶水代码模块:用于截取目标函数的控制权,使控制流转移到桩代码模块中的桩代码上去,并保存和恢复寄存器上下文;
数据处理模块:包括生成用于剖析的可执行文件的前期数据处理子模块和对采集到的数据进行整理统计的后期处理子模块;
结果显示模块:根据运行时性能跟踪收集到的部分性能数据对数据进行可视化的友好显示,显示出函数的执行时间和执行次数;
守护程序:实现目机标与主机的IDE通信,以此实现主机与目标机之间的数据传送,通过TCP连接接收数据,接收来自IDE的文件、通知和控制命令;以及监视目标程序的执行并发送回性能数据到主机上的IDE来处理。
所述胶水代码模块运行ARM中的跳转指令B指令,跳转指令B指令执行后,会把返回的地址保存到LR寄存器;如果需要源程序执行另一个程序代码,则修改LR寄存器里的返回地址,把原来应该返回的地址LR中的内容保存到SP堆栈中去,把预执行的代码地址拷贝到LR中去,使程序的控制权转向预执行的程序,当需要返回到原程序中时,将SP堆栈中的内容写到LR寄存器。
作为本发明的进一步改进,根据目标函数的个数通过跳转表项模板动态生成跳转表,用于解决目标函数的标识与控制权截取的问题。
作为本发明的进一步改进,跳转表在后台被编译成一个单独的模块与用户程序链接在一起。
作为本发明的进一步改进,跳转表中的一个目标函数与跳转表项、对应的ID表与目标函数入口地址关联,一一对应。目标函数的个数直接影响到这些表的大小,为了减少目标程序运行时所占用的内存空间,必须将其内容尽可能的精简。
作为本发明的进一步改进,将目标函数的第一条指令替换为跳转指令,跳转目标为目标函数对应的跳转表项的调用处理块;
作为本发明的进一步改进,将目标函数的第一条指令填充到目标函数对应跳转表项的指令占位槽中。
作为本发明的进一步改进,所述跳转项中调用处理块在调用处理完成后就开始对目标函数的性能数据进行统计
作为本发明的进一步改进,指令占位糟项是原目标函数的第一条指令,即目标函数开始执行;转入目标函数项是指控制真正的转入到目标函数的内部开始执行目标函数;当目标函数执行完成后,由于修改了程序中的LR寄存器,所以控制会转入到跳转表项的退出处理项去执行,退出处理项一方面通知桩代码停止统计目标函数的性能,另一方面把程序的控制权真正的返回给原程序。
作为本发明的进一步改时,对目标函数的执行时间进行计时,采用一种分片计时。
所述分片计时是指当目标函数发生了子函数调用或者子函数返回时才进行执行时间的一次计算,计算得到的时间可能是总执行时间,也可能是总执行时间的一部分;当目标函数没有对其他目标函数调用时,计算的时间就是此目标函数总的执行时间;当目标函数包含有子函数为目标函数的调用时,则此计算的时间只是目标函数总执行时间的一部分。
本发明的工作流程为:用户程序(目标文件)、胶水代码以及桩代码会被链接器一起链接到可执行文件中,这是间接地利用链接插桩的方法;对生成的可执行文件还需要由剖析器进行缝补操作,缝补操作的目的是将目标函数与桩代码关联起来,使目标函数在执行时能通知桩程序采集数据。通过缝补操作以后就可使可执行程序在调用目标函数的时候跳转到胶水程序上,进而转入到桩程序中。生成的最终可执行文件将被守护进程发送到目标机开发板上运行,程序运行完成后会生成剖析数据。再通过守护进程将剖析数据传回IDE的剖析器,结果显示模块将分析结果可视化友好的显示出来。
与现有技术相比,本发明具有以下有益效果:
一、设计了代码动态性能分析工具,使得程序开发人员能更为准确的来定位性能的瓶颈进而更好的优化程序,从而可以使程序开发人员开发出高效的嵌入式程序。
二、采用对可执行文件静态插装的方法无需进入内核,从而明显减少了对被测程序性能的影响,
三、呈现出被测程序真实的运行时间及执行次数情况。
附图说明
图1 跳转表项控制转移流程。
具体实施方式
下面将结合附图及具体实施方式对本发明作进一步的描述。
一 跳转表(_JUMP_TABLE)
跳转表用于解决目标函数的标识与控制权截取的问题。
跳转表根据目标函数的个数通过跳转表项模板动态生成的。一个目标函数与跳转表项、对应的ID表与目标函数入口地址关联,它们一一对应。目标函数的个数直接影响到这些表的大小,为了减少目标程序运行时所占用的内存空间,必须将其内容尽可能的精简。跳转表在制作剖析目标时由IDE根椐用户选择的目标函数动态生成,然后会在后台被编译成一个单独的模块与用户程序链接在一起。
结合图1 所示,假如函数A为将要分析性能的目标函数,缝补工作时其中有一个动作是将目标函数的第一条指令替换为跳转指令,跳转目标是目标函数对应的跳转表项的调用处理块,另一个缝补动作是将目标函数的第一条指令填充到目标函数对应跳转表项的指令占位槽中,跳转表项中的指令占位糟,这样就把原程序的第一条指令保存起来以便以后执行,所以当程序将要执行函数A的第一条指令时,就会根据目标函数A的ID号转到跳转表中目标函数A对应的跳转表项中去。跳转项中的调用处理功能是为转入统计函数(函数执行时间统计和函数调用次数)做准备的,调用处理完成后就开始对目标函数的性能数据进行统计了;指令占位糟项是原目标函数A的第一条指令,即目标函数开始执行了;转入目标函数项是指控制真正的转入到目标函数A的内部开始执行目标函数A;当目标函数A执行完成后,由于修改了程序中的LR寄存器,所以控制会转入到跳转表项的退出处理项去执行,退出处理项一方面是为了通知桩代码停止统计目标函数的性能,另一方面也是为了把程序的控制权真正的返回给原程序。
跳转表项的调用处理将获取目标函数的ID、保存寄存器现场、将目标函数的返回地址及ID传给桩代码。桩代码根据被剖析函数的ID记录对应的性能数据,并将被剖析函数的返回地址保存以供在后面使用。桩代码返回后,调用处理将目标函数的返回地址替换为退出处理块的地址,即可保证目标函数执行结束时再返回到桩代码,再根据ID计算出指令占位槽的地址并跳转过去,之后会执行跳转表项的第三项。通过查询函数入口地址表得到被剖析函数的地址并跳过第一条指令,开始执行被剖析函数体。当被剖析函数返回后,转到退出处理块处执行,转入桩代码,桩代码返回先前保存的被剖析函数的返回地址,退出处理块恢复现场后跳转到这个地址处执行。程序的控制权回到的原程序,跳转表对应的对外接口函数,如表1所示
胶水代码的各函数
胶水代码的功能就是将目标程序的执行流程转入到桩代码的性能采集函数中去,以便于收集目标函数的性能数据,其自身还要保存和恢复目标寄存器上下文原来的信息,以防止受到性能采集模块的影响。为了更详细的了解胶水代码中各函数的作用,更为了将跳转表项的内容尽可能的缩减,将一些公共操作封装成胶水函数,胶水函数由ARM汇编编写的,不支持Thunb指令集。
对目标函数的执行时间进行计时,直接影响到结果的准确性。定义一个结构体来表示被跟踪的目标函数;定义一个栈结构体,用来表示当前目标函数所在线程的调用情况。当有执行进入或者退出目标函数时,这个栈结构体变量的元素随之变动。
struct callstack {
struct ele_callstack *ele_list;
struct callstack *next;
struct fun_entry *fun_list;
pid_t thread;
};
struct ele_callstack {
unsigned int id;
unsigned int return_addr;
struct ele_callstack* next;
struct timeval time_in;
};
struct fun_entry {
unsigned int id;
unsigned int count;
struct timeval time_spent;
struct fun_entry* next;
};
struct queue_callstack {
struct callstack *cs;
pthread_rwlock_t q_lock;
};
上面已结合附图对发明的具体实施方式进行了示例性的描述,显然本发明不限于此,在本发明范围内进行的各种改型均没有超出本发明的保护范围。
Claims (10)
1.一种嵌入式环境下的代码动态性能剖析器,其特征在于,包括如下模块,
桩代码模块:对目标函数进行运行时性能跟踪;
胶水代码模块:用于截取目标函数的控制权,使控制流转移到桩代码模块中的桩代码上去,并保存和恢复寄存器上下文;
数据处理模块:包括生成用于剖析的可执行文件的前期数据处理子模块和对采集到的数据进行整理统计的后期处理子模块;
结果显示模块:根据运行时性能跟踪收集到的部分性能数据对数据进行可视化的友好显示,显示出函数的执行时间和执行次数;
守护程序:实现目机标与主机的IDE通信,以此实现主机与目标机之间的数据传送,通过TCP连接接收数据,接收来自IDE的文件、通知和控制命令;以及监视目标程序的执行并发送回性能数据到主机上的IDE来处理。
2.根据权利要求1中所述的嵌入式环境下的代码动态性能剖析器,其特征在于,所述胶水代码模块运行ARM中的跳转指令,跳转指令执行后,会把返回的地址保存到LR寄存器;如果需要源程序执行另一个程序代码,则修改LR寄存器里的返回地址,把原来应该返回的地址LR中的内容保存到SP堆栈中去,把预执行的代码地址拷贝到LR中去,使程序的控制权转向预执行的程序,当需要返回到原程序中时,将SP堆栈中的内容写到LR寄存器。
3.根据权利要求2中所述的嵌入式环境下的代码动态性能剖析器,其特征在于,根据目标函数的个数通过跳转表项模板动态生成跳转表,跳转表在后台被编译成一个单独的模块与用户程序链接在一起。
4..根据权利要求3中所述的嵌入式环境下的代码动态性能剖析器,其特征在于,跳转表中的一个目标函数与跳转表项、对应的ID表与目标函数入口地址关联,一一对应。
5.根据权利要求1中所述的嵌入式环境下的代码动态性能剖析器,其特征在于,将目标函数的第一条指令替换为跳转指令,跳转目标为目标函数对应的跳转表项的调用处理块。
6.根据权利要求5中所述的嵌入式环境下的代码动态性能剖析器,其特征在于,将目标函数的第一条指令填充到目标函数对应跳转表项的指令占位槽中。
7.根据权利要求5中所述的嵌入式环境下的代码动态性能剖析器,其特征在于,所述跳转项中调用处理块在调用处理完成后就开始对目标函数的性能数据进行统计。
8.根据权利要求1中所述的嵌入式环境下的代码动态性能剖析器,其特征在于,指令占位糟项是原目标函数的第一条指令,即目标函数开始执行;转入目标函数项是指控制真正的转入到目标函数的内部开始执行目标函数;当目标函数执行完成后,由于修改了程序中的LR寄存器,所以控制会转入到跳转表项的退出处理项去执行,退出处理项一方面通知桩代码停止统计目标函数的性能,另一方面把程序的控制权真正的返回给原程序。
9.根据权利要求8中所述的嵌入式环境下的代码动态性能剖析器,其特征在于,对目标函数的执行时间进行计时,采用一种分片计时。
10.根据权利要求9中所述的嵌入式环境下的代码动态性能剖析器,其特征在于,所述分片计时是指当目标函数发生了子函数调用或者子函数返回时才进行执行时间的一次计算,计算得到的时间可能是总执行时间,也可能是总执行时间的一部分;当目标函数没有对其他目标函数调用时,计算的时间就是此目标函数总的执行时间;当目标函数包含有子函数为目标函数的调用时,则此计算的时间只是目标函数总执行时间的一部分。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2013100315685A CN103092759A (zh) | 2013-01-28 | 2013-01-28 | 一种嵌入式环境下的代码动态性能剖析器 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2013100315685A CN103092759A (zh) | 2013-01-28 | 2013-01-28 | 一种嵌入式环境下的代码动态性能剖析器 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN103092759A true CN103092759A (zh) | 2013-05-08 |
Family
ID=48205360
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2013100315685A Pending CN103092759A (zh) | 2013-01-28 | 2013-01-28 | 一种嵌入式环境下的代码动态性能剖析器 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103092759A (zh) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104111890A (zh) * | 2014-07-29 | 2014-10-22 | 北京航空航天大学 | 一种实时性能测试方法与系统 |
CN106502876A (zh) * | 2016-10-26 | 2017-03-15 | 腾讯科技(深圳)有限公司 | 一种热点函数确定的方法及相关设备 |
CN109324949A (zh) * | 2018-09-14 | 2019-02-12 | 珠海金山网络游戏科技有限公司 | 一种lua代码执行性能的静态分析方法 |
CN112148364A (zh) * | 2019-10-18 | 2020-12-29 | 广东财经大学 | 一种嵌入式微内核操作系统分区链接方法及系统 |
CN112445512A (zh) * | 2019-08-29 | 2021-03-05 | 上海高德威智能交通系统有限公司 | 程序代码的热点分析方法及装置 |
CN115017058A (zh) * | 2022-08-04 | 2022-09-06 | 飞腾信息技术有限公司 | 一种内核模块的测试方法、装置、电子设备及存储介质 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR20100065067A (ko) * | 2008-12-05 | 2010-06-15 | 한국전자통신연구원 | 동적 업그레이드를 제공하는 임베디드 단말기 구동 방법 및 이를 위한 임베디드 단말기 |
-
2013
- 2013-01-28 CN CN2013100315685A patent/CN103092759A/zh active Pending
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR20100065067A (ko) * | 2008-12-05 | 2010-06-15 | 한국전자통신연구원 | 동적 업그레이드를 제공하는 임베디드 단말기 구동 방법 및 이를 위한 임베디드 단말기 |
Non-Patent Citations (1)
Title |
---|
崔娟娜: "嵌入式环境下代码动态性能分析的研究与实现", 《中国优秀硕士学位论文全文数据库 信息科技辑》, no. 01, 15 January 2012 (2012-01-15), pages 137 - 34 * |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104111890A (zh) * | 2014-07-29 | 2014-10-22 | 北京航空航天大学 | 一种实时性能测试方法与系统 |
CN104111890B (zh) * | 2014-07-29 | 2018-01-16 | 北京航空航天大学 | 一种实时性能测试方法与系统 |
CN106502876A (zh) * | 2016-10-26 | 2017-03-15 | 腾讯科技(深圳)有限公司 | 一种热点函数确定的方法及相关设备 |
CN109324949A (zh) * | 2018-09-14 | 2019-02-12 | 珠海金山网络游戏科技有限公司 | 一种lua代码执行性能的静态分析方法 |
CN112445512A (zh) * | 2019-08-29 | 2021-03-05 | 上海高德威智能交通系统有限公司 | 程序代码的热点分析方法及装置 |
CN112148364A (zh) * | 2019-10-18 | 2020-12-29 | 广东财经大学 | 一种嵌入式微内核操作系统分区链接方法及系统 |
CN112148364B (zh) * | 2019-10-18 | 2024-02-06 | 广东财经大学 | 一种嵌入式微内核操作系统分区链接方法及系统 |
CN115017058A (zh) * | 2022-08-04 | 2022-09-06 | 飞腾信息技术有限公司 | 一种内核模块的测试方法、装置、电子设备及存储介质 |
CN115017058B (zh) * | 2022-08-04 | 2022-11-29 | 飞腾信息技术有限公司 | 一种内核模块的测试方法、装置、电子设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103092759A (zh) | 一种嵌入式环境下的代码动态性能剖析器 | |
US8756572B2 (en) | Debugger-set identifying breakpoints after coroutine yield points | |
US8752020B2 (en) | System and process for debugging object-oriented programming code leveraging runtime metadata | |
Bebenita et al. | Trace-based compilation in execution environments without interpreters | |
CN100578674C (zh) | 一种寄存器测试的方法和系统 | |
CN104850411B (zh) | 存储系统基准评测程序生成方法及装置 | |
CN101241444B (zh) | 用于动态二进制翻译的调试方法 | |
US20040230956A1 (en) | Simple method optimization | |
US8683439B2 (en) | System and process for debugging object-oriented programming code leveraging preprocessors | |
KR101886203B1 (ko) | 프로그램 분석 장치 및 방법 | |
CN101685420B (zh) | 多线程调试方法和装置 | |
CN106033387A (zh) | 测试flash内部控件的方法和装置 | |
CN101458630A (zh) | 一种基于硬件模拟器的自修改代码识别方法 | |
Wang et al. | Software performance simulation strategies for high-level embedded system design | |
CN103955394B (zh) | 一种基于推迟提交的gpu虚拟化优化方法 | |
Umemori et al. | Design and implementation of bytecode-based java slicing system | |
CN104007956B (zh) | 一种操作系统进程识别跟踪及信息获取的方法和装置 | |
CN111857690A (zh) | 一种动画效果的调试方法、装置、计算机设备及存储介质 | |
CN101237350A (zh) | 用于多任务环境单板机的全局变量异常改写定位方法 | |
CN107526966B (zh) | 一种Android平台的复合污点传播追踪方法 | |
Szegedi et al. | Dynamic slicing of Java bytecode programs | |
CN112905474B (zh) | 一种基于硬件的高级程序动态控制流追踪方法和装置 | |
CN114238107A (zh) | 一种跟踪调试方法、系统及计算机可读存储介质 | |
Rister et al. | Integrated debugging of large modular robot ensembles | |
CN109947476B (zh) | 一种运行时栈空间的统计方法及系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C12 | Rejection of a patent application after its publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20130508 |