一种代码处理方法及装置与流程

文档序号:15685285发布日期:2018-10-16 20:59阅读:138来源:国知局

本发明涉及计算机技术领域,特别是涉及一种代码处理方法及装置。



背景技术:

随着技术的飞速发展,计算机软件得到了广泛应用,当前,为了自动化地实现某一目的,编程人员事先需要编写用于实现该目的的源文件,该源文件中包括源代码,然后存储该源文件。之后当需要实现该目的时,可以获取用于实现该目的的源文件,然后对源代码编译,得到编译后的机器代码,再将编译后的机器代码存储在内存中,之后从内存中获取机器代码,然后运行机器代码。

然而,编程人员事先在编写源文件时,有时候会由于人为疏忽导致源文件中的某些行的源代码出现一些错误,例如语法错误或者单词拼写错误等。

如果某一行的源代码出现错误,则系统在运行该行的源代码对应的编译后的机器代码时往往会出错,例如无法成功运行该行的源代码对应的编译后的机器代码,也无法继续运行位于该行的源代码之后的源代码对应的编译后的机器代码,从而导致此次运行在该机器代码处中断。

由于编程人员也无法确定是哪一行的源代码出现错误,因此,为了能够成功运行修改后的该行的源代码对应的编译后的机器代码,以及能够继续运行位于该行的源代码之后的源代码对应的编译后的机器代码,编程人员需要在源文件中人工查找可能出错的源代码并修改出错的源代码。

然而,在源文件中包括的源代码非常多时,编程人员往往需要耗费较长的时间才能在源文件中查找出可能出错的源代码,查找出错的源代码的效率较低,且人力成本较高。



技术实现要素:

为解决上述技术问题,本发明实施例示出了一种代码处理方法及装置。

第一方面,本发明实施例示出了一种代码处理方法,所述方法包括:

获取编译后的错误机器代码的存储地址;

根据所述存储地址确定所述错误机器代码所属的函数;

根据所述存储地址确定所述错误机器代码在所述函数中的位置;

获取所述函数的编译前的源代码;

在所述源代码的所述位置处查找所述错误机器代码对应的编译前的源代码。

在一个可选的实现方式中,所述获取编译后的错误机器代码的存储地址,包括:

获取所述错误机器代码的堆栈信息,所述堆栈信息是在所述错误机器代码运行出错时生成的,所述堆栈信息中至少包括所述错误机器代码的存储地址;

从所述堆栈信息中提取出所述存储地址,并作为所述错误机器代码的存储地址。

在一个可选的实现方式中,所述根据所述存储地址确定所述错误机器代码所属的函数,包括:

获取函数的存储地址范围与函数的函数名称之间的对应关系;

在所述对应关系中查找所述存储地址所在的存储地址范围;

在所述对应关系中查找与所述存储地址范围相对应的函数名称;

将所述函数名称所对应的函数确定为所述错误机器代码所属的函数。

在一个可选的实现方式中,所述根据所述存储地址确定所述错误机器代码在所述函数中的位置,包括:

获取所述存储地址在所述存储地址范围中的偏移量,并作为所述错误机器代码在所述函数中的位置。

在一个可选的实现方式中,所述获取所述函数的编译前的源代码,包括:

获取所述函数的编译后的机器代码;

将所述机器代码反编译,得到所述函数的编译前的源代码。

在一个可选的实现方式中,所述获取所述函数的编译前的源代码,包括:

获取所述函数的中间代码,所述中间代码是事先在编译所述函数的编译前的源代码的过程中生成的;

将所述中间代码反编译,得到所述函数的编译前的源代码。

在一个可选的实现方式中,所述获取所述函数的编译前的源代码,包括:

在已存储的多个函数的源代码中查找包括所述函数的函数名称的源代码;

将包含所述函数的函数名称的源代码确定为所述函数的源代码。

第二方面,本发明实施例示出了一种代码处理装置,所述装置包括:

第一获取模块,用于获取编译后的错误机器代码的存储地址;

第一确定模块,用于根据所述存储地址确定所述错误机器代码所属的函数;

第二确定模块,用于根据所述存储地址确定所述错误机器代码在所述函数中的位置;

第二获取模块,用于获取所述函数的编译前的源代码;

查找模块,用于在所述源代码的所述位置处查找所述错误机器代码对应的编译前的源代码。

在一个可选的实现方式中,所述第一获取模块包括:

