CN102446134A - 一种实现编译器错误的自动定位方法和装置 - Google Patents
一种实现编译器错误的自动定位方法和装置 Download PDFInfo
- Publication number
- CN102446134A CN102446134A CN2010105089865A CN201010508986A CN102446134A CN 102446134 A CN102446134 A CN 102446134A CN 2010105089865 A CN2010105089865 A CN 2010105089865A CN 201010508986 A CN201010508986 A CN 201010508986A CN 102446134 A CN102446134 A CN 102446134A
- Authority
- CN
- China
- Prior art keywords
- executable program
- function
- executable
- program
- value
- 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.)
- Granted
Links
Images
Landscapes
- Devices For Executing Special Programs (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种实现编译器错误的自动定位方法和装置,其中,所述方法包括:利用编译器编译可执行程序的源文件,包括:分别用标准的编译器生成正确的第一可执行码,用待定位错误的编译器生成第二可执行码;利用程序加载工具读入所述第一可执行码和第二可执行码,完成对应所述第一可执行码的第一可执行程序及对应所述第二可执行码的第二可执行程序的运行;利用所述程序加载工具控制从第一可执行程序和第二可执行程序中选取函数,利用二分法和替代法定位实现对第二可执行程序中错误函数的定位。通过本发明,能够把错误定位到函数一级,直接针对可执行码中的函数进行错误定位,并且,错误定位的时间更快。
Description
技术领域
本发明涉及编译器的开发与测试技术领域,更具体地说,涉及一种实现编译器错误的自动定位方法和装置。
背景技术
在编译器的研制开发过程中,通常利用大型应用软件(例如:SPEC的基准测试包)对编译器进行测试。然而,大型应用软件的代码量很大,涉及的函数数量成百上千,一旦编译器有问题导致应用软件出错,问题定位非常耗时,很难对其出错位置以及造成错误的编译器方面的原因进行快速定位。因此,如何对运行错误进行快速定位是编译器研制开发过程中迫切需要解决的问题。
编译器的编译过程大致可以分为:词法分析、语法分析、语义分析、优化以及代码生成。前端的词法分析、语法分析、语义分析生成中端代码,中端代码优化后生成后端代码,后端代码优化后得到编译后的目标码。在利用大型应用程序对编译器进行测试过程中,出错信息主要包括三个方面,分别为:出错区域、导致错误的优化选项、导致错误的优化阶段。其中,出错区域是指测试用的大型应用程序运行时错误的出现位置,出错区域可以分为源文件、函数单元、控制流图的区域、区域中的基本块、基本块中的指令。当定位的错误区域的范围越小,就越有利于研究人员做后续的分析工作。
传统的方法是利用调试器对运行过程中的错误进行手工定位,进而分析出错的原因。但这种方法对编译器的问题定位十分低效,因为编译器出错对应用程序的影响是指令级,面对指令级的错误调试难度非常大,若错误位置范围过大,编译器开发人员需要耗费大量的时间和精力用于进一步定位错误的位置。
已有的改进方法是针对编译器出错的优化选项编译源程序生成包含错误的目标文件集合E,同时针对正确的优化选项生成正确的目标文件集合C,然后把E中的一部分目标文件E1和C中的一部分目标文件C1链接成一个可执行码,若该可执行码执行正确,则说明错误的目标文件应该在E-E1中;若该执行码执行错误,则说明错误的目标文件应该在E1中。这样通过二分的方法可以快速找到错误的目标文件。一个目标文件中往往包含许多函数,下一步需要把目标文件分裂成多个文件,每个文件只包含一个函数,然后再采用该方法最终确定出错的函数。
上述改进方法可通过手工进行,为进一步增加错误定位的效率,现有技术中也有将上述过程自动化,以实现自动定位的方法。
通过发明人的研究发现,现有针对编译器中的错误进行自动定位的方法仍然存在一些不足之处:
1、有些错误不是由编译器的某种特定优化造成的,这时不能通过调整选项而编译出正确的目标码集合,解决方法是可以采用系统中的标准编译器(如GCC)产生正确目标码集合,但定位到一个文件内后就无法进一步定位到同一源文件内具体的函数;
2、处理时间慢:前期准备工作比较复杂,需要先准备好目标文件集合和文件中的函数集合,自动定位工具每一次处理过程都需要进行重新链接,生成一个新的可执行程序。当错误已经缩小到一个目标文件时,再对发生错误的选项进行定位时,需要对该源程序文件进行重新编译,然后再进行目标代码链接,生成一个新的可执行程序。
发明内容
有鉴于此,本发明实施例提供一种实现编译器错误的自动定位方法和装置,以实现对编译器错误的快速、自动查找。
本发明实施例提供一种实现编译器错误的自动定位方法,所述方法包括:
利用编译器编译可执行程序的源文件,包括:分别用标准的编译器生成正确的第一可执行码,用待定位错误的编译器生成第二可执行码;
利用程序加载工具读入所述第一可执行码和第二可执行码,完成对应所述第一可执行码的第一可执行程序及对应所述第二可执行码的第二可执行程序的运行,将第二可执行程序中使用的全局数据映射到第一可执行程序的地址空间;
利用所述程序加载工具分别从第一可执行程序和第二可执行程序中选取函数,利用二分法和替代法定位实现对第二可执行程序中错误函数的定位,所述替代法包括基于第二可执行程序中使用的全局数据与第一可执行程序的地址空间的映射关系,以第二可执行程序中的函数替代第一可执行程序中的相应函数。
优选的,利用所述程序加载工具根据可执行程序的格式读入可执行码,按照可执行程序指定的地址空间申请相应的运行空间,并将相应的读入内容写入所述运行空间。
优选的,所述方法还包括:
利用所述程序加载工具修改所述运行空间中的内容,实现对可执行程序的执行控制;
修改完成后转入所述可执行程序的入口函数,再次启动所述可执行程序的运行。
优选的,所述第一可执行程序和第二可执行程序分别运行的运行空间不同,运行所述第一可执行程序和第二可执行程序的运行空间与所述程序加载工具的地址空间也不同。
优选的,实现所述第一可执行码和第二可执行码分别运行的地址空间不同的方式包括:
通过不同的链接脚本实现,在链接脚本中指定对应可执行码的可执行程序对应的静态空间的起始地址。
优选的,所述将第二可执行程序中使用的全局数据映射到第一可执行程序的地址空间,具体包括:
将第二可执行程序的全局偏移表中的运行地址改为第一可执行程序中对应的运行地址数据;
遍历第二可执行程序中的重定位信息,将涉及到全局符号地址重定位的地址数据修改为第一可执行程序对应的运行地址数据。
优选的,利用所述程序加载工具控制从第一可执行程序和第二可执行程序中选取函数,利用二分法和替代法定位实现对第二可执行程序中错误函数的定位,具体包括:
4-1、由程序加载工具统计第一可执行程序和第二可执行程序中包含的函数数量,将所有函数分别按在第一可执行程序和第二可执行程序中的地址顺序排序,将考察排序范围的最低点的值设为1,对应于第一个函数;将最高点的值设置为所述出错的可执行程序中的函数总个数,对应于最后一个函数;将最高点和最低点的中间值设置为中间点的值,对应于位于第一个和最后一个函数中间的函数;
4-2、判断最低点的值是否小于最高点的值与1的差值;
如果否,则将第一可执行程序中最低点对应的函数替换为第二可执行码中最低点对应的函数,利用程序加载工具控制完成替换后的第一可执行程序运行;如果运行出现错误,则第二可执行码中最低点的函数就是所求错误函数;如果运行正确,则第二可执行码中最高点函数为所求错误函数;
如果是,则将第一可执行程序中最低点与中间点之间的函数替换为第二可执行码中的函数,利用程序加载工具控制完成替换后的第一可执行程序运行,如果运行结果正确,则转入步骤4-3;否则,转入步骤4-4;
4-3、将原中间点的值赋给最低点,并根据原最高点的值和新的最低点的值重新计算中间点的值,然后按照步骤4-2对重新确定的最低点和原最高点间的函数进行判断;
4-4、将原中间点的值赋给最高点,并根据原最低点的值和新的最高点的值重新计算中间点的值,然后按照步骤4-2对原最低点和重新确定的最高点间的函数进行判断。
一种实现编译器错误的自动定位装置,所述装置包括:
可执行码生成模块,用于利用编译器编译可执行程序的源文件,包括:分别用标准的编译器生成正确的第一可执行码,用待定位错误的编译器生成第二可执行码;
可执行程序运行模块,用于利用程序加载工具读入所述第一可执行码和第二可执行码,完成对应所述第一可执行码的第一可执行程序及对应所述第二可执行码的第二可执行程序的运行,将第二可执行程序中使用的全局数据映射到第一可执行程序的地址空间;
错误函数定位模块,用于利用所述程序加载工具控制从第一可执行程序和第二可执行程序中选取函数,利用二分法和替代法定位实现对第二可执行程序中错误函数的定位,所述替代法包括基于第二可执行程序中使用的全局数据与第一可执行程序的地址空间的映射关系,以第二可执行程序中的函数替代第一可执行程序中的相应函数。
优选的,所述可执行程序运行模块,包括:
读写子模块,用于利用所述程序加载工具根据可执行程序的格式读入可执行码,按照可执行程序的地址空间申请相应的运行空间,并将相应的读入内容写入所述运行空间;
修改子模块,利用所述程序加载工具修改所述运行空间中的内容,实现对可执行程序的执行控制;修改完成后转入所述可执行程序的入口函数,再次启动所述可执行程序的运行。
优选的,所述错误函数定位模块,包括:
函数设置子模块,用于由程序加载工具统计第一可执行程序和第二可执行程序中包含的函数数量,将所有函数分别按在第一可执行程序和第二可执行程序中的地址顺序排序,将考察排序范围的最低点的值设为1,对应于第一个函数;将最高点的值设置为所述出错的可执行程序中的函数总个数,对应于最后一个函数;将最高点和最低点的中间值设置为中间点的值,对应于位于第一个和最后一个函数中间的函数;
判断子模块,用于判断最低点的值是否小于最高点的值与1的差值;
如果否,则触发第一结果子模块;如果是,则触发第二结果子模块;
第一结果子模块,用于将第一可执行程序中最低点对应的函数替换为第二可执行码中最低点对应的函数,利用程序加载工具控制完成替换后的第一可执行程序运行;如果运行出现错误,则第二可执行码中最低点的函数就是所求错误函数;如果运行正确,则第二可执行码中最高点函数为所求错误函数;
第二结果子模块,用于将第一可执行程序中最低点与中间点之间的函数替换为第二可执行码中的函数,利用程序加载工具控制完成替换后的第一可执行程序运行,如果运行结果正确,则触发第三结果子模块;否则,触发第四结果子模块;
第三结果子模块,用于将原中间点的值赋给最低点,并根据原最高点的值和新的最低点的值重新计算中间点的值,然后触发所述第一结果子模块,对重新确定的最低点和原最高点间的函数进行判断;
第四结果子模块,用于将原中间点的值赋给最高点,并根据原最低点的值和新的最高点的值重新计算中间点的值,然后触发所述第一结果子模块,对原最低点和重新确定的最高点间的函数进行判断。
同现有技术相比,本发明提供的技术方案通过函数替换,能够把错误定位到函数一级,直接针对可执行码中的函数进行错误定位;
此外,本发明提供的技术方案中,关于错误定位的前期准备工作简单,只需准备好正确的可执行码和错误的可执行码,每一次处理过程只是对两个可执行码中的函数进行重新组合并运行,不需要进行可执行程序的重新编译或链接操作,因此,错误定位的时间更快。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例一提供的一种实现编译器错误的自动定位方法流程示意图;
图2为图1中步骤103的具体实现流程示意图;
图3为图1中步骤104的具体实现流程示意图;
图4为本发明实施例二提供的一种实现编译器错误的自动定位方法示意图;
图5为本发明实施例提供的一种实现编译器错误的自动定位装置结构示意图;
图6为图5中可执行程序运行模块的结构示意图;
图7为图5中错误函数定位模块的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
首先对本发明提供的实施例一中一种实现编译器错误的自动定位方法进行说明。
本发明实施例的目的在于通过在程序加载时从可执行程序一级进行函数替换操作,从而避免编译器对可执行程序进行的重新链接和编译操作,节约了错误定位的时间。参照图1所示,所述实现编译器错误的自动定位方法包括:
步骤101、利用编译器编译可执行程序的源文件,包括:分别用标准的编译器生成正确的第一可执行码,用待定位错误的编译器生成第二可执行码;
步骤102、利用程序加载工具读入所述第一可执行码和第二可执行码,完成对应所述第一可执行码的第一可执行程序及对应所述第二可执行码的第二可执行程序的运行,将第二可执行程序中使用的全局数据映射到第一可执行程序的地址空间;
步骤103、利用所述程序加载工具控制从第一可执行程序和第二可执行程序中选取函数,利用二分法和替代法定位实现对第二可执行程序中错误函数的定位,所述替代法包括基于第二可执行程序中使用的全局数据与第一可执行程序的地址空间的映射关系,以第二可执行程序中的函数替代第一可执行程序中的相应函数。
本发明实施例中,第一可执行码是由已知的标准编译器(即正确的编译器)生成,因此,对应第一可执行码的第一可执行程序是使用已知在正确的编译器版本以及正确的编译选项进行编译后所得到的正确的可执行程序文件集合;第二可执行码是由当前待检测的编译器(即发生错误的编译器)生成,同理,对应第二可执行码的第二可执行程序是使用发生错误的编译器以及发生错误的编译选项进行编译后所得到的错误的可执行程序文件集合。
本发明提供的技术方案能够基于第二可执行程序中使用的全局数据与第一可执行程序的地址空间的映射关系,利用程序加载工具控制从第一可执行程序和第二可执行程序中直接选取函数,从而利用二分法和替代法定位实现对第二可执行程序中错误函数的定位,在与标准编译器产生的正确的可执行码进行对比时,也可以把出错范围定位到一个函数。可见,本发明实施例通过函数替换,可以直接将编译器中的错误定位到函数一级,而不是一个文件。由于不需要利用编译器所提供的函数的优化开关选项实现函数的定位,因此,能够节省编译器在对函数进行优化而进行的可执行程序的重新编译或链接操作,因此,错误定位的时间更快。
此外,本发明提供的技术方案中,关于错误定位的前期准备工作简单,只需准备好正确的可执行码和错误的可执行码,后面的操作完全自动进行。
本发明实施例中,实现一个程序加载工具是实现本发明的基础。所述的程序加载工具是一个正常的程序,它能够根据可执行程序的格式读入可执行程序,按照可执行程序的地址空间申请相应的运行空间,并将相应的读入内容写入所述运行空间。
需要说明的是,第一可执行程序和第二可执行程序的分别运行的运行空间不同,可以通过在程序加载工具链接可执行程序时指定链接脚本来实现,利用程序加载工具在链接脚本中指定对应可执行程序对应的静态空间的起始地址。
为了能申请到可执行程序指定的地址空间,程序加载工具使用的地址空间与可执行程序使用的运行空间不能冲突,也就是要保证程序加载工具使用的地址空间与可执行程序使用的运行空间不同,因此,本发明实施例中运行所述第一可执行程序和第二可执行程序的运行空间与所述程序加载工具的地址空间不同。
此外,本发明实施例在具体实施时,可以利用程序加载工具根据需要修改可执行程序运行空间中的内容,从而实现对可执行程序的执行控制,修改完成后转入可执行程序的入口函数,再次启动可执行程序的运行。
另外,为了能够利用程序加载工具实现两个可执行程序中函数之间可以进行替换,编译链接时需要保留可执行程序的重定位信息,可以通过在程序加载工具链接可执行程序时增加选项以保留程序的重定位信息的方式实现。
为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图对本发明的具体实施方式做详细的说明。
如图2所示,为上述实施例一中步骤102的具体实现流程,可以包括以下步骤:
步骤201、所述程序加载工具按照所述第一可执行程序和第二可执行程序指定的地址申请相应运行空间,并将相应读入的所述第一可执行程序和第二可执行程序的内容写入所述运行空间;
该步骤中,利用程序加载工具在链接脚本中指定对应可执行程序对应的静态空间的起始地址,使得所述第一可执行程序和第二可执行程序的运行空间不同;随后,利用程序加载工具按照所述第一可执行程序和第二可执行程序的地址申请相应的运行空间,将读入的所述第一可执行程序和第二可执行程序的内容写入对应的运行空间;
步骤202、将第二可执行程序的全局偏移表(GOT)中的地址改为第一可执行程序中对应的运行地址数据;
通过将出错的第二可执行程序的全局偏移表(GOT)中的地址改为正确的第一可执行程序中对应的地址数据,实现将出错的可执行程序中直接使用GOT表寻址的情况映射到正确的可执行程序的地址空间中;
步骤203、遍历第二可执行程序中的重定位信息,将涉及到全局符号地址重定位的地址数据修改为第一可执行程序对应的运行地址数据;
步骤203执行之后,出错的第二可执行程序中使用的全局数据都已经被映射到正确的第一可执行程序的地址空间,若需要从出错的第二可执行程序中选一个函数替换正确的第一可执行程序中的相应函数,只要遍历正确的第一可执行程序中的重定位信息,凡是涉及到调用该函数的地方都修改成调用出错的第二可执行程序中对应的函数,从而完成相应的替换操作。
在错误函数集合中,发生错误的函数可能不止一个,利用二分法和替代法一次只能查找到一个出错函数。因此,可以通过二分法和替代法的反复使用,实现对出错函数的逐一定位。
由于正确的第一可执行程序和错误的第二可执行程序由相同的源文件经过不同版本的编译器编译后生成,因此,正确的第一可执行程序和错误的第二可执行程序中包含的函数数量相同,并且一一对应。
本发明实施例中,在综合运用二分法和替代法进行错误定位时,将编译器出错的区域从一个文件缩小到一个函数,使分析工作缩小至函数。
如图3所示,为上述实施例一中步骤103的实现流程,可以包括以下步骤:
步骤301、由程序加载工具统计第一可执行程序和第二可执行程序中包含的函数数量,将所有函数分别按在第一可执行程序和第二可执行程序中的地址顺序排序,将考察排序范围的最低点(low)的值设为1,对应于第一个函数;将最高点(high)的值设置为所述出错的可执行程序中的函数总个数,对应于最后一个函数;将最高点和最低点的中间值(high+low)/2设置为中间点(mid)的值,对应于位于第一个和最后一个函数中间的函数;
步骤302、判断最低点的值是否小于最高点的值与1的差值;如果判断条件不成立,则继续步骤303;如果判断条件成立,则继续步骤304;
步骤303、将第一可执行程序中最低点对应的函数替换为第二可执行码中最低点对应的函数,利用程序加载工具控制完成替换后的第一可执行程序运行;如果运行出现错误,则继续步骤305;如果运行正确,则继续步骤306;
步骤304、将第一可执行程序中最低点与中间点之间的函数替换为第二可执行码中的函数,利用程序加载工具控制完成替换后的第一可执行程序运行,观察运行结果是否正确,若正确则转入步骤307,否则转入步骤308;
步骤305、第二可执行码中最低点的函数就是所求错误函数;
步骤306、第二可执行码中最高点函数为所求错误函数;
步骤307、重新设置最低点的值,将原中间点的值赋给最低点,并根据原最高点的值和新的最低点的值重新计算中间点的值,然后返回步骤302,对重新确定的最低点和原最高点间的函数进行判断;
步骤308、重新设置最高点的值,将原中间点的值赋给最高点,并根据原最低点的值和新的最高点的值重新计算中间点的值,然后返回步骤302,对原最低点和重新确定的最高点间的函数进行判断。
可见,利用程序加载工具控制从第一可执行程序和第二可执行程序中直接选取函数,从而利用二分法和替代法定位实现对第二可执行程序中错误函数的定位,在与标准编译器产生的正确的可执行码进行对比时,也可以把出错范围定位到一个函数。本发明实施例通过函数替换,可以直接将编译器中的错误定位到函数一级,而不是一个文件。由于不需要利用编译器所提供的函数的优化开关选项实现函数的定位,因此,能够节省编译器在对函数进行优化而进行的可执行程序的重新编译或链接操作,因此,错误定位的时间更快。
为了清楚说明本发明实施例的实现过程,图4示出了本方案实施例二的完整实现流程,主要包括以下步骤:
步骤401、用正确的编译器编译正确的第一可执行程序;
步骤402、用当前待检测的编译器编译错误的第二可执行程序;
步骤403、设第一可执行程序和第二可执行程中均包含有n个函数,最低点low=1,最高点high=n,中间点mid=(low+high)/2;
该步骤中,由于正确的第一可执行程序和错误的第二可执行程序由相同的源文件经过不同版本的编译器编译后生成,因此,正确的第一可执行程序和错误的第二可执行程序中包含的函数数量相同,并且一一对应;
步骤404、设置可能发生错误的函数集合[low,mid];
步骤405、判断Low<high-1是否成立,如果判断条件不成立,则继续步骤406;如果判断条件成立,则继续步骤407;
步骤406、取错误函数集合中第low个函数,替代正确函数中第low个函数,与正确函数集合中的其他函数组成可执行程序运行,如果运行出现错误,则继续步骤408;如果运行正确,则继续步骤409;
步骤407、取错误函数集合中[low,mid]的所有函数,替代正确函数集合中[low,mid]的所有函数,其余取正确函数集合中的其他函数组成可执行程序运行,观察运行结果是否正确,若正确则转入步骤410,否则转入步骤411;
步骤408、最低点low的函数就是所求错误函数;
步骤409、最高点high的函数即为所求错误函数;
步骤410、重新设置最低点low’的值,将原中间点mid的值赋给最低点low’,并根据最高点high的值和新的最低点low’的值重新计算中间点mid’的值,然后按照步骤405对最低点low’和最高点high间的函数重新进行判断;
步骤411、重新设置最高点high’的值,将原中间点mid的值赋给最高点high’,并根据最低点low的值和新的最高点high’的值重新计算中间点的值,然后按照步骤405对最低点low和最高点high’间的函数重新进行判断。
本发明提供的技术方案能够利用程序加载工具控制从第一可执行程序和第二可执行程序中直接选取函数,从而利用二分法和替代法定位实现对第二可执行程序中错误函数的定位,在与标准编译器产生的正确的可执行码进行对比时,也可以把出错范围定位到一个函数。可见,本发明实施例通过函数替换,可以直接将编译器中的错误定位到函数一级,而不是一个文件。由于不需要利用编译器所提供的函数的优化开关选项实现函数的定位,因此,能够节省编译器在对函数进行优化而进行的可执行程序的重新编译或链接操作,错误定位的时间更快。
相应上述实现编译器错误的自动定位方法实施例,本发明还提供了一种实现编译器错误的自动定位装置,如图5所示,所述装置包括:
可执行码生成模块501,用于利用编译器编译可执行程序的源文件,包括:分别用标准的编译器生成正确的第一可执行码,用待定位错误的编译器生成第二可执行码;
可执行程序运行模块502,用于利用程序加载工具读入所述第一可执行码和第二可执行码,完成对应所述第一可执行码的第一可执行程序及对应所述第二可执行码的第二可执行程序的运行,将第二可执行程序中使用的全局数据映射到第一可执行程序的地址空间;
错误函数定位模块503,用于利用所述程序加载工具控制从第一可执行程序和第二可执行程序中选取函数,利用二分法和替代法定位实现对第二可执行程序中错误函数的定位,所述替代法包括基于第二可执行程序中使用的全局数据与第一可执行程序的地址空间的映射关系,以第二可执行程序中的函数替代第一可执行程序中的相应函数。
在本发明提供的一种实现编译器错误的自动定位装置的优选实施例中,如图6所示,所述可执行程序运行模块502可以包括:
读写子模块5021,用于利用所述程序加载工具根据可执行程序的格式读入可执行码,按照可执行程序的地址空间申请相应的运行空间,并将相应的读入内容写入所述运行空间;
修改子模块5022,用于利用所述程序加载工具修改所述运行空间中的内容,实现对可执行程序的执行控制;修改完成后转入所述可执行程序的入口函数,再次启动所述可执行程序的运行。
此外,在本发明提供的另一种实现编译器错误的自动定位装置的优选实施例中,如图7所示,所述错误函数定位模块503可以包括:
函数设置子模块5031,用于由程序加载工具统计第一可执行程序和第二可执行程序中包含的函数数量,将所有函数分别按在第一可执行程序和第二可执行程序中的地址顺序排序,将考察排序范围的最低点的值设为1,对应于第一个函数;将最高点的值设置为所述出错的可执行程序中的函数总个数,对应于最后一个函数;将最高点和最低点的中间值设置为中间点的值,对应于位于第一个和最后一个函数中间的函数;
判断子模块5032,用于判断最低点的值是否小于最高点的值与1的差值;如果否,则触发第一结果子模块5043;如果是,则触发第二结果子模块5044;
第一结果子模块5033,用于将第一可执行程序中最低点对应的函数替换为第二可执行码中最低点对应的函数,利用程序加载工具控制完成替换后的第一可执行程序运行;如果运行出现错误,则第二可执行码中最低点的函数就是所求错误函数;如果运行正确,则第二可执行码中最高点函数为所求错误函数;
第二结果子模块5034,用于将第一可执行程序中最低点与中间点之间的函数替换为第二可执行码中的函数,利用程序加载工具控制完成替换后的第一可执行程序运行,如果运行结果正确,则触发第三结果子模块5035;否则,触发第四结果子模块5036;
第三结果子模块5035,用于将原中间点的值赋给最低点,并根据原最高点的值和新的最低点的值重新计算中间点的值,然后触发所述第一结果子模块,对重新确定的最低点和原最高点间的函数进行判断;
第四结果子模块5036,用于将原中间点的值赋给最高点,并根据原最低点的值和新的最高点的值重新计算中间点的值,然后触发所述第一结果子模块,对原最低点和重新确定的最高点间的函数进行判断。
本发明提供的实现编译器错误的自动定位装置技术方案通过函数替换,可以直接将编译器中的错误定位到函数一级,而不是一个文件。由于不需要利用编译器所提供的函数的优化开关选项实现函数的定位,因此,能够节省编译器在对函数进行优化而进行的可执行程序的重新编译或链接操作,错误定位的时间更快。
对于装置实施例而言,由于其基本相应于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-OnlyMemory,ROM)或随机存储记忆体(Random Access Memory,RAM)等。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明实施例的精神或范围的情况下,在其它实施例中实现。因此,本发明实施例将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
Claims (10)
1.一种实现编译器错误的自动定位方法,其特征在于,所述方法包括:
利用编译器编译可执行程序的源文件,包括:分别用标准的编译器生成正确的第一可执行码,用待定位错误的编译器生成第二可执行码;
利用程序加载工具读入所述第一可执行码和第二可执行码,完成对应所述第一可执行码的第一可执行程序及对应所述第二可执行码的第二可执行程序的运行,将第二可执行程序中使用的全局数据映射到第一可执行程序的地址空间;
利用所述程序加载工具分别从第一可执行程序和第二可执行程序中选取函数,利用二分法和替代法定位实现对第二可执行程序中错误函数的定位,所述替代法包括基于第二可执行程序中使用的全局数据与第一可执行程序的地址空间的映射关系,以第二可执行程序中的函数替代第一可执行程序中的相应函数。
2.根据权利要求1所述的实现编译器错误的自动定位方法,其特征在于,利用所述程序加载工具根据可执行程序的格式读入可执行码,按照可执行程序指定的地址空间申请相应的运行空间,并将相应的读入内容写入所述运行空间。
3.根据权利要求2所述的实现编译器错误的自动定位方法,其特征在于,所述自动定位方法还包括:
在将相应的读入内容写入所述地址空间后,利用所述程序加载工具修改所述运行空间中的内容,实现对可执行程序的执行控制;
修改完成后转入所述可执行程序的入口函数,再次启动所述可执行程序的运行。
4.根据权利要求2所述的实现编译器错误的自动定位方法,其特征在于,所述第一可执行程序和第二可执行程序分别运行的运行空间不同,运行所述第一可执行程序和第二可执行程序的运行空间与所述程序加载工具的地址空间也不同。
5.根据权利要求4所述的实现编译器错误的自动定位方法,其特征在于,实现所述第一可执行码和第二可执行码分别运行的运行空间不同的方式包括:
通过不同的链接脚本实现,在链接脚本中指定对应可执行码的可执行程序对应的静态空间的起始地址。
6.根据权利要求1所述的实现编译器错误的自动定位方法,其特征在于,所述将第二可执行程序中使用的全局数据映射到第一可执行程序的地址空间,包括:
将第二可执行程序的全局偏移表中的地址改为第一可执行程序中对应的运行地址数据;
遍历第二可执行程序中的重定位信息,将涉及到全局符号地址重定位的地址数据修改为第一可执行程序对应的运行地址数据。
7.根据权利要求1所述的实现编译器错误的自动定位方法,其特征在于,利用所述程序加载工具控制从第一可执行程序和第二可执行程序中选取函数,利用二分法和替代法定位实现对第二可执行程序中错误函数的定位,具体包括:
4-1、由程序加载工具统计第一可执行程序和第二可执行程序中包含的函数数量,将所有函数分别按在第一可执行程序和第二可执行程序中的地址顺序排序,将考察排序范围的最低点的值设为1,对应于第一个函数;将最高点的值设置为所述出错的可执行程序中的函数总个数,对应于最后一个函数;将最高点和最低点的中间值设置为中间点的值,对应于位于第一个和最后一个函数中间的函数;
4-2、判断最低点的值是否小于最高点的值与1的差值;
如果否,则将第一可执行程序中最低点对应的函数替换为第二可执行码中最低点对应的函数,利用程序加载工具控制完成替换后的第一可执行程序运行;如果运行出现错误,则第二可执行码中最低点的函数就是所求错误函数;如果运行正确,则第二可执行码中最高点函数为所求错误函数;
如果是,则将第一可执行程序中最低点与中间点之间的函数替换为第二可执行码中的函数,利用程序加载工具控制完成替换后的第一可执行程序运行,如果运行结果正确,则转入步骤4-3;否则,转入步骤4-4;
4-3、将原中间点的值赋给最低点,并根据原最高点的值和新的最低点的值重新计算中间点的值,然后按照步骤4-2对重新确定的最低点和原最高点间的函数进行判断;
4-4、将原中间点的值赋给最高点,并根据原最低点的值和新的最高点的值重新计算中间点的值,然后按照步骤4-2对原最低点和重新确定的最高点间的函数进行判断。
8.一种实现编译器错误的自动定位装置,其特征在于,所述装置包括:
可执行码生成模块,用于利用编译器编译可执行程序的源文件,包括:分别用标准的编译器生成正确的第一可执行码,用待定位错误的编译器生成第二可执行码;
可执行程序运行模块,用于利用程序加载工具读入所述第一可执行码和第二可执行码,完成对应所述第一可执行码的第一可执行程序及对应所述第二可执行码的第二可执行程序的运行,将第二可执行程序中使用的全局数据映射到第一可执行程序的地址空间;
错误函数定位模块,用于利用所述程序加载工具控制从第一可执行程序和第二可执行程序中选取函数,利用二分法和替代法定位实现对第二可执行程序中错误函数的定位,所述替代法包括基于第二可执行程序中使用的全局数据与第一可执行程序的地址空间的映射关系,以第二可执行程序中的函数替代第一可执行程序中的相应函数。
9.根据权利要求8所述的实现编译器错误的自动定位装置,其特征在于,所述可执行程序运行模块,包括:
读写子模块,用于利用所述程序加载工具根据可执行程序的格式读入可执行码,按照可执行程序的地址空间申请相应的运行空间,并将相应的读入内容写入所述运行空间;
修改子模块,用于利用所述程序加载工具修改所述运行空间中的内容,实现对可执行程序的执行控制;修改完成后转入所述可执行程序的入口函数,再次启动所述可执行程序的运行。
10.根据权利要求8所述的实现编译器错误的自动定位装置,其特征在于,所述错误函数定位模块,包括:
函数设置子模块,用于由程序加载工具统计第一可执行程序和第二可执行程序中包含的函数数量,将所有函数分别按在第一可执行程序和第二可执行程序中的地址顺序排序,将考察排序范围的最低点的值设为1,对应于第一个函数;将最高点的值设置为所述出错的可执行程序中的函数总个数,对应于最后一个函数;将最高点和最低点的中间值设置为中间点的值,对应于位于第一个和最后一个函数中间的函数;
判断子模块,用于判断最低点的值是否小于最高点的值与1的差值;
如果否,则触发第一结果子模块;如果是,则触发第二结果子模块;
第一结果子模块,用于将第一可执行程序中最低点对应的函数替换为第二可执行码中最低点对应的函数,利用程序加载工具控制完成替换后的第一可执行程序运行;如果运行出现错误,则第二可执行码中最低点的函数就是所求错误函数;如果运行正确,则第二可执行码中最高点函数为所求错误函数;
第二结果子模块,用于将第一可执行程序中最低点与中间点之间的函数替换为第二可执行码中的函数,利用程序加载工具控制完成替换后的第一可执行程序运行,如果运行结果正确,则触发第三结果子模块;否则,触发第四结果子模块;
第三结果子模块,用于将原中间点的值赋给最低点,并根据原最高点的值和新的最低点的值重新计算中间点的值,然后触发所述第一结果子模块,对重新确定的最低点和原最高点间的函数进行判断;
第四结果子模块,用于将原中间点的值赋给最高点,并根据原最低点的值和新的最高点的值重新计算中间点的值,然后触发所述第一结果子模块,对原最低点和重新确定的最高点间的函数进行判断。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201010508986.5A CN102446134B (zh) | 2010-10-13 | 2010-10-13 | 一种实现编译器错误的自动定位方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201010508986.5A CN102446134B (zh) | 2010-10-13 | 2010-10-13 | 一种实现编译器错误的自动定位方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102446134A true CN102446134A (zh) | 2012-05-09 |
CN102446134B CN102446134B (zh) | 2015-04-08 |
Family
ID=46008641
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201010508986.5A Active CN102446134B (zh) | 2010-10-13 | 2010-10-13 | 一种实现编译器错误的自动定位方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102446134B (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105677559A (zh) * | 2015-12-31 | 2016-06-15 | 杭州华为数字技术有限公司 | 一种检测方法及装置 |
CN106445627A (zh) * | 2016-10-14 | 2017-02-22 | 郑州云海信息技术有限公司 | 一种代码集成编译中问题定位的方法及装置 |
CN111104267A (zh) * | 2018-10-26 | 2020-05-05 | 长鑫存储技术有限公司 | 存储器的调试处理方法及其调试处理系统 |
WO2021142763A1 (zh) * | 2020-01-17 | 2021-07-22 | 上海渠杰信息科技有限公司 | 一种自动识别编译失败原因并重启编译的方法 |
GB2603259A (en) * | 2020-12-03 | 2022-08-03 | Ibm | Efficient defect location in new code versions |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5845120A (en) * | 1995-09-19 | 1998-12-01 | Sun Microsystems, Inc. | Method and apparatus for linking compiler error messages to relevant information |
CN1467629A (zh) * | 2002-07-08 | 2004-01-14 | 华为技术有限公司 | 一种动态加载单板芯片firmware程序的实现方法 |
CN1912848A (zh) * | 2005-08-12 | 2007-02-14 | 中国科学院计算技术研究所 | 一种对编译器中的错误进行自动定位的方法 |
-
2010
- 2010-10-13 CN CN201010508986.5A patent/CN102446134B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5845120A (en) * | 1995-09-19 | 1998-12-01 | Sun Microsystems, Inc. | Method and apparatus for linking compiler error messages to relevant information |
CN1467629A (zh) * | 2002-07-08 | 2004-01-14 | 华为技术有限公司 | 一种动态加载单板芯片firmware程序的实现方法 |
CN1912848A (zh) * | 2005-08-12 | 2007-02-14 | 中国科学院计算技术研究所 | 一种对编译器中的错误进行自动定位的方法 |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105677559A (zh) * | 2015-12-31 | 2016-06-15 | 杭州华为数字技术有限公司 | 一种检测方法及装置 |
CN105677559B (zh) * | 2015-12-31 | 2018-05-11 | 杭州华为数字技术有限公司 | 一种检测方法及装置 |
CN106445627A (zh) * | 2016-10-14 | 2017-02-22 | 郑州云海信息技术有限公司 | 一种代码集成编译中问题定位的方法及装置 |
CN111104267A (zh) * | 2018-10-26 | 2020-05-05 | 长鑫存储技术有限公司 | 存储器的调试处理方法及其调试处理系统 |
CN111104267B (zh) * | 2018-10-26 | 2022-05-13 | 长鑫存储技术有限公司 | 存储器的调试处理方法及其调试处理系统 |
WO2021142763A1 (zh) * | 2020-01-17 | 2021-07-22 | 上海渠杰信息科技有限公司 | 一种自动识别编译失败原因并重启编译的方法 |
GB2603259A (en) * | 2020-12-03 | 2022-08-03 | Ibm | Efficient defect location in new code versions |
US11645045B2 (en) | 2020-12-03 | 2023-05-09 | International Business Machines Corporation | Efficient defect location in new code versions |
Also Published As
Publication number | Publication date |
---|---|
CN102446134B (zh) | 2015-04-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US5956479A (en) | Demand based generation of symbolic information | |
US11579856B2 (en) | Multi-chip compatible compiling method and device | |
US20080104096A1 (en) | Software development system | |
US8806436B2 (en) | Systems and methods for debugging applications using dual code generation | |
CN102279789B (zh) | 生产阶段嵌入式系统的调试系统及其调试方法 | |
CN101739339A (zh) | 一种基于程序动态依赖关系的软件故障定位方法 | |
US20050223360A1 (en) | System and method for providing a generic user interface testing framework | |
CN104714788A (zh) | 一种软件安装包自动生成的方法及装置 | |
US20080313208A1 (en) | Apparatus, system, and method for automated context-sensitive message organization | |
CN102446134A (zh) | 一种实现编译器错误的自动定位方法和装置 | |
US20110126179A1 (en) | Method and System for Dynamic Patching Software Using Source Code | |
CN110083360A (zh) | 一种应用程序代码的编译方法、装置、设备及存储介质 | |
US20050229161A1 (en) | Generic user interface testing framework with load-time libraries | |
CN100456260C (zh) | 一种用于对解释语言程序进行调试方法及装置 | |
CN100442243C (zh) | 一种对编译器中的错误进行自动定位的方法 | |
CN114924737A (zh) | 一种电池管理系统源代码集成测试方法、测试装置及电子设备 | |
US20050228644A1 (en) | Generic user interface testing framework with rules-based wizard | |
CN110659088B (zh) | 一种嵌入式环境下程序扩展的方法及系统 | |
CN104102581A (zh) | 一种实现单元测试的方法及装置 | |
CN104199770A (zh) | 一种手机音乐apk的自动化测试方法 | |
US20020129336A1 (en) | Automatic symbol table selection in a multi-cell environment | |
KR20050028465A (ko) | 서로 다른 버전에서 생성된 디버깅 정보 파일들을 이용한소스 코드 레벨 디버깅을 제공하는 엠시유 응용프로그램검증 시스템 및 그 방법 | |
CN103176903A (zh) | MapReduce分布式系统程序的测试方法及设备 | |
US8826233B2 (en) | Graphical representation of a JAVA bytecode | |
CN114546409A (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 | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |