一种软件资源检测方法 本发明涉及计算机软件测试技术,具体涉及SDL软件中各种资源使用情况的一种检测方法。
SDL(Specification and Description Language)是CCITT制定的一种形式化的描述语言,它主要着眼于规定电信系统的行为,将一种信息准确的从一个人传递到另一个人。因此它在电信行业中应用相当广泛。在SDL软件中,涉及到各种系统资源,如时隙、内存、用户状态、定时器等。在SDL状态机迁移至一个稳定的状态或STOP时,所有这些系统资源都要归还给系统或对这些系统资源的使用数维持在一个相对稳定的数目,即申请的各种资源在使用结束后应该被释放。
在现有技术中,有很多检测内存使用是否正确的方法,例如在申请号为98104528.6,名称为“程序设计中内存操作错误的识别方法”的中国专利及申请号为97108834.9,以及名称为“计算机存储器的维护方法”的中国专利中,均介绍了检测内存操作错误的方法,但这些方法存在以下的缺陷:(1)只适用于存储器方面操作错误的检测;(2)需要增加大量的代码或设计较复杂的测试工具,实现起来不方便、不灵活。
本发明的目的,就是克服现有技术地上述不足,提供一种方便、灵活的方法,能够检测SDL软件中各种系统资源使用是否正确,从而可以提高软件的可靠性。
本发明的目的是这样实现的:在被测SDL软件中各种资源申请及释放的相关过程中增加一个相应资源的使用计数器,即申请某一种资源时,如果该资源已经申请过,则表示申请一个已经申请过的资源,记录该错误,否则该计数器加1;释放该资源时,如果该资源没有申请过,则说明SDL软件释放没有申请过的资源,记录该错误,否则相应计数器减1。在SDL状态机迁移至一个稳定的状态时或STOP之前,检查所有资源的使用计数,如果相应计数为零,则说明对该类资源使用正常,如果大于零,则说明该类资源已申请但没有释放。在稳定状态下,某些资源的使用计数可能不为零,但其总数应该维持在一个相对稳定的范围内。
按照CCITT对SDL的定义,SDL进程一般分为两种:
(1)进程在系统中一直生存。
(2)进程通过执行一个动作而停止(STOP)。
对于在系统中一直存在的进程,一般在该进程迁移至一个稳定的状态时进行所有资源使用情况的检测;对于可以STOP的进程,应在该进程STOP之前进行所有资源使用情况的检测。
在CCITT所定义的SDL标准中,一个进程可以有多个实例,这些实例可以同时存在,可以各自独立地以及并发地执行。另外,对于同一个资源,也可能有多个进程都要访问。因此,用于记录某类资源的全局变量一般使用一个二维结构数组,一维用于表示进程的实例,一维用于表示该类资源的第几个。除了数组,也可以采用链表等方法来记录资源的使用情况。
实施本发明提供的SDL软件资源检测方法,可以有效的检测SDL软件中涉及的各种系统资源的使用情况,这些资源包括但不限于:内存、定时器、时隙、用户状态,中断。即包括各种使用前需要申请,使用后需要归还的硬件资源,以及各种与硬件无直接关系的软件资源。具体地说,本发明可以解决以下问题:
(1)检测SDL软件中涉及的资源在使用后是否正确释放;
(2)检测SDL软件是否存在申请已经申请过的资源的情况;
(3)检测SDL软件中是否存在释放没有申请过的资源的情况;
(4)检测SDL软件在释放资源时,与该资源相关的一些参数是否被修改或所带入的参数是否正确。
本发明提供的SDL软件资源检测方法并不局限于某一产品,是一种通用的资源检测方法,能及时地检测出编程和计算机程序运行过程中发生的资源使用错误的情况,从而提高软件的可靠性。提示开发、维护人员进行跟踪解决。在一些需要连续运行程序的环境中,如在程控交换机的维护管理中,具有很实际的意义和良好的效果。同时本发明提供的方法实现起来比较简单,需要增加的代码及对被测程序所作的修改也比较少,因此具有很高的实用性。
下面结合附图和实施例,进一步说明本发明的技术方案。
图1是利用本发明的方法进行SDL软件资源检测的步骤;
图2是申请某类资源的第N个资源的检测方法工作流程图;
图3是释放某类资源的第N个资源的检测方法工作流程图;
图4是在SDL状态机迁移到稳定状态时或STOP之前对某一类资源是否全部释放的检测方法的工作流程图;
图5是本发明的方法应用于SDL软件测试的系统结构图。
图1是采用本发明的方法进行SDL软件资源检测的工作步骤。在图1中,首先执行101,在被测SDL软件的各种资源申请过程中加入如图2所示的资源申请检测方法;执行102,在各种资源释放函数中加入如图3所示的资源释放检测方法;再执行103,加入如图4所示SDL状态机迁移至稳定状态时或STOP前的所有资源的检测方法;接着执行104,在被测程序的主程序中加入资源检测程序所用到的各种变量初始化过程;然后执行105,将被测程序与测试程序一起编译、链接生成可执行程序,运行该程序,即可得到错误记录,分析错误记录从而实现故障定位。其中上述的步骤包括但不限于上述的顺序,只要步骤105是最后的一个步骤即可。
图2是在资源申请过程中加入的资源申请检测方法的工作流程图,该图以申请某类资源的第N个资源为例来进行说明。对于SDL软件存在的每一类资源,在该类资源的申请过程中均可以加入图2所示的检测方法。
在图2中,201用于取得申请资源的进程PID(Process ID)。由于系统中的所有进程都可能申请某个资源,为了区别不同的进程,我们采用进程的PID来标识是哪一个进程申请资源。因为在一个系统中,进程的PID是唯一的;202表示在记录该类资源使用情况的数组中查找该PID所对应的数组单元的过程。本发明中使用一个二维结构数组来保存该类资源的使用情况,如果找到相应的PID,则可得到其数组第一维下标M,如果没有找到,则指定一个空的单元M来保存资源的使用计数,及申请资源的进程PID;203用于判断第[M][N]个单元的资源是否申请过;如果申请过,则表示SDL程序又申请已经申请的资源,通过执行204来记录该错误,然后结束资源检测过程。在这里需要指出的是,有一些资源可能多次申请也表示是正常情况,如定时器资源申请第二次时,它只是简单地将前面设置的定时器清掉,重新设置成新的定时时长。因此对于一些特殊的资源要区别对待;执行203后,如果第[M][N]个单元的资源没有申请过,则执行205,保存申请资源时所带入的相关参数到第[M][N]个单元,相关参数是指与该资源相关的其它信息,如节点号、子节点号,用户状态等,而且这些信息在程序运行过程中不会改变,这样在释放该类资源时也要对该类信息进行检查,是否存在在程序运行过程中被错误地修改的情况或释放该资源时,所带入的参数是否正确。对于某些资源,如用户状态,在申请该类资源时,将带入用户状态的相关信息,该信息将被SDL软件使用并保存下来,在释放该类资源时,检测程序将检查被SDL软件保存下来的用户状态与检测程序所保存下来的用户状态是否一致,如果不一致则说明用户状态被错误地修改了;另外还有一类资源,如时隙的申请过程中会带入与该时隙相关的节点及子节点号,在释放该资源时,也会带入与该时隙相关的节点及子节点号,这样检测程序就可以检测释放资源程序所带入的参数与检测程序所保存的参数是否一致;最后执行206将相应单元的资源使用计数值加1。
图3是在资源释放过程中加入的资源释放检测方法的工作流程图,该图以释放某类资源的第N个资源为例来进行说明。与图2相对应,对于SDL软件中存在的每一类资源,在该类资源的释放过程中均可以加入图3所示的检测方法。在图3中,301用于取得释放资源的进程PID;然后执行302找到该PID所对应的数组单元M;执行303,判断是否找到与释放资源的进程PID相同的单元M;如果没有找到,则说明所要释放的是还没有申请的资源,则执行305来记录该错误;如果找到单元M,则执行304,判断第[M][N]个单元资源是否申请过;如果没有申请过,则执行305来记录“释放没有申请过的资源”错误;如果该资源已经申请过,则执行306检查所带入的相关参数与在申请时所带入的参数是否一致或检查检测程序所保存的参数与SDL程序所保存的参数是否一致;如果不一致,则说明释放资源时带入的参数错误或相关参数在程序运行过程中被修改,则执行307来记录“参数不一致”的错误。例如:SDL软件应该释放某类资源的第N个资源,该资源的节点号为N,子节点号为N,且带入释放函数的参数中节点号为N,子节点号为N,但是SDL程序错误地释放第N+1个资源,而第N+1个资源的节点号为N+1,子节点号为N+1,则资源释放检测程序发现释放的资源的参数与保存的数据不一致,检测程序将记录该类错误;最后检测程序执行308将相应资源的使用计数减1,结束资源释放检测过程。
图4是在SDL状态机迁移至一个稳定的状态时或STOP之前,对某一类资源进行检测的方法流程图。对于SDL软件中存在的每一类资源,都要在SDL程序迁移至稳定状态时或STOP之前检测该资源的使用情况,即加入如图4所示的检测方法。在图4中,首先执行401取得当前进程的PID;执行402查找与当前进程PID相同的单元M;执行403,判断是否找到单元M,如果没有找到,则说明该进程没有使用该类资源,结束资源检测程序;如果找到单元M,则执行404,从该类资源的第一个开始检测;执行405,判断该类资源的第[M][N]个的使用计数是否为零,如果不为零,则表示该资源申请了但没有释放,执行406记录没有释放资源的错误;接着执行407准备检测该类资源的下一个单元资源;执行408判断N是否大于该类资源的总数,如果大于则结束检测过程,否则回到405,继续该类资源的下一个单元资源的检测,直到该类资源的所有资源全部检测完为止。
在SDL软件中,有一些资源可能一直占用而不释放,对于这一类情况,在进程进入稳定状态时不可能直接通过检查该资源的使用计数来判断是否存在资源没有释放的情况,此时应对本发明的方法灵活的运用即可解决该类问题,如:对于一些申请后一直占用的资源,不进行计数。
另外即使是有资源申请后被占用而不释放,其占用的总数也应该维持在一个相对稳定的数目,如果资源占用的总数一直增加,则也表示有错误存在。
图5是将本发明的方法应用于SDL软件测试中后系统的结构图。该系统包括应用层、系统层、硬件平台,其中应用层的501表示被测SDL软件,502表示被测SDL软件提出资源申请请求,该请求被送到系统层的504,进行相应资源的申请检测,即完成图2中所示的功能。资源申请检测结束后即执行506,进行硬件平台的实际的资源申请。资源的释放过程与此类似,在SDL软件提出资源释放请求,即执行应用层的503后,该请求被送到系统层,执行505,进行资源释放检测,即完成图3所示的功能,然后执行507进行硬件平台的实际的资源释放。
最后介绍采用本发明方法对一个大型交换机软件进行了资源检测的一个具体的实施案例:利用本发明的方法构造的SDL软件资源检测程序是一个与产品及运行平台无关的测试工具,其使用方法如下:
被测软件中存在以下一些系统资源:如内存、T网话音时隙、收号器时隙、信号音时隙、定时器等。对于关心的SDL状态机,针对每一种资源,定义一个全局数组,在每种资源的申请函数中加入如图2所示的检测方法流程得到的代码,在每种资源的释放函数中加入如图3所示的检测方法流程得到的代码,在状态机迁移至稳定状态时或STOP之前,加入如图4所示的检测方法流程得到的代码,并在主程序中加入变量初始化代码,用于将检测用的所有全局变量清零。编译、链接并运行该交换机软件,最后得到错误记录,分析该错误记录从而协助开发人员进行故障定位。