第一获取单元,用于获取所述错误机器代码的堆栈信息,所述堆栈信息是在所述错误机器代码运行出错时生成的,所述堆栈信息中至少包括所述错误机器代码的存储地址;

提取单元,用于从所述堆栈信息中提取出所述存储地址,并作为所述错误机器代码的存储地址。

在一个可选的实现方式中,所述第一确定模块包括:

第二获取单元,用于获取函数的存储地址范围与函数的函数名称之间的对应关系;

第一查找单元,用于在所述对应关系中查找所述存储地址所在的存储地址范围;

第二查找单元,用于在所述对应关系中查找与所述存储地址范围相对应的函数名称;

第一确定单元,用于将所述函数名称所对应的函数确定为所述错误机器代码所属的函数。

在一个可选的实现方式中,所述第二确定模块具体用于:获取所述存储地址在所述存储地址范围中的偏移量,并作为所述错误机器代码在所述函数中的位置。

在一个可选的实现方式中,所述第二获取模块包括:

第三获取单元,用于获取所述函数的编译后的机器代码;

第一反编译单元,用于将所述机器代码反编译,得到所述函数的编译前的源代码。

在一个可选的实现方式中,所述第二获取模块包括:

第四获取单元,用于获取所述函数的中间代码,所述中间代码是事先在编译所述函数的编译前的源代码的过程中生成的;

第二反编译单元,用于将所述中间代码反编译,得到所述函数的编译前的源代码。

在一个可选的实现方式中,所述第二获取模块包括:

第三查找单元,用于在已存储的多个函数的源代码中查找包括所述函数的函数名称的源代码;

第二确定单元,用于将包含所述函数的函数名称的源代码确定为所述函数的源代码。

与现有技术相比,本发明实施例包括以下优点:

通过本发明实施例的方法,无需编程人员在源文件中手动检查可能出错的源代码,当编译后的机器代码运行出错时,就会将该机器代码作为错误机器代码,然后获取编译后的错误机器代码的存储地址,再根据该存储地址确定错误机器代码所属的函数,之后根据该存储地址确定错误机器代码在该函数中的位置,并获取该函数的编译前的源代码,之后在该源代码的该位置处就可以查找错误机器代码对应的编译前的源代码,从而可以提高查找错误机器代码对应的编译前的源代码的效率,以及降低人工成本。

附图说明

图1是本发明的一种代码处理方法实施例的步骤流程图;

图2是本发明的一种代码处理装置实施例的结构框图。

具体实施方式

为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。

参照图1,示出了本发明的一种代码处理方法实施例的步骤流程图,具体可以包括如下步骤:

在步骤s101中,获取编译后的错误机器代码的存储地址;

在本发明实施例中,当系统需要实现某一目的时,可以获取用于实现该目的的源文件,源文件中包括多行源代码,然后对多行源代码编译,得到编译后的多行机器代码,再将编译后的多行机器代码存储在内存中,之后从内按照机器代码对应的源代码在源文件中的位置的先后顺序依次从内存储中获取并运行每一行机器代码。

然而,编程人员事先在编写源文件时,有时候会由于人为疏忽导致源文件中的某些行的源代码出现一些错误,例如语法错误或者单词拼写错误等。

如果某一行的源代码出现错误,则系统在运行该行的源代码对应的编译后的机器代码时往往会出错,例如无法成功运行该行的源代码对应的编译后的机器代码,也无法继续运行位于该行的源代码之后的源代码对应的编译后的机器代码,从而导致此次运行在该机器代码处中断。

因此,编程人员需要修改该行源代码,以使得该行源代码不再存在错误,进而使得之后能够成功运行修改后的该行的源代码对应的编译后的机器代码,以及能够继续运行位于该行的源代码之后的源代码对应的编译后的机器代码。

为了使得编程人员能够尽早修改该行源代码,在本发明实施例中,在运行机器代码的过程中出错时,系统需要及时查找出运行出错的编译后的机器代码所对应的源文件中的源代码,进而将运行出错的编译后的机器代码所对应的源文件中的源代码提示给编程人员。

在本发明实施例中,当系统无法成功运行编译后的某一机器代码时,系统会将该机器代码作为错误机器代码,然后生成该机器代码的堆栈信息。

