基于回放的代码调试方法技术

技术编号:17939430 阅读:30 留言:0更新日期:2018-05-15 19:54
本发明专利技术涉及一种基于回放的代码调试方法,属于计算机软件技术领域。本发明专利技术通过插桩、追踪与记录以及回放的三步式的代码调试策略,消除了由并行程序中多个进程并行执行导致的并行程序在运行过程中的不确定性,定位了错误代码,实现了代码的确定性回放,能够明显提高代码调试的效率和准确度,改进了软件研发的质量,为并行程序调试工作提供了方法参考。

Code debugging method based on playback

The invention relates to a code debugging method based on playback, which belongs to the field of computer software technology. Through the three step code debugging strategy of piling, tracking, recording and playback, the invention eliminates the uncertainty in the running process of parallel programs which are caused by parallel execution of multiple processes in parallel programs, locates the error code and implements the replay of the code, which can obviously improve the efficiency of the code debugging. Accuracy improves the quality of software development, and provides a reference for debugging parallel programs.

【技术实现步骤摘要】
基于回放的代码调试方法
本专利技术涉及计算机软件
,具体涉及一种基于回放的代码调试方法。
技术介绍
在软件开发过程中,代码调试作为保证程序有效性、正确性的关键环节,被给予高度的重视,在一般的软件开发过程中,调试成本和时间占到整个软件项目的50%以上。美国国家标准技术研究所(NIST)收集的资料显示,代码调试能显著降低软件故障引发的损失,约能弥补整体损失的33%左右。因此,对代码调试技术的深入研究对提高软件开发效率,保证软件开发质量起着至关重要的作用。针对代码调试问题,目前应用最为普遍的是程序切片技术。程序切片技术是一种对程序进行分解的代码分析技术,在程序理解、程序分析、调试、软件测试以及维护等诸多领域发挥着重要的作用。根据其实现方式可以进一步分为静态切片和动态切片两种。静态切片是考虑程序所有可能的执行情况,获取程序中可能改变某个特定变量值的所有可执行语句,当调试过程中发现某个变量值出错时,可以只检查这个变量的静态切片相关代码,从而避免检查整个程序。基于动态切片的方法,只考虑某个具体输入程序的执行路径,该路径由直接或间接影响某个变量值的所有语句和谓语组成。该方法使得动态切片中的代码量比静态切片有了大大的减少,减小了查找范围,从一定程度上提高了代码调试的效率。又有学者提出用执行切片代替动态切片的方法。执行切片的含义即是某个测试用例所执行的所有语句。通过对出错用例的观察,分析其所有的执行代码,从而确定程序的执行切片。程序切片技术,可以为开发人员缩小代码出现错误的范围,降低软件开发人员在调试过程中要分析的代码量。虽然静态切片方法能够定位到错误代码,但是该方法由于无法准确获取程序真正执行的信息,一些实际执行中不会对变量值造成影响的代码也可能被引入到静态切片集合中,造成静态集合过大,明显降低了代码调试的效率;而对于动态切片方法,该方法虽然从一定程度上较少了代码查找范围,但计算量大,并且要求较大的存储空间来存储程序执行信息,占用内存大;执行切片方法虽然从一定程度上解决了动态切片内存占用过大的问题,但是对所有代码的分析无疑又增加了代码调试人员的工作量。
技术实现思路
(一)要解决的技术问题本专利技术要解决的技术问题是:为适应由于代码规模增长、软件结构并行化带来的代码调试技术变化带来的需求,提高代码调试效率和精确度。(二)技术方案为了解决上述技术问题,本专利技术提供了一种基于回放的代码调试方法,包括以下步骤:S1、通过识别插桩点,在插桩点植入探针,对源程序进行插桩,为代码回放做准备;S2、应用向量时间戳标识并行程序的每一个同步事件,进行同步事件的追踪与记录;S3、进行并行程序的确定性回放。优选地,步骤S1具体包括以下步骤:源程序插桩:采用将源程序中的标准库函数替换为自定义函数的方法进行源程序插桩;捕获动态信息:将插桩后的源程序进行编译和链接,运行程序,随着探针的逐步插入,记录探针抛出的动态信息,写进事件记录库;数据处理与分析:通过对所述事件记录库中的数据进行提取和分析,揭露程序内部的行为和特征,为代码回放做准备。优选地,步骤S2具体包括以下步骤:同步事件的标识:通过为并行程序的每一个同步事件打上一个向量时间戳的方式对事件进行标识,然后根据这些事件的向量时间戳判断事件之间的时序关系,将时序关系进行记录;同步事件的追踪与记录:在追踪程序运行时判断每个消息接受操作所接受消息的来源及去向信息,并进行记录,每一个进程维护一个同步事件信息,用于追踪该进程当前运行到的同步事件以及向量时间戳;并且在追踪时,为每一个进程设置一个周期性的检查点,每隔预设时间,调用函数sigsuspend()自动挂起,调用检查点程序,保存当前进程的信息后,继续唤醒进程执行。优选地,步骤3中,当程序在运行过程中遇到错误终止,或者运行结束时,通过访问事件记录库中的信息,在回放模块与错误模块的相互协调下进行并行程序错误状态的回放与调试。优选地,步骤S3具体为:当程序开始执行时,目标进程的执行请求在请求队列中排队;回放模块从事件记录库中读取记录阶段所记录的事件信息,并与目标进程提交的执行请求进行比较,决定是允许此次并行操作的执行,还是将其在进程等待队列中执行挂起状态,等待下一次的响应,错误模块接收调试指令,控制进程的执行情况,在单步执行的基础上,读取进程的状态。(三)有益效果本专利技术通过插桩、追踪与记录以及回放的三步式的代码调试策略,消除了由并行程序中多个进程并行执行导致的并行程序在运行过程中的不确定性,定位了错误代码,实现了代码的确定性回放,能够明显提高代码调试的效率和准确度,改进了软件研发的质量,为并行程序调试工作提供了方法参考。附图说明图1为本专利技术实施例的方法流程图;图2为本专利技术实施例中代码回放步骤示意图。具体实施方式为使本专利技术的目的、内容、和优点更加清楚,下面结合附图和实施例,对本专利技术的具体实施方式作进一步详细描述。针对现有程序调试方法的不足和缺点,本专利技术实施例以并行程序为研究对象,研究一种基于回放的代码调试方法。并行程序在运行过程中,可能存在以下两种不确定性:一是外部不确定性,是指针对相同的输入,不同的执行过程导致不同的运行结果。该类不确定性有时是希望出现的,可以为开发人员提供多种解决问题的方案;而有时是不希望出现的,结果的不确定性被视为程序运行过程中的错误需要消除。二是内部不确定性,是指针对相同的输入,不同的执行过程导致了相同的运行结果,但是程序内部的执行路径却是不相同的。归根到底,不确定性的存在是由并行程序中多个进程并行执行导致的。因此,不确定性的消除将作为代码调试过程中重要内容。本专利技术中,通过以下方法研究不确定性消除技术:在运行时记录每个消息的来源及去向,根据记录内容形成特定的标识,强制每个消息接收具有与之相对应的特定标识的消息。定义消息线程传递的发送与接收操作为同步事件,为程序的执行构造同步事件执行序列。使得每一个同步事件按照规定好的顺序执行,从而消除不确定性,实现原始程序的重现,为代码重现打下良好基础。基于以上思路,本专利技术实施例提供的基于回放的代码调试方法提出“三步式”的代码调试策略:插桩、追踪与记录、回放,具体步骤包括:步骤1:通过识别插桩点,在插桩点植入探针,对源程序进行插桩。具体包括以下三个子步骤:(1)源程序插桩:在对同步事件进行追踪、记录的过程中,为了方便对事件信息进行收集和整理,并实现在程序回放过程中对进程行为进行准确的控制,采用的插桩方法为:替换源程序中的标准库函数。通过将关注的标准库函数替换为自定义的函数,实现源程序的代码插桩。假设待插桩的函数为rtypefunc(type1a1,type2a2,…typenan),式中,type1,type2,…,typen为形参a1,a2,…,an的参数类型,rtype为函数的返回类型,最终func对应的封装函数为:该函数中,c1,c2,…,cm是FUNC为完成特定功能所必须引入的额外参数,PRESTATEMENT与POSTSTATEMENT则是完成特定功能的插桩代码,且不能同时为空。功能封装函数FUNC(a1,a2,…,an,c1,c2,…,cm)同时具备了原函数和插桩函数的功能,将其替代源代码中的func(a1,a2,…,an),即完成了函数的插桩。(2)捕获动态信息:将插桩后的源程序本文档来自技高网
...
基于回放的代码调试方法

【技术保护点】
一种基于回放的代码调试方法,其特征在于,包括以下步骤:S1、通过识别插桩点,在插桩点植入探针,对源程序进行插桩,为代码回放做准备;S2、应用向量时间戳标识并行程序的每一个同步事件,进行同步事件的追踪与记录;S3、进行并行程序的确定性回放。

【技术特征摘要】
1.一种基于回放的代码调试方法,其特征在于,包括以下步骤:S1、通过识别插桩点,在插桩点植入探针,对源程序进行插桩,为代码回放做准备;S2、应用向量时间戳标识并行程序的每一个同步事件,进行同步事件的追踪与记录;S3、进行并行程序的确定性回放。2.如权利要求1所述的方法,其特征在于,步骤S1具体包括以下步骤:源程序插桩:采用将源程序中的标准库函数替换为自定义函数的方法进行源程序插桩;捕获动态信息:将插桩后的源程序进行编译和链接,运行程序,随着探针的逐步插入,记录探针抛出的动态信息,写进事件记录库;数据处理与分析:通过对所述事件记录库中的数据进行提取和分析,揭露程序内部的行为和特征,为代码回放做准备。3.如权利要求1所述的方法,其特征在于,步骤S2具体包括以下步骤:同步事件的标识:通过为并行程序的每一个同步事件打上一个向量时间戳的方式对事件进行标识,然后根据这些事件的向量时间戳判断事件之间的时序关系,将时序关系进行记录;同步事件的追踪与记录:在追踪程序运行时...

【专利技术属性】
技术研发人员:蒋欣欣张杨闫帅
申请(专利权)人:北京计算机技术及应用研究所
类型:发明
国别省市:北京,11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1