避免软件冲突的方法和系统的制作方法

文档序号:6651924阅读:355来源:国知局

专利名称::避免软件冲突的方法和系统的制作方法
技术领域
:本发明涉及避免软件冲突,具体地说,涉及避免软件冲突的方法和系统。
背景技术
:就终端用户操作计算机的经历而言,软件冲突是一个严重的问题。当发生软件冲突时,应用将报告错误或者不能完成一些有用的功能。更加糟糕的是一些软件冲突不仅禁用当前应用,而且使计算机系统崩溃,由此终端用户必须重新启动计算机。软件冲突的原因主要有如下两方面(1)程序错误;(2)动态链接库/库/平台的原因,比如因为动态链接库/库/平台升级或者删除,所以执行调用的程序与所调用的动态链接库/库/平台之间出现如下情况在所述库中缺少被调用的函数、所调用的参数的个数与执行调用的程序的二进制可执行代码失配、所调用的参数的类型与执行调用的程序的二进制可执行代码失配或者所调用的函数的返回类型与执行调用的程序二进制可执行代码失配,即,调用方与被调用方之间的依赖关系失配。这样,使用者不能通过计算机完成所需的信息存储或处理。原因(1)的程序错误可由开发者通过严格的测试来解决。本发明主要针对于原因(2),即库依赖。众所周知,软件包括可执行文件和库(诸如windows的动态链接库或者linux/unix的lib/so/a)。库由软件或平台来提供。当可执行文件运行时,它将库加载到它的用户空间,并且根据地址或者名称空间来调用该库。当软件加载失配的库时,特别是当该库升级时,冲突发生。此时,软件试图调用库中的函数,但是由于升级的原因导致参数变化或者返回值变化,甚至从该库中删除了该函数。由此该库不能提供正确的函数,所以软件的运行将终止。针对上述问题,在现有技术中通常采用三种方法。方法(1)当运行库时检查该库的版本。如果版本失配,则退出可执行文件以避免计算机系统崩溃(如美国专利US6,397,378B1“TESTEXECUTIVESYSTEMANDMETHODINCLUDINGDISTRIBUTEDTYPESTORAGEANDCONFLICTRESOLUTION”)。方法(2)减小库的依赖。例如,让可执行文件仅使用长期不会发生变化的库的基本函数。该方法能够完美地解决上述问题,但是它需要开发者逐条重写源代码,这需要大量的人力和物力。方法(3)涉及虚拟机技术。如果在操作系统上仅运行唯一的软件,则将永远不会导致冲突。于是,在计算机上可以构建多台虚拟机,并且在每台虚拟机上仅运行一个应用。该方法并不理想,其原因为(I)这将导致计算机性能的显著下降;(II)这与库的目的相悖,在虚拟机上,库如同应用的私有库,不能被其它应用共享。
发明内容有鉴于上述情况,本发明的目的是提供一种防止软件冲突的方法/系统,因为其中的预扫描步骤/模块预扫描至少三种语法冲突,所以相对于仅扫描版本的现有技术中的方法(1)来讲,更加有效。因为其中的预扫描步骤/模块预扫描全部库函数,所以相对于仅扫描基本库函数的现有技术中的方法(2)来讲,能够节约人力和物力。因为其中的预扫描步骤/模块预扫描全部库函数,所以相对于采用虚拟机的现有技术中的方法(3)来讲,能够带来如下技术效果(I)提高计算机的存储和处理性能;(II)库能被其它应用共享。本发明的另一目的是提供一种防止软件冲突的方法/系统,因为其中的嗅探步骤/模块找出导致崩溃的库,所以相对于仅扫描版本的现有技术中的方法(1)来讲,更加有效。因为其中的嗅探步骤/模块监控全部导致崩溃的库函数,所以相对于仅扫描基本库函数的现有技术中的方法(2)来讲,能够节约人力和物力。因为其中的嗅探步骤/模块监控的调用序列至少包括一段可执行代码,所以相对于采用虚拟机的现有技术中的方法(3)来讲,能够带来如下技术效果(I)提高计算机性能的存储和处理;(II)库能被其它应用共享。本发明的另一目的是提供一种结合上述两种方法/系统的防止软件冲突的方法/系统,在结合上述两种方式的基础之上,不仅通过预扫描步骤在程序执行前对于软件冲突进行预防,而且对于通过预扫描的、却在实际调用过程中发生软件冲突的库进行监控并记录,进而防止通过了预扫描却发生软件冲突的库在下一次调用中再次发生软件冲突。为了实现上述目的,本发明提供一种在程序调用至少一个库的操作中防止软件冲突的方法,其中按照所述至少一个库之间的依赖关系将所述至少一个库划分为第1层到第M层,每一层具有至少一个库,M≥1,包括步骤(a)在执行一程序前,预扫描该程序的二进制可执行代码的调用方函数和属于所述第1层的各个库的、由所述程序的二进制可执行代码的调用方函数分别调用的被调用方函数,如果M>1,则还预扫描属于所述第1层到第M-1层的各个库的调用方函数和属于第2层到第M层的各个库的、由所述属于第1层到第M-1层的各个库的调用方函数分别调用的被调用方函数,以便判断在上述调用方函数和相应的被调用方函数之间是否分别存在冲突;(b)如果存在所述至少一个冲突,则保存至少一个分别指示该至少一个冲突的冲突信息;以及(c)当在运行的所述程序的调用序列中出现所述调用方函数调用相应的被调用方函数时,如果保存有指示该调用冲突的冲突信息,则放弃加载该被调用方函数的库,否则,加载该库。根据本发明的另一个方面,提供一种在程序调用至少一个库的操作中防止软件冲突的系统,其中按照所述调用次序该至少一个库分为M层,每一层具有至少一个库,M≥1,包括一预扫描模块,在执行一程序前,预扫描该程序的二进制可执行代码的调用方函数和属于所述第1层的各个库的、由所述程序的二进制可执行代码的调用方函数分别调用的被调用方函数,如果M>1,则还预扫描属于所述第1层到第M-1层的各个库的调用方函数和属于第2层到第M层的各个库的、由所述属于第1层到第M-1层的各个库的调用方函数分别调用的被调用方函数,以便判断在上述调用方函数和相应的被调用方函数之间是否分别存在冲突;一冲突信息知识保存模块,如果存在所述至少一个冲突,则保存至少一个分别指示该至少一个冲突的冲突信息;和一库加载模块,当在运行的所述程序的调用序列中出现所述调用方函数调用相应的被调用方函数时,如果保存有指示该调用冲突的冲突信息,则放弃加载该被调用方函数的库,否则,加载该库。根据本发明的另一个方面,提供一种在程序调用至少一个库的操作中防止软件冲突的方法,其中按照所述调用次序将该至少一个库分为M层,每一层具有至少一个库,M≥1,包括步骤(a)当执行所述程序的二进制可执行代码时,监控所述程序的二进制可执行代码的调用序列的当前运行的一段可执行代码,该调用序列调用所述M层库中的库函数;(b)如果在所述调用序列调用库函数的过程中发现所述调用序列崩溃,则保存关于该崩溃的冲突信息;以及(c)当该调用序列再次调用该库的一个函数时,如果保存有与该库相应的冲突信息,则放弃加载该库,否则,加载该库。根据本发明的另一个方面,提供一种在程序调用至少一个库的操作中防止软件冲突的系统,其中按照所述调用次序将该至少一个库分为M层,每一层具有至少一个库,M≥1,包括一嗅探模块,当执行所述程序的二进制可执行代码时,监控所述程序的二进制可执行代码的调用序列的当前运行的一段可执行代码,该调用序列调用所述M层库中的库函数;一冲突信息知识保存模块,如果在所述调用序列调用库函数的过程中发现所述调用序列崩溃,则保存关于该崩溃的冲突信息;和一库加载模块,当该调用序列再次调用该库的一个函数时,如果保存有与该库相应的冲突信息,则放弃加载该库,否则,加载该库。通过以下借助附图的详细描述,将会更容易地理解本发明,其中相同的标号指定相同结构的单元,并且在其中图1示出根据程序的二进制可执行代码及其所调用的多个库所生成的依赖关系树;图2A示出根据有效依赖关系对图1的依赖关系树裁减后的依赖关系树;图2B示出根据图2A的依赖关系树得到冲突知识的示意图;图3示出根据本发明一个优选实施例进行预扫描的流程图;图4A示出冲突信息知识保存模块保存由预扫描步骤/模块得到的至少一个分别指示至少一个冲突的冲突信息的数据结构;图4B示出冲突信息知识保存模块保存由嗅探步骤/模块得到的至少一个分别指示至少一个冲突的冲突信息的数据结构;图5示出根据本发明另一个优选实施例进行嗅探的流程图;图6示出调用堆栈的结构;图7示出根据本发明的一个优选实施例的预扫描模块的系统架构图;图8示出根据本发明的操作系统中的进程的存储器映像;和图9示出根据本发明的另一个优选实施例的嗅探模块的系统架构图。具体实施例方式本发明的防止软件冲突的方法/系统可分为两种采用预扫描方法/模块;或者,采用嗅探方法/模块。但是,本领域的技术人员应当了解集成预扫描方法/模块和嗅探方法/模块也是可行的,其原因为它们分别在不同的工作阶段中检测程序及其所依赖的库之间的冲突。表1示出上述方法/系统的组合方式表1预扫描方法/模块是在程序运行前预扫描该程序的二进制可执行代码,由此在该阶段中检测出会导致软件冲突的语法冲突。嗅探方法/模块是在程序运行时监控该程序的二进制可执行代码,并记录调用堆栈。如果进程崩溃,则嗅探方法/模块试图找出导致该崩溃的库。下面将结合附图详细描述作为本发明的优选实施例的方式3。在下面的描述中,现有避免软件冲突的方法和系统中公知的步骤和单元将不再详细描述,以免以不必要的细节混淆本发明。I.防止软件冲突的方法按照防止软件冲突的方法的步骤执行的次序,将该方法分析为安装/卸载库的步骤、预扫描步骤和/或嗅探步骤、避免软件冲突步骤。A.安装/卸载库的步骤众所周知,计算机操作系统在软件安装/启动初始化期间,一安装/删除模块将全部的库移动至一库数据库;以及在软件删除/关机期间,该安装/删除模块将该库从该库数据库除去。其通过对如下优选的记录结构操作,来完成上述步骤ProcessName//进程名称Conflict/un-conflict//冲突或不冲突Librarycallname//库调用名称Libraryindexnumberin“LibrariesDatabase”//在库数据库中库//的索引号在上述所加载的库中,可能存在由于
背景技术
部分中所述的第(2)方面的原因而导致软件冲突的库的存在。在随后的步骤中,本发明的方法将根据该库数据库中所记录的库进行一系列的处理,从而防止软件冲突的发生或再次发生。B.预扫描步骤作为优选实施例的预扫描步骤进一步分为(a)记录依赖关系的步骤;(b)根据有效依赖关系对该依赖关系进行裁减得到有效依赖关系树;(c)基于有效依赖关系树,根据被调用函数的参数的个数与调用函数的参数的个数是否失配、被调用函数的参数的类型与调用函数的参数的类型是否失配或者被调用的函数的返回类型与调用的函数的返回类型是否失配得到冲突知识的步骤。作为优选实施例,本发明采用作为公知技术的数据结构“树”及其“操作”(比如,插入、删除、合并、遍历等)来记录依赖关系。也就是说,依赖关系树是数据结构“树”的一个实例,其记录了可执行文件的二进制可执行代码与其可能调用的库数据库中所记录的库的依赖关系。本领域的技术人员应当了解,“树”并不对于本发明的范围进行限制,其它能够实现该依赖关系的数据结构,比如“图”、“表”及其操作等,也在本发明的范围之内。本领域的技术人员还应当了解本发明的优选实施例通过采用前序遍历完成预扫描并不对于本发明的范围进行限制,其它遍历方式,比如“中序”、“后序”及其操作等,也在本发明的范围之内。(a)记录依赖关系的步骤图1示出了生成依赖关系树的过程。其中,树的节点表示可执行文件或者其调用的库,树的指针表示由作为后继的节点所表示的库对由作为前趋的节点所表示的库的依赖关系。在本优选实施例中,将表示可执行文件A.EXE的节点作为根节点,用A表示。作为公知技术,可执行文件A.EXE包括参考表(referencetable),其记录该执行文件A.EXE的函数所调用的库的函数,对本优选实施例来讲库B的函数X1、库C的函数X2和库C的函数X3。根据上述调用关系,对于根节点A分别生成左、右后继节点B、C,其中节点B表示库B,节点C表示库C。节点A分别通过左、右指针指向节点B、C,该左、右指针分别表示二进制执行文件A.EXE对库B、C的依赖关系。基于相似的方式,根据库B的参考表中的内容,库B调用库D的函数Y1,调用库D的函数Y2,调用库E的函数Y3,生成节点B的左、右后继节点D、E。其中,节点D表示库D,节点E表示库E,该左、右指针分别表示库B对库D、E的依赖关系。由于库C、D、E的参考表为空,所以对上述节点来讲没有后继节点生成。伴随着上述树的生成过程,我们得到如下结果可执行文件A.EXE(节点A)依赖库B和库C(节点B和节点C),库B(节点B)依赖库D和库E(节点D和节点E)。优选地,上述关系依赖树的生成过程的代码实现如下Functionbuild_dependency_tree(objectx)//x为可执行程序或dllBeginReadreftableofxForeachelementiinreftabledoBeginRecord(x,i,false)intotreedb.Build_dependency_tree(i);endEnd这样,根据可执行文件的二进制可执行代码生成了依赖关系树,其记录了当前执行文件与库以及库与库之间的依赖关系。但是,上述依赖关系建立的基础仅仅是在可执行文件或库的参考表中作了调用方和被调用方名称之间的匹配,而仅仅在调用方名称和被调用方名称之间的匹配并不能够足以避免由
背景技术
部分中的方面(2)所引起的软件冲突,也就是说,按照上述依赖关系中的某些依赖关系进行函数调用仍然会导致软件冲突。由此,有必要对上述依赖关系作必要的选择以便进一步删除那些会导致软件冲突的依赖关系,即进行下面的步骤(b)和(c)。其中,步骤(b)是优选的,其通过裁减生成有效依赖树进而能够减少步骤(c)中的遍历的次数,由此提高效率。(b)根据有效依赖关系对该依赖关系进行裁减生成有效依赖关系树首先,我们给出有效依赖关系的定义实体1依赖实体2,同时实体2依赖实体3,如果在实体1存在某一函数,该函数通过调用实体2的函数而进一步调用实体3的函数,则我们称对于实体1来讲,实体2有效依赖实体3,否则为非有效依赖。比如,程序的可执行代码A的某一函数调用库B的函数X1,同时库B的函数X1又调用库D的函数Y1,则对于程序A来讲库B有效依赖库D,如果不存在满足上述要求的可执行代码A的函数,则对于程序A来讲库B非有效依赖库D。基于上述定义,如果实体1非有效依赖相应于实体3,那么会发生软件冲突,这正是本发明所要避免的。对于本发明的优选实施例来讲,缺乏有效依赖对应于被依赖的库中是否缺少被调用的函数。图2A示出根据有效依赖关系对生成的依赖关系树进行裁减后的有效依赖关系树。即,根据在被调用的库中是否缺少被调用的函数来判断有效的依赖关系,进而对图1中的非有效依赖的节点进行裁减。裁减的过程如下首先,遍历到节点A,并且扫描节点A所表示的可执行文件A.EXE的所有代码以便得到全部调用指令对应的函数名,就本优选实施而言,可以是库B的函数X1、库C的函数X2和库C的函数X3。由于执行文件A.EXE调用库B的函数X1,所以节点A有效依赖节点B。然后,遍历到节点B,扫描节点B所表示的库B的所有代码以便找出由可执行文件A.EXE所调用的库B的函数X1所调用的库D、E的函数。这里有必要说明,虽然库B调用库D的函数Y1、库D的函数Y2和库E的函数Y3,但是由可执行文件A.EXE所调用的库B的函数,比如X1,却不一定调用这三个函数中的每一个,即库B的函数X1可能调用其中之一或者其中的两个,具体到该优选实施例中,库B的函数X1调用D的函数Y1和库D的函数Y2,却不调用库E的函数Y3。然后,遍历到节点D,由于由执行文件A.EXE调用的库B的函数X1调用D的函数Y1和库D的函数Y2,所以节点A有效依赖节点D。然后遍历到节点E,由于由执行文件A.EXE调用的库B的函数X1不调用库E的函数Y3,所以节点A不有效依赖节点E。然后遍历到节点C,由于执行文件A.EXE调用库C的函数X2和库C的函数X3,所以节点A有效依赖节点C。最后,裁减上述非有效依赖节点E。由此生成了如图2A所示的有效关系依赖树,其中可执行文件A.EXE(节点A)依赖库B和库C(节点B和节点C),库B(节点B)依赖库D(节点D)。优选地,上述各节点之间的依赖关系可以采用如下形式存放依赖关系记录Node1,Node2,boolean表达语义为,Node1依赖Node2,boolean为临时变量,用于筛选。比如节点A依赖节点B的记录为A,B,兼容,节点A不依赖节点B的记录为A,B,冲突,并且记录缺省也表示不依赖。优选地,裁减过程的代码实现如下开始时候,x=Exe.a;runbuild_valid_dependency(x);Functionbuild_valid_dependency_tree(objectx)//x为函数BeginScancodeinx;//扫描x中的所有代码Foreachcall/jump/longjumpincodedo//针对每一个函数调用指//令Beginy=调用指令对应的函数名xa=x所在的dll或exe文件;ya=y所在的dll或exe文件;修改记录为(xa,ya,true);//记录xa有效依赖ya的结果为真Build_valid_dependency_tree(y);endEnd对于本优选实施例来讲,生成如下依赖关系记录A,B,兼容;B,D,兼容;B,E,冲突;A,C,兼容。由于在有效依赖树中裁减掉了该程序的可执行代码实际上不会调用的库的节点,比如节点E,所以相对于未裁减的依赖关系树来讲可以提高对有效依赖关系树的操作的速度,比如遍历,而不降低预扫描的精确度。(c)基于有效依赖关系树,根据被调用函数的参数的个数与调用函数的参数的个数是否失配/被调用函数的参数的类型与调用函数的参数的类型是否失配/被调用的函数的返回类型与调用的函数的返回类型是否失配得到冲突知识的步骤如果有如下情况之一被调用函数的参数的个数与调用函数的参数的个数失配、被调用函数的参数的类型与调用函数的参数的类型失配、被调用的函数的返回类型与调用的函数的返回类型失配,则判断为非有效依赖关系。基于上述定义,如果存在上述非有效依赖关系,那么也会发生软件冲突,这正是本发明所要避免的。图2B示出根据所调用的参数的个数与所述二进制可执行代码是否失配/所调用的参数的类型与所述二进制可执行代码是否失配/所调用的函数的返回类型与所述二进制可执行代码是否失配来判断是否存在依赖关系,得到冲突知识。首先,遍历到节点A,并且扫描节点A所表示的可执行文件A.EXE的所有代码以便扫描全部调用指令对应的函数在调用之前的参数类型/个数/返回类型,就本优选实施而言,可以是库B的函数X1、库C的函数X2和库C的函数X3在调用之前的参数类型/个数/返回类型。然后,遍历到节点B,扫描库B的函数X1中需要传入的参数类型/个数/返回类型和库B所调用的库D的函数Y1、库D的函数Y2在调用之前的参数类型/个数/返回类型,并且将所述库B的函数X1在调用之前的参数类型/个数/返回类型与所述库B的函数X1中需要传入的参数类型/个数/返回类型分别进行比较,如果不符合,则修改节点A与节点B的依赖关系记录,以便形成冲突知识。然后,遍历到节点D,扫描库D的函数Y1、库D的函数Y2中需要传入的参数类型/个数/返回类型,并且将所述库B所调用的库D的函数Y1、库D的函数Y2在调用之前的参数类型/个数/返回类型和库D的函数Y1、库D的函数Y2中需要传入的参数类型/个数/返回类型进行比较,如果不符合,则修改节点A与节点B的依赖关系记录,以便形成冲突知识。然后,遍历到节点C,扫描库C的函数X2、库C的函数X3中需要传入的参数类型/个数/返回类型,并且将所述库C的函数X2和库C的函数X3在调用之前的参数类型/个数/返回类型和库C的函数X2、库C的函数X3中需要传入的参数类型/个数/返回类型进行比较,如果不符合,则修改节点A与节点C的依赖关系记录,以便形成冲突知识。例如,如果依据调用函数的参数的个数与调用函数的参数的个数失配/被调用函数的参数的类型与调用函数的参数的类型失配/被调用的函数的返回类型与调用的函数的返回类型失配这一标准,通过上述步骤(c)得到可执行文件A与库B相配,库B与库D相配,而可执行文件A与C失配,则将当前依赖关系记录中的(A,C,兼容)修改为(A,C,冲突)。优选地,上述过程的代码实现如下beginForeachrecord(xa,ya,boolean)intreedbdoBeginSet“xacompatiblewithya”;//扫描xa代码Foreachcallinstructioninxado//对xa内每一处函数调用//语句BeginIf(thefunctioncalledbelongstoya)thenbegincall_context1=xa中的调用之前的参数类型/个数/返回类型call_context2=对应ya的函数中需要传入的参数类型个数/返回类型ifcall_context1!=callcontext2thenBeginSet“xaimcompatiblewithya”;Jumpoutofforcircleendendendendend优选地,修改依赖关系记录的代码实现如下Deleterecordwhenboolean=falsefromtreedb;//删除全部结果//非真的记录图4A示出一冲突信息知识保存模块保存由预扫描步骤得到的至少一个分别指示至少一个冲突的冲突信息的数据结构。其记录了上述修改的结果,即程序A与库B相兼容,A与库C相冲突,库B和库D相兼容。该数据结构优选为“表”,但是,本领域的技术人员应当了解利用其它的数据结构,比如“树”、“图”等,也可以记录上述冲突信息。这里,我们按照所述调用次序将被程序的二进制可执行代码调用的库分为M层,每一层具有至少一个库,M≥1。比如,图1中的根节点A表示程序A的二进制可执行代码,按照其调用次序将由节点B、C表示的库B、C作为第一层,将由节点D、E表示的库D、E作为第二层,该程序A调用第一层的库B、C,第一层的库B调用第二层的库D、E,其中M=2。图3示出进行预扫描的流程图。步骤S301,在执行一程序前,预扫描该程序的二进制可执行代码的调用方函数和属于所述第1层的各个库的、由所述程序的二进制可执行代码的调用方函数分别调用的被调用方函数。比如,预扫描程序A中的调用方函数与其调用的库B中的函数X1。步骤S302,判断M是否大于1,如果是,则进入步骤S303,预扫描属于所述第1层到第M-1层的各个库的调用方函数和属于第2层到第M层的各个库的、由所述属于第1层到第M-1层的各个库的调用方函数分别调用的被调用方函数,比如,预扫描库B中的调用函数与由其调用的库D的函数Y1和Y2,然后进入步骤S304;否则,进入步骤S304。在步骤S304,判断在上述调用方函数和相应的被调用方函数之间是否分别存在冲突,比如被调用方函数的参数的个数与调用方函数的参数的个数的失配、被调用函数方的参数的类型与调用方函数的参数的类型的失配或者被调用方的函数的返回类型与调用方的函数的返回类型的失配二进制可执行代码。具体来讲,所述调用方函数和相应的被调用方函数的冲突是语法失配。在步骤S305,如果存在所述至少一个冲突,则保存至少一个分别指示该至少一个冲突的冲突信息。作为优选实施方式,在所述由程序所调用的M层库中,仅预扫描该程序有效依赖的库。因为该预扫描步骤预扫描至少三种语法冲突,所以相对于仅扫描版本的现有技术中的方法(1)来讲,更加有效。因为该预扫描步骤预扫描全部库函数,所以相对于仅扫描基本库函数的现有技术中的方法(2)来讲,能够节约人力和物力。因为该预扫描步骤预扫描全部库函数,所以相对于采用虚拟机的现有技术中的方法(3)来讲,能够(I)提高计算机性能;(II)库能被其它应用共享。C.嗅探步骤图5示出嗅探步骤的流程图。嗅探步骤是在程序运行时监控该程序的二进制可执行代码,并记录调用堆栈。如果进程崩溃,则嗅探方法试图找出导致该崩溃的库。在步骤S501,一嗅探模块监控程序的调用序列的当前运行的一段可执行代码。所述调用序列可以包括至少一段可执行代码,其原因为例如,存在如下的调用(符号“->”表示调用关系)程序A->库B->库C->库B->程序A->库C->库D,其中多次调用分别对应多段可执行代码。嗅探模块可采用调用堆栈监控模块(callstackmonitor),调用堆栈监控模块是在IBMTivoli系列系统管理软件里面常用的一种系统监视技术,该技术通过检查在应用程序中、函数调用前后堆栈的变化是否符合一定的模式(pattern),以判断此应用程序是否处于异常/正常状态。在本发明中,其监控代码寄存器或特殊指令以便记录在所述调用序列调用所述库函数期间的全部调用/返回动作,所述特殊指令是调用或长/远跳转指令,监控在所述调用序列调用所述库函数期间的所执行的可执行代码与所执行的库代码之间的数据交换,以及通过检查调用堆栈来找出当前使用的库。图6示出调用堆栈的结构。比如,该调用堆栈可以记录了由可执行代码A的调用方函数调用库B的被调用方函数1,并且记录了由A传递给B的参数X和Y。在步骤S502,在所述调用序列调用库函数的过程中是否发现所述调用序列崩溃,比如错误中断或异常发生。如果,未发现,则不作处理;否则在步骤S503,嗅探模块判别当前的线程信息,例如当前的线程信息为所述调用序列仅包括一段还是多段可执行代码。如果所述调用序列仅包括一段可执行代码,则在步骤S504执行所述冲突信息保存步骤,否则,在步骤S505嗅探模块跟踪在所述冲突之前的最后函数调用中所交换的数据,以便提取导致该冲突的调用序列的最后一段可执行代码并且找出操作过该数据的库,然后前进到所述步骤S504,执行所述冲突信息保存步骤。比如,库B的函数X1调用库D的函数Y1时发生崩溃,则将库B和库D发生冲突的信息保存。步骤S504保存冲突信息的方式可以通过修改现有的依赖关系记录来完成,例如在预扫描步骤中所生成的依赖关系记录,或者通过修改由嗅探步骤自身生成的依赖关系记录来完成。作为优选实施例,采用前一种方式。即,在图4A所示的依赖关系记录的基础上,将记录(B,D,兼容)改为(B,D,冲突)。图4B示出冲突信息知识保存模块保存由嗅探步骤所得到的指示至少一个冲突的冲突信息的数据结构。步骤S501至S505的代码实现如下BeginReadcurrentTC(threadcontext)informationReadcallstackentranceofcurrentTCSetADDR=thelatestaddresspushedinstackSetya=thelibrarywhichADDRbelongstoQueryxa=theinitiatorwhichcallyafromdependency_tree(database).Record(xaincompatiblewithya)End因为嗅探步骤找出导致崩溃的库,所以相对于仅扫描版本的现有技术中的方法(1)来讲,更加有效。因为嗅探步骤监控全部导致崩溃的库函数,所以相对于仅扫描基本库函数的现有技术中的方法(2)来讲,能够节约人力和物力。因为嗅探步骤监控的调用序列至少包括一段可执行代码,所以相对于采用虚拟机的现有技术中的方法(3)来讲,能够(I)提高计算机性能;(II)库能被其它应用共享。D.避免软件冲突步骤众所周知,库加载模块通常是一挂接应用(hookapplication),其挂接全部dll加载模块应用和文件打开库,诸如Loadlibrary()和CreatFile()。当执行所述程序时,即执行其可执行二进制代码时,当在所述程序的调用序列中出现上述调用方函数调用相应的被调用方函数时,如果在该冲突信息知识保存模块中保存有与该库相应的冲突信息,则库加载模块放弃加载该库,否则,该库加载模块加载该库。当运行程序A的可执行代码时,例如存在如下情况,被运行的程序A的调用序列包括程序A调用库B的函数X1,而库B的函数X1又调用库D的函数Y1。根据依赖关系记录,程序A与库B兼容,而库B与库D冲突,所以,程序A的调用序列通过Loadlibrary()加载库B,而放弃加载库D。优选地,如果所调用的库是新的,则当存在至少一个所述库时,该库加载模块随机选择所述至少一个库之一;否则当在该冲突信息知识保存模块中存在关于该调用序列和该库的不冲突记录时,该库加载模块加载该库到进程空间;否则,放弃加载该库到进程空间。一显示部件提示用户是否关闭所述导致该冲突的调用序列的进程。作为上述方式(3),通过将上述预扫描步骤和嗅探步骤相结合,其所带来的技术效果是不仅通过预扫描步骤在程序执行前对于软件冲突进行预防,而且对于通过预扫描的、却在实际调用过程中发生软件冲突的库进行监控并记录,进而防止通过了预扫描却发生软件冲突的库在下一次调用中再次发生软件冲突。此外,相对于仅扫描版本的现有技术中的方法(1)来讲,更加有效。因为预扫描步骤和嗅探步骤检查全部库函数,所以相对于仅扫描基本库函数的现有技术中的方法(2)来讲,能够节约人力和物力。因为预扫描步骤和嗅探步骤检查全部库函数,所以相对于采用虚拟机的现有技术中的方法(3)来讲,能够(I)提高计算机性能;(II)库能被其它应用共享。II.防止软件冲突的系统图7示出根据本发明的一个优选实施例的系统架构图。按照防止软件冲突的系统的功能,将该系统分析为预扫描模块701、冲突信息知识存储模块702、安装/卸载库模块703、库加载模块704和库数据库705,其中,部分II中所述的防止软件冲突的系统的各个模块与部分I中的防止软件冲突的方法中的步骤相对应,所以将结合部分I对部分II逐一说明上述模块。安装/卸载库模块703执行所述的安装/卸载库的步骤,其目标是库数据库705。在库数据库705中,存储当前计算机中全部的库。其优选的记录结构如下ProcessName//进程名称Conflict/un-conflict//冲突或不冲突Librarycallname//库调用名称Libraryindexnumberin“LibrariesDatabase”//在库数据库中库的索引号根据所述的预扫描步骤,预扫描模块701将对于程序的二进制可执行代码和库数据库705中所记录的该程序的二进制可执行代码所调用的库进行一系列的预扫描,并且冲突信息知识保存模块702保存至少一个分别指示至少一个冲突的冲突信息的数据结构。然后,按照所述避免软件冲突步骤,如果在冲突信息知识保存模块702中保存有与该库相应的冲突信息,则库加载模块704放弃加载该库,否则,库加载模块704加载该库。图8示出根据本发明的操作系统中进程的存储器映像。一个进程能够在其空间中加载多个库。从用户模式(进程1的用户空间)可以看出,由库加载模块704加载的、与进程1无冲突的多个库1、2......m和系统库ntdll.dll/win。从内核模式可以看出,进程1、2......n根据地址或名称空间调用库函数。优选地,必须将系统库加载到固定地址,该系统库作为进程使用内核资源的桥梁,例如系统调用、中断等。在windows中,系统库是ntdll.dll,其连接内核和windows环境(包括kernel32.dll,user32.dll,advapi32.dll,gdi32.dll等)。图9示出根据本发明的另一个优选实施例的系统架构图。按照防止软件冲突的系统的功能,将该系统分析为嗅探模块901、冲突信息知识存储模块902、安装/卸载库模块903、库加载模块904和库数据库905。其中,冲突信息知识存储模块902、安装/卸载库模块903、库加载模块904和库数据库905与图7中的冲突信息知识存储模块702、安装/卸载库模块703、库加载模块704和库数据库705相同,为了简洁,下面只描述与图7不同的部分,嗅探模块901。按照上述嗅探步骤,嗅探模块901是在程序运行时监控该程序的二进制可执行代码,并记录调用堆栈。如果进程崩溃,则嗅探模块901试图找出导致该崩溃的库。嗅探模块901采用调用堆栈监控模块(callstackmonitor),调用堆栈监控模块是在IBMTivoli系列系统管理软件里面常用的一种系统监视技术,该技术通过检查在应用程序中、函数调用前后堆栈的变化是否符合一定的模式(pattern),以判断此应用程序是否处于异常/正常状态。在本发明中,其监控代码寄存器或特殊指令以便记录在所述调用序列调用所述库函数期间的全部调用/返回动作,所述特殊指令是调用或长/远跳转指令,监控在所述调用序列调用所述库函数期间的所执行的可执行代码与所执行的库代码之间的数据交换,以及通过检查调用堆栈来找出当前使用的库。如果在所述调用序列调用库函数的过程中发现所述调用序列崩溃,比如错误中断或异常发生,则在随后的步骤中,嗅探模块901将关于该崩溃的冲突信息保存在冲突信息知识存储模块902中。优选地,嗅探模块901判别当前的线程信息,例如当前的线程信息为所述调用序列仅包括一段还是多段可执行代码。如果所述调用序列仅包括一段可执行代码,则将冲突信息保存在冲突信息知识存储模块902中,否则,嗅探模块901跟踪在所述冲突之前的最后函数调用中所交换的数据,以便提取导致该冲突的调用序列的最后一段可执行代码并且找出操作过该数据的库,然后将冲突信息保存在冲突信息知识存储模块902中。因为嗅探模块901找出导致崩溃的库,所以相对于仅扫描版本的现有技术中的方法(1)来讲,更加有效。因为嗅探模块901监控全部导致崩溃的库函数,所以相对于仅扫描基本库函数的现有技术中的方法(2)来讲,能够节约人力和物力。因为嗅探模块901监控的调用序列至少包括一段可执行代码,所以相对于采用虚拟机的现有技术中的方法(3)来讲,能够(I)提高计算机性能;(II)库能被其它应用共享。优选地,预扫描模块701和嗅探模块901可以合并为一个模块,共同完成预扫描和嗅探。以上结合附图描述了本发明的优选实施例,但是本发明并不仅限于该具体的实施方式。在不偏离权利要求的精神和范围的情况下,可以对其做出各种改变。权利要求1.一种在程序调用至少一个库的操作中防止软件冲突的方法,其中按照所述至少一个库之间的依赖关系将所述至少一个库划分为第1层到第M层,每一层具有至少一个库,M≥1,包括步骤(a)在执行一程序前,预扫描该程序的二进制可执行代码的调用方函数和属于所述第1层的各个库的、由所述程序的二进制可执行代码的调用方函数分别调用的被调用方函数,如果M>1,则还预扫描属于所述第1层到第M-1层的各个库的调用方函数和属于第2层到第M层的各个库的、由所述属于第1层到第M-1层的各个库的调用方函数分别调用的被调用方函数,以便判断在上述调用方函数和相应的被调用方函数之间是否分别存在冲突;(b)如果存在所述至少一个冲突,则保存至少一个分别指示该至少一个冲突的冲突信息;以及(c)当在运行的所述程序的调用序列中出现所述调用方函数调用相应的被调用方函数时,如果保存有指示该调用冲突的冲突信息,则放弃加载该被调用方函数的库,否则,加载该库。2.如权利要求1所述的防止软件冲突的方法,其中根据所述程序的参考表及其所调用的库的参考表来确定所述与该程序的二进制可执行代码的调用相关的M层库;和在该程序和该M层库中的依赖关系。3.如权利要求2所述的防止软件冲突的方法,所述步骤(a)还包括在所述由程序的二进制可执行代码所调用的M层库中,仅预扫描该程序有效依赖的库。4.如权利要求3所述的防止软件冲突的方法,其中步骤(a)还包括所述调用方函数和相应的被调用方函数的冲突是语法失配。5.如权利要求4所述的防止软件冲突的方法,其中所述语法为被调用方函数的参数的个数与调用方函数的参数的个数;被调用函数方的参数的类型与调用方函数的参数的类型;和被调用方的函数的返回类型与调用方的函数的返回类型。6.如权利要求1所述的防止软件冲突的方法,其中以树来记录所述程序和由其调用的至少一个库之间的依赖关系,并且通过对树的遍历来完成所述预扫描。7.如权利要求1所述的防止软件冲突的方法,在步骤(c)之后还包括步骤(d)当执行所述程序的二进制可执行代码时,监控所述程序的二进制可执行代码的调用序列的当前运行的一段可执行代码,该调用序列调用所述M层库中的库函数;(e)如果在所述调用序列调用库函数的过程中发现所述调用序列崩溃,则保存关于该崩溃的冲突信息;以及(f)当该调用序列再次调用该库的一个函数时,如果保存有与该库相应的冲突信息,则放弃加载该库,否则,加载该库。8.如权利要求7所述的防止软件冲突的方法,其中所述调用序列包括至少一段可执行代码。9.如权利要求7所述的防止软件冲突的方法,其中所述步骤(d)进一步包括监控代码寄存器或特殊指令以便记录在所述调用序列调用所述库函数期间的全部调用/返回动作。10.如权利要求9所述的防止软件冲突的方法,其中所述特殊指令是调用或长/远跳转指令。11.如权利要求9所述的防止软件冲突的方法,其中所述步骤(d)进一步包括步骤监控在所述调用序列调用所述库函数期间的所执行的可执行代码与所执行的库代码之间的数据交换。12.如权利要求9所述的防止软件冲突的方法,其中采用调用堆栈监控模块以进行所述监控。13.如权利要求12所述的防止软件冲突的方法,其中所述调用堆栈监控模块通过检查调用堆栈来找出当前使用的库。14.如权利要求1所述的防止软件冲突的方法,在所述步骤(d)之前还包括在软件安装期间,将全部的库移动至一库数据库;以及在软件删除期间,将该库从该库数据库除去。15.如权利要求14所述的防止软件冲突的方法,还包括从该库数据库中加载库。16.如权利要求11所述的防止软件冲突的方法,所述步骤(e)还包括如果所述调用序列仅包括一段可执行代码,则执行所述冲突信息保存步骤;否则,跟踪在所述冲突之前的最后函数调用中所交换的数据,以便提取导致该冲突的调用序列的最后一段可执行代码并且找出操作过该数据的库,然后执行所述冲突信息保存步骤。17.如权利要求15所述的防止软件冲突的方法,还包括一显示部件提示用户是否关闭所述导致该冲突的调用序列的进程。18.如权利要求15所述的防止软件冲突的方法,其中如果所调用的库是新的,则当存在至少一个所述库时,该库加载模块随机选择所述至少一个库之一;否则当在该冲突信息知识保存模块中存在关于该调用序列和该库不冲突的记录时,该库加载模块加载该库到进程空间;否则,放弃加载该库到进程空间。19.一种在程序调用至少一个库的操作中防止软件冲突的系统,其中按照所述调用次序该至少一个库分为M层,每一层具有至少一个库,M≥1,包括一预扫描模块,在执行一程序前,预扫描该程序的二进制可执行代码的调用方函数和属于所述第1层的各个库的、由所述程序的二进制可执行代码的调用方函数分别调用的被调用方函数,如果M>1,则还预扫描属于所述第1层到第M-1层的各个库的调用方函数和属于第2层到第M层的各个库的、由所述属于第1层到第M-1层的各个库的调用方函数分别调用的被调用方函数,以便判断在上述调用方函数和相应的被调用方函数之间是否分别存在冲突;一冲突信息知识保存模块,如果存在所述至少一个冲突,则保存至少一个分别指示该至少一个冲突的冲突信息;和一库加载模块,当在运行的所述程序的调用序列中出现所述调用方函数调用相应的被调用方函数时,如果保存有指示该调用冲突的冲突信息,则放弃加载该被调用方函数的库,否则,加载该库。20.如权利要求19所述的防止软件冲突的系统,其中根据所述程序的参考表及其所调用的库的参考表来确定所述与该程序的二进制可执行代码的调用相关的M层库;和在该程序和该M层库中的依赖关系。21.如权利要求20所述的防止软件冲突的系统,其中在所述由程序的二进制可执行代码所调用的M层库中,仅预扫描该程序有效依赖的库。22.如权利要求21所述的防止软件冲突的系统,其中所述调用方函数和相应的被调用方函数的冲突是语法失配。23.如权利要求22所述的防止软件冲突的系统,其中所述语法为被调用方函数的参数的个数与调用方函数的参数的个数;被调用函数方的参数的类型与调用方函数的参数的类型;和被调用方的函数的返回类型与调用方的函数的返回类型。24.如权利要求23所述的防止软件冲突的系统,其中以树来记录所述程序和由其调用的至少一个库之间的依赖关系,并且通过对树的遍历来完成所述预扫描。25.如权利要求19所述的防止软件冲突的系统,还包括一嗅探模块,监控至少一个程序的调用序列的当前运行的一段可执行代码;一冲突信息知识保存模块,如果在所述调用序列调用库函数的过程中发现所述调用序列崩溃,则保存关于该崩溃的冲突信息;和一库加载模块,当该调用序列再次调用该库的一个函数时,如果在该冲突信息知识保存模块中保存有与该库相应的冲突信息,则放弃加载该库,否则,该库加载模块加载该库。26.如权利要求25所述的防止软件冲突的系统,其中所述调用序列包括至少一段可执行代码。27.如权利要求25所述的防止软件冲突的系统,其中所述嗅探模块还监控代码寄存器或特殊指令以便记录在所述调用序列调用所述库函数期间的全部调用/返回动作。28.如权利要求27所述的防止软件冲突的系统,其中所述特殊指令是调用或长/远跳转指令。29.如权利要求27所述的防止软件冲突的系统,其中所述步骤(a)进一步包括步骤所述嗅探模块监控在所述调用序列调用所述库函数期间的所执行的可执行代码与所执行的库代码之间的数据交换。30.如权利要求27所述的防止软件冲突的系统,其中所述嗅探模块采用调用堆栈监控模块。31.如权利要求30所述的防止软件冲突的系统,其中所述调用堆栈监控模块通过检查调用堆栈来找出当前使用的库。32.如权利要求19所述的防止软件冲突的系统,还包括一安装/删除模块,在所述嗅探之前,在软件安装期间将全部的库移动至一库数据库,以及在软件删除期间将该库从该库数据库除去。33.如权利要求32所述的防止软件冲突的系统,还包括所述库加载模块从该库数据库中加载库。34.如权利要求39所述的防止软件冲突的系统,其中如果所述调用序列仅包括一段可执行代码,则所述冲突信息知识保存模块保存所述冲突信息;否则,所述嗅探模块跟踪在所述冲突之前的最后函数调用中所交换的数据,以便提取导致该冲突的调用序列的最后一段可执行代码并且找出操作过该数据的库,然后冲突信息知识保存模块保存所述冲突信息。35.如权利要求33所述的防止软件冲突的系统,还包括一显示部件,提示用户是否关闭所述导致该冲突的调用序列的进程。36.如权利要求33所述的防止软件冲突的系统,其中如果所调用的库是新的,则当存在至少一个所述库时,该库加载模块随机选择所述至少一个库之一;否则当在该冲突信息知识保存模块中存在关于该调用序列和该库不冲突的记录时,该库加载模块加载该库到进程空间;否则,放弃加载该库到进程空间。37.一种在程序调用至少一个库的操作中防止软件冲突的方法,其中按照所述调用次序将该至少一个库分为M层,每一层具有至少一个库,M≥1,包括步骤(a)当执行所述程序的二进制可执行代码时,监控所述程序的二进制可执行代码的调用序列的当前运行的一段可执行代码,该调用序列调用所述M层库中的库函数;(b)如果在所述调用序列调用库函数的过程中发现所述调用序列崩溃,则保存关于该崩溃的冲突信息;以及(c)当该调用序列再次调用该库的一个函数时,如果保存有与该库相应的冲突信息,则放弃加载该库,否则,加载该库。38.一种在程序调用至少一个库的操作中防止软件冲突的系统,其中按照所述调用次序将该至少一个库分为M层,每一层具有至少一个库,M≥1,包括一嗅探模决,当执行所述程序的二进制可执行代码时,监控所述程序的二进制可执行代码的调用序列的当前运行的一段可执行代码,该调用序列调用所述M层库中的库函数;一冲突信息知识保存模块,如果在所述调用序列调用库函数的过程中发现所述调用序列崩溃,则保存关于该崩溃的冲突信息;和一库加载模块,当该调用序列再次调用该库的一个函数时,如果保存有与该库相应的冲突信息,则放弃加载该库,否则,加载该库。全文摘要本发明的目的是提供一种防止软件冲突的方法/系统,将库划分为第1层到第M层,M≥1。所述方法包括(a)在执行一程序前,预扫描该程序的二进制可执行代码的调用方函数和属于所述第1层的各个库的、由所述程序的二进制可执行代码的调用方函数分别调用的被调用方函数,如果M>1,则还预扫描属于所述第1层到第M-1层的各个库的调用方函数和属于第2层到第M层的各个库的、由所述属于第1层到第M-1层的各个库的调用方函数分别调用的被调用方函数;(b)如果存在所述至少一个冲突,则保存至少一个分别指示该至少一个冲突的冲突信息;以及(c)当该程序调用所述由其直接调用的库时,如果保存有与其相应的冲突信息,则放弃加载该库,否则,加载该库。文档编号G06F9/52GK1987797SQ20051013708公开日2007年6月27日申请日期2005年12月23日优先权日2005年12月23日发明者过晓冰,丁勇,王哲鹏,苏辉,赵石顽申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1