在本发明实施例中,源文件中包括多个函数,每一个函数中包括多行源代码,在存储函数中的每一行的源代码对应的编译后的机器代码时,是按照其对应的源代码在函数中的位置的先后顺序存储的,且在函数中的行数较前的源代码对应的编译后的机器代码的存储地址小于在函数中的行数较后的源代码对应的编译后的机器代码的存储地址,所以,系统往往是按照存储的顺序依次从内存中获取该函数的机器代码并运行。

其中,在某一存储地址中存储的机器代码运行出错时,系统会将在该存储地址中存储的机器代码作为错误机器代码,然后生成错误机器代码的堆栈信息,该堆栈信息中至少包括错误机器代码的存储地址。

因此,在本步骤中,可以获取错误机器代码的堆栈信息,该堆栈信息是在编译后的错误机器代码运行出错时生成的,该堆栈信息中至少包括错误机器代码的存储地址,然后从该堆栈信息中提取出该存储地址,并作为编译后的错误机器代码的存储地址。

在本发明另一实施例中,生成的该堆栈信息中除了包含错误机器代码的存储地址以外,往往还包括位于该函数中的、且位于错误机器代码之后的各个机器代码的存储地址,且错误机器代码的存储地址小于位于错误机器代码之后的各个机器代码的存储地址,因此,可以从该堆栈信息中获取最小的存储地址,并作为编译后的错误机器代码的存储地址。

在步骤s102中,根据该存储地址确定错误机器代码所属的函数;

对于源文件中的任一函数,在编译该函数中的每一行源代码且得到每一行源代码对应的机器代码之后,会将得到的机器代码依次存储在内存中,且在存储该函数中的每一行源代码对应的机器代码的存储地址中,将最小的存储地址和最大的存储地址组成存储地址范围,然后该将存储地址范围与该函数的函数名称组成对应表项,并存储在已存储的函数的存储地址范围与函数的函数名称之间的对应关系中,对于源文件中的其他每一函数,同样如此。

因此,在本步骤中,可以获取该函数的存储地址范围与该函数的函数名称之间的对应关系,然后在对应关系中查找该存储地址所在的存储地址范围,之后在对应关系中查找与该存储地址范围相对应的函数名称,再将该函数名称所对应的函数确定为错误机器代码所属述的函数。

在步骤s103中,根据该存储地址确定错误机器代码在该函数中的位置;

在本步骤中,可以获取错误机器代码的存储地址在该存储地址范围中的偏移量,并作为错误机器代码在该函数中的位置。

在步骤s104中,获取该函数的编译前的源代码;

在本发明一个实施例中,可以获取该函数的编译后的机器代码,然后对该机器代码反编译,得到该函数的编译前的源代码。

其中,可以在该函数的存储地址范围与该函数的函数名称之间的对应关系中,确定与该函数的函数名称相对应的存储地址范围,然后获取在该存储地址范围中的所有存储地址中存储的机器代码,得到该函数的编译后的机器代码,然后使用任意一种反编译方法对获取的该机器代码反编译,得到该函数的编译前的源代码。

在本发明另一实施例中,在对编译前的源代码编译的过程中,有时候首先会得到中间代码,然后继续对中间代码处理,得到编译后的机器代码。

因此,对于编译前的源文件中的任一函数,在得到该函数的中间代码之后,需要将该函数的函数名称与该函数的中间代码组成对应表项,并存储在已存储的函数的函数名称与函数的中间代码之间的第三对应关系中,对于编译前的源文件中的其他每一函数,同样如此。

因此,在本步骤中,还可以获取该函数的中间代码,例如在已存储的函数的函数名称与函数的中间代码之间的第三对应关系中查找与该函数的函数名称相对应的中间代码,然后使用任意一种反编译方法对该中间代码反编译,得到该函数的编译前的源代码。

例如,对该函数的中间代码运行objdump-s命令,得到该函数的编译前的源代码。

在本发明又一实施例中,在获取到源文件且对源文件中包括的源代码编译之前,需要将编译前的源文件中的各个函数的源代码存储在内存中,其中,对于编译前的源文件中的任意一个函数,该函数的源代码中包括该函数的函数名称,对于编译前的源文件中的其他每一个函数,同样如此。

因此,在本步骤中,可以在已存储的多个函数的源代码中查找包括该函数的函数名称的源代码,然后将包括该函数的函数名称的源代码作为该函数的源代码。

在步骤s105中,在该源代码的该位置处查找错误机器代码对应的编译前的源代码。

进一步地,可以提示错误机器代码对应的编译前的源代码。例如,在屏幕上显示错误机器代码对应的编译前的源代码,或者生成包括错误机器代码对应的编译前的源代码的语音信息,然后播放该语音信息。

在本发明另一实施例中,还可以获取错误机器代码对应的编译前的源代码在该函数的编译前的源代码的位置,然后提示该位置。

通过本发明实施例的方法,无需编程人员在源文件中手动检查可能出错的源代码,当编译后的机器代码运行出错时,就会将该机器代码作为错误机器代码,然后获取编译后的错误机器代码的存储地址,再根据该存储地址确定错误机器代码所属的函数,之后根据该存储地址确定错误机器代码在该函数中的位置,并获取该函数的编译前的源代码,之后在该源代码的该位置处就可以查找错误机器代码对应的编译前的源代码,从而可以提高查找错误机器代码对应的编译前的源代码的效率,以及降低人工成本。

需要说明的是,对于方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明实施例并不受所描述的动作顺序的限制,因为依据本发明实施例,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作并不一定是本发明实施例所必须的。

参照图2,示出了本发明一种代码处理装置实施例的结构框图,该装置具体可以包括如下模块:

第一获取模块11,用于获取编译后的错误机器代码的存储地址;

第一确定模块12,用于根据所述存储地址确定所述错误机器代码所属的函数;

第二确定模块13,用于根据所述存储地址确定所述错误机器代码在所述函数中的位置;

第二获取模块14,用于获取所述函数的编译前的源代码;

查找模块15,用于在所述源代码的所述位置处查找所述错误机器代码对应的编译前的源代码。

在一个可选的实现方式中,所述第一获取模块11包括:

第一获取单元,用于获取所述错误机器代码的堆栈信息,所述堆栈信息是在所述错误机器代码运行出错时生成的,所述堆栈信息中至少包括所述错误机器代码的存储地址;

提取单元,用于从所述堆栈信息中提取出所述存储地址,并作为所述错误机器代码的存储地址。

在一个可选的实现方式中,所述第一确定模块12包括:

第二获取单元,用于获取函数的存储地址范围与函数的函数名称之间的对应关系;

第一查找单元,用于在所述对应关系中查找所述存储地址所在的存储地址范围;

第二查找单元,用于在所述对应关系中查找与所述存储地址范围相对应的函数名称;

第一确定单元,用于将所述函数名称所对应的函数确定为所述错误机器代码所属的函数。

在一个可选的实现方式中,所述第二确定模块13具体用于:获取所述存储地址在所述存储地址范围中的偏移量,并作为所述错误机器代码在所述函数中的位置。

在一个可选的实现方式中,所述第二获取模块14包括:

第三获取单元,用于获取所述函数的编译后的机器代码;

第一反编译单元,用于将所述机器代码反编译,得到所述函数的编译前的源代码。

在一个可选的实现方式中,所述第二获取模块14包括:

第四获取单元,用于获取所述函数的中间代码,所述中间代码是事先在编译所述函数的编译前的源代码的过程中生成的;

第二反编译单元,用于将所述中间代码反编译,得到所述函数的编译前的源代码。

在一个可选的实现方式中,所述第二获取模块14包括:

第三查找单元,用于在已存储的多个函数的源代码中查找包括所述函数的函数名称的源代码;

第二确定单元,用于将包含所述函数的函数名称的源代码确定为所述函数的源代码。

通过本发明实施例的方法,无需编程人员在源文件中手动检查可能出错的源代码,当编译后的机器代码运行出错时,就会将该机器代码作为错误机器代码,然后获取编译后的错误机器代码的存储地址,再根据该存储地址确定错误机器代码所属的函数,之后根据该存储地址确定错误机器代码在该函数中的位置,并获取该函数的编译前的源代码,之后在该源代码的该位置处就可以查找错误机器代码对应的编译前的源代码,从而可以提高查找错误机器代码对应的编译前的源代码的效率,以及降低人工成本。

对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。

本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。

本领域内的技术人员应明白,本发明实施例的实施例可提供为方法、装置、或计算机程序产品。因此,本发明实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

本发明实施例是参照根据本发明实施例的方法、终端设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理终端设备的处理器运行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理终端设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理终端设备上,使得在计算机或其他可编程终端设备上运行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上运行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

尽管已描述了本发明实施例的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明实施例范围的所有变更和修改。

最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。

以上对本发明所提供的一种代码处理方法及装置,进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1