程序调试器及一种程序的调试方法

文档序号:6506565阅读:234来源:国知局
程序调试器及一种程序的调试方法
【专利摘要】本发明公开了提高程序调试效率的程序调试器及一种程序的调试方法,该方法包括:获得程序的弱函数相关的调试信息记录;响应于接收到对该程序中该弱函数设置断点的指令,获得与至少一个调试信息记录的每个一一对应的断点地址;响应于该程序被执行到设置的该弱函数相关的断点,获得该程序的程序计数器所指向的地址;在与至少一个调试信息记录的每个一一对应的断点地址中,获得与该程序的程序计数器所指向的地址匹配的断点地址;在该程序的弱函数相关的至少一个调试信息记录中,对匹配的断点地址设置标记;以及响应于再次接收到对该程序中该弱函数设置断点的指令,根据设置标记后的至少一个调试信息记录,获得匹配的断点地址对应的调试信息记录。
【专利说明】程序调试器及一种程序的调试方法

【技术领域】
[0001]本发明涉及程序调试,更具体地涉及一种程序调试器及一种程序的调试方法。

【背景技术】
[0002]一般而言,很多程序通常都由头文件(header files,例如C++语言中头文件扩展名为.h)和定义文件(definit1n files)组成,头文件可作为一种包含类定义、功能函数、数据接口声明的载体文件,主要用于保存程序的声明(declarat1n),起描述性作用;定义文件用于保存程序的实现(implementat1n)。程序的头文件中常常包含定义的类文件,一个类中包含类成员变量与类成员函数。
[0003]一个需要编译、链接形成可执行文件的面向对象编程的语言编写的程序从编写到最后运行要经历以下步骤:首先,程序员编写源程序;然后,程序员用编译器(complier)对源程序进行编译,把源程序翻译成二进制形式的目标程序(object program),其中,编译是以源程序文件为单位分别编译的,一个应用程序可能有若干个源文件,因此,会独立地编译出若干个目标文件或者目标程序,如扩展名为.ο的文件;程序员再把通过编译后得到的一个程序的所有目标程序、系统的库文件、以及系统提供的其他信息用链接器(linker或者binder)链接起来,形成一个可执行的二进制文件,如.exe文件;最后,程序员可以运行形成的可执行的二进制文件,得到运行结果。
[0004]当头文件不仅声明类成员函数而且定义其实现,编译器在编译包含此头文件并调用成员函数的源文件时,在对应目标文件中将该函数标注为弱符号(或称为弱函数),以允许多个源文件调用该类成员函数,否则链接器把它们链接在一起时,链接器会报错。对应多个目标文件中的相同函数名的弱函数,链接时链接器只会选择其中的一个作为实际被调用函数。有的链接器会移除冗余的弱函数实体,而有的链接器保留所有弱函数实体。如果类的成员函数实现定义在类成员体内,则往往被编译器处理成内嵌(inline)函数,但链接器为了完成函数指针调用而不得不保留多份的弱函数实体。
[0005]调试器(debugger)是可用于调试具备调试信息可执行文件的工具,主要功能有维护程序运行,查看程序运行过程中信息,如寄存器信息,堆栈信息、变量信息,内存信息等,以及修改程序执行流程。实现这些功能首先需要让运行中的程序触发断点而停下,断点包含行号断点和函数断点。设置断点时调试器需要调试信息,其主要包括描述函数、变量、调用关系等信息的调试信息实体(Debug informat1n Entries, DIE,可以使用dwarf格式,)和行号实体,而调试信息是在编译汇编期间生成的。
[0006]由于多份弱函数将会有多份的调试信息实体和对应的行号实体,虽然有的链接器对调试信息进行重定位,有的链接器则不对调试信息进行处理,但最终的可执行文件相对应的调试信息将保留多份弱函数的调试信息实体和对应的行号实体。问题在于:当调试器给这些类成员函数设置断点时,将不得不找到所有弱函数的调试信息实体并设置多份断点,或者在给定义在头文件的类成员函数实体内设置行号断点,也需要找到所有行号实体并设置多份断点。如果程序中有1000或更多文件包含这样的头文件,调试器需要找到1000份或更多调试信息实体或者行号实体并设置1000个或更多断点;当再次设置相同的断点时,还需要重复这1000个或更多的找到所有弱函数的调试信息实体或者行号实体并设置多份断点的工作。


【发明内容】

[0007]为了解决上述问题,本发明的一个目的是提供一种新的程序调试器及一种程序的调试方法。
[0008]根据本发明的一个方面,提供了一种程序的调试方法,该方法包括:
[0009]获得该程序的弱函数相关的至少一个调试信息记录;
[0010]响应于接收到对该程序中该弱函数设置断点的指令,根据获得的该程序的该弱函数相关的至少一个调试信息记录,获得与所述至少一个调试信息记录的每个一一对应的断点地址;
[0011]响应于该程序被执行到设置的该弱函数相关的断点,获得该程序的程序计数器所指向的地址;
[0012]在所述与所述至少一个调试信息记录的每个一一对应的断点地址中,获得与所述该程序的程序计数器所指向的地址匹配的断点地址;
[0013]在所述该程序的弱函数相关的至少一个调试信息记录中,对匹配的断点地址设置标记;以及
[0014]响应于再次接收到对该程序中该弱函数设置断点的指令,根据设置标记后的至少一个调试信息记录,获得匹配的断点地址对应的调试信息记录。
[0015]根据本发明的另一个方面,提供了一种程序调试器,包括:
[0016]记录获得装置,被配置为获得该程序的弱函数相关的至少一个调试信息记录;
[0017]断点地址获得装置,被配置为响应于接收到对该程序中该弱函数设置断点的指令,根据获得的该程序的该弱函数相关的至少一个调试信息记录,获得与所述至少一个调试信息记录的每个一一对应的断点地址;
[0018]地址获得装置,被配置为响应于该程序被执行到设置的该弱函数相关的断点,获得该程序的程序计数器所指向的地址;以及
[0019]匹配装置,被配置为在所述与所述至少一个调试信息记录的每个一一对应的断点地址中,获得与所述该程序的程序计数器所指向的地址匹配的断点地址;
[0020]标记装置,被配置为在所述该程序的弱函数相关的至少一个调试信息记录中,对匹配的断点地址设置标记;
[0021]其中断点地址获得装置还被配置为响应于再次接收到对该程序中该弱函数设置断点的指令,根据设置标记后的至少一个调试信息记录,获得匹配的断点地址对应的调试信息记录。
[0022]利用根据本发明上述方面的方法和调试器,可以提高调试速度。

【专利附图】

【附图说明】
[0023]通过结合附图对本公开示例性实施方式进行更详细的描述,本公开的上述以及其它目的、特征和优势将变得更加明显,其中,在本公开示例性实施方式中,相同的参考标号通常代表相同部件。
[0024]图1示出了适于用来实现本发明实施方式的示例性计算机系统/服务器的框图;
[0025]图2示意性示出了一个C++类文件;
[0026]图3示出3个C++源文件a.C,b.C,和c.C及其包含的图2的文件作为其头文件,以及3个源文件对成员函数的调用关系;
[0027]图4示意性示出了编译后的文件a.0、b.ο以及c.ο的形式;
[0028]图5示出了根据本发明的一种实施方式的程序的调试方法的方法流程;
[0029]图6示出了一个与该弱函数调试相关的数据结构;
[0030]图7示出了设置标记后的与该弱函数调试相关的数据结构;以及
[0031]图8示出了根据本发明一种实施方式的一种程序调试器的结构框图。

【具体实施方式】
[0032]下面将参照附图更详细地描述本公开的优选实施方式。虽然附图中显示了本公开的优选实施方式,然而应该理解,可以以各种形式实现本公开而不应被这里阐述的实施方式所限制。相反,提供这些实施方式是为了使本公开更加透彻和完整,并且能够将本公开的范围完整地传达给本领域的技术人员。
[0033]所属【技术领域】的技术人员知道,本发明可以实现为系统、方法或计算机程序产品。因此,本公开可以具体实现为以下形式,即:可以是完全的硬件、也可以是完全的软件(包括固件、驻留软件、微代码等),还可以是硬件和软件结合的形式,本文一般称为“电路”、“模块”或“系统”。此外,在一些实施例中,本发明还可以实现为在一个或多个计算机可读介质中的计算机程序产品的形式,该计算机可读介质中包含计算机可读的程序代码。
[0034]可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPR0M或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本文件中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
[0035]计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括——但不限于——电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
[0036]计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括——但不限于——无线、电线、光缆、RF等等,或者上述的任意合适的组合。
[0037]可以以一种或多种程序设计语言或其组合来编写用于执行本发明操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言-诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言-诸如”C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络一包括局域网(LAN)或广域网(WAN) —连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
[0038]下面将参照本发明实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述本发明。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机程序指令实现。这些计算机程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器,从而生产出一种虚拟机,这些计算机程序指令通过计算机或其它可编程数据处理装置执行,产生了实现流程图和/或框图中的方框中规定的功能/操作的装置。
[0039]也可以把这些计算机程序指令存储在能使得计算机或其它可编程数据处理装置以特定方式工作的计算机可读介质中,这样,存储在计算机可读介质中的指令就产生出一个包括实现流程图和/或框图中的方框中规定的功能/操作的指令装置(instruct1nmeans)的制造品(manufacture)。
[0040]也可以把计算机程序指令加载到计算机、其它可编程数据处理装置、或其它设备上,使得在计算机、其它可编程数据处理装置或其它设备上执行一系列操作步骤,以产生计算机实现的过程,从而使得在计算机或其它可编程装置上执行的指令能够提供实现流程图和/或框图中的方框中规定的功能/操作的过程。
[0041]图1示出了适于用来实现本发明实施方式的示例性计算机系统/服务器12的框图。图1显示的计算机系统/服务器12仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
[0042]如图1所示,计算机系统/服务器12以通用计算设备的形式表现。计算机系统/服务器12的组件可以包括但不限于:一个或者多个处理器或者处理单元16,系统存储器28,连接不同系统组件(包括系统存储器28和处理单元16)的总线18。
[0043]总线18表示几类总线结构中的一种或多种,包括存储器总线或者存储器控制器,外围总线,图形加速端口,处理器或者使用多种总线结构中的任意总线结构的局域总线。举例来说,这些体系结构包括但不限于工业标准体系结构(ISA)总线,微通道体系结构(MAC)总线,增强型ISA总线、视频电子标准协会(VESA)局域总线以及外围组件互连(PCI)总线。
[0044]计算机系统/服务器12典型地包括多种计算机系统可读介质。这些介质可以是任何能够被计算机系统/服务器12访问的可用介质,包括易失性和非易失性介质,可迁移的和不可迁移的介质。
[0045]系统存储器28可以包括易失性存储器形式的计算机系统可读介质,例如随机存取存储器(RAM) 30和/或高速缓存存储器32。计算机系统/服务器12可以进一步包括其它可迁移/不可迁移的、易失性/非易失性计算机系统存储介质。仅作为举例,存储系统34可以用于读写不可迁移的、非易失性磁介质(图1未显示,通常称为“硬盘驱动器”)。尽管图1中未示出,可以提供用于对可迁移非易失性磁盘(例如“软盘”)读写的磁盘驱动器,以及对可迁移非易失性光盘(例如⑶-ROM,DVD-ROM或者其它光介质)读写的光盘驱动器。在这些情况下,每个驱动器可以通过一个或者多个数据介质接口与总线18相连。存储器28可以包括至少一个程序产品,该程序产品具有一组(例如至少一个)程序模块,这些程序模块被配置以执行本发明各实施例的功能。
[0046]具有一组(至少一个)程序模块42的程序/实用工具40,可以存储在例如存储器28中,这样的程序模块42包括——但不限于——操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。程序模块42通常执行本发明所描述的实施例中的功能和/或方法。
[0047]计算机系统/服务器12也可以与一个或多个外部设备14(例如键盘、指向设备、显示器24等)通信,还可与一个或者多个使得用户能与该计算机系统/服务器12交互的设备通信,和/或与使得该计算机系统/服务器12能与一个或多个其它计算设备进行通信的任何设备(例如网卡,调制解调器等等)通信。这种通信可以通过输入/输出(I/O)接口 22进行。并且,计算机系统/服务器12还可以通过网络适配器20与一个或者多个网络(例如局域网(LAN),广域网(WAN)和/或公共网络,例如因特网)通信。如图所示,网络适配器20通过总线18与计算机系统/服务器12的其它模块通信。应当明白,尽管图中未示出,可以结合计算机系统/服务器12使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、RAID系统、磁带驱动器以及数据备份存储系统等。
[0048]下面,将参照附图来描述根据本发明实施例的一种程序调试器及一种程序的调试方法。全文将以C++语言为例进行描述,其它需要编译、链接形成可执行文件的面向对象编程的语言的调试方法或调试器类似。
[0049]图2示意性示出了一个C++类文件,该文件作为头文件Date, h。该C++类包含四个类成员函数 SetDate, GetMonth, GetDate, GetYear。图 3 不出 3 个 C++ 源文件 a.C, b.C,和c.C及其包含的图2的文件作为其头文件,以及3个源文件对成员函数的调用关系。其中,每一个源文件都调用类成员函数SetDate。该成员函数已经在类声明时定义,编译源文件时编译器将在对其展开,并且标记为弱函数符号。则,图4示意性示出了编译后的文件a.0、b.ο以及c.ο的形式。在链接时,链接器将这些文件链接在一起,当发现a.ο文件中一个重定位项所需的弱函数符号是SetDate,检索符号表找到三个同名弱函数SetDate,其分别来自a.0、b.ο和c.ο三个文件,也就是有3个弱函数符号SetDate可供选择来链接,链接器会随机选择其中一个弱函数符号进行重定义。在图4的示例中,a.ο、b.ο和c.ο三个文件中都调用弱函数SetDate,链接器都选择了 a.ο文件中的弱函数SetDate。
[0050]本发明公开了一种程序的调试方法,图5示出了根据本发明的一种实施方式的程序的调试方法的方法流程。该方法适用于调试器对于需要编译、链接形成可执行文件的面向对象编程的语言的调试。下面将详细描述该方法的产生及过程。
[0051]当使用调试器进行和弱函数相关的调试时,可以设置两种类型的断点,一种是弱函数断点,即在弱函数入口处设置断点;另外一种是弱函数内部的行号断点,也就是在弱函数体内部的某一行设置断点。为了后续设置上述两种类型的断点进行调试,在本发明公开的程序的调试方法中,根据图5,在步骤S501,调试器首先要获得该程序的一个弱函数相关的至少一个调试信息记录。响应于设置的断点为弱函数断点,调试信息记录对应弱函数的调试信息实体(DIE);响应于设置的断点为弱函数内部的行号断点,调试信息记录对应弱函数的调试行号实体。调试信息实体中包含函数名、函数类别、函数定义所在源文件名、函数起始地址(低地址)和结束地址(高地址)等信息;调试行号实体中包含行号、该行所在源文件名、该行的起始地址、行类别等信息。对应弱函数的调试信息实体和对应弱函数的调试行号实体可以从编译器产生的目标文件获得。现有的调试器都具有该功能,因此如何获得属于现有技术的范畴,这里不再赘述。
[0052]在步骤S502,响应于接收到对该程序中该弱函数设置断点的指令,根据获得的该程序的该弱函数相关的至少一个调试信息记录,获得与所述至少一个调试信息记录的每个一一对应的断点地址。根据调试信息记录获得其对应的断点地址本身属于现有技术,一般调试器都具有的功能,比较常用的方法是构建与该弱函数调试相关的数据结构。图6示出了一个与弱函数调试相关的数据结构。图6中断点类型可以有多种类型,例如包括普通断点和条件断点等,普通断点即前面叙述的弱函数相关的断点,包括弱函数断点以及弱函数内的行号断点;断点列表可以采用链表或者其它数据结构来表达,断点列表包括对应的至少一个调试信息记录,例如在图6中包括3个调试信息记录,每个调试信息记录包括函数名和文件名,例如对上面的例子,3个调试信息记录的函数名均为SetDate ;文件名分别为a.ο、b.ο和c.ο。当接收到程序中该弱函数SetDate设置断点的指令,例如设置弱函数断点stop in Date::SetDate (int, int, int),或者在弱函数SetDate内部设置行号断点如stop at “a.Date, h:19”,则该断点是和弱函数相关的断点,由于调试器并不知道链接器最后会选择a.0、b.ο以及c.ο中的哪个弱函数SetDate,因此,会在三个弱函数中都设置断点。则在图6的数据结构中,在每个调试信息记录对应的断点地址域中加入断点地址。响应于设置的断点为弱函数断点,断点地址是程序装载到内存中的弱函数的入口地址;响应于设置的断点为弱函数内部的行号断点,断点地址是程序装载到内存中的弱函数内的某行的起始地址。
[0053]设置好断点后,就可以执行程序,以便在断点处观察程序的执行。根据图5,在步骤S503,响应于该程序被执行到设置的该弱函数相关的断点,获得该程序计数器(PC)所指向的地址,可以通过PC寄存器获得程序计数器所指向的地址。
[0054]在步骤S504,在所述与所述至少一个调试信息记录的每个一一对应的断点地址中,获得与所述该程序的程序计数器所指向的地址匹配的断点地址。如图6中,与该弱函数调试相关的数据结构中包含3个调试信息记录,每个调试信息记录对应一个断点地址,因此存在3个断点地址。可以从这3个断点地址找出与上述该程序的程序计数器所指向的地址匹配的一个断点地址。如果3个断点是弱函数断点,获得与所述该程序的程序计数器所指向的地址匹配的断点地址包括把程序计数器所指向的地址和所述至少一个调试信息记录的每个一一对应的断点地址相比较,如果相等,则该断点地址为匹配的断点地址,如图6所示,发现调试信息记录1的断点地址是与程序计数器所指向的地址相匹配的断点;如果3个断点是弱函数内的行号断点,获得与所述该程序的程序计数器所指向的地址匹配的断点地址包括首先把程序计数器所指向的地址和所述至少一个调试信息记录的每个一一对应的断点地址相比较;如果相等,则继续比较程序计数器所指向的地址与该行号实体所在的源程序的所有的调试信息实体的高地址与低地址;响应于程序计数器所指向的地址在所述该行号实体所在的源程序的所有的调试信息实体的高地址与低地址之间,则该调试信息记录的断点地址与程序计数器所指向的地址相匹配。根据以上断点地址找到程序计数器所指向的地址匹配的调试信息记录1,说明链接器就是选择了该a.ο内的弱函数SetDate进行链接,则其它弱函数没有被选择,可以对其它弱函数进行标记,因此,在步骤S505,在所述该程序的弱函数相关的至少一个调试信息记录中,对匹配的断点地址设置标记。标记设置的方法有很多种,可以直接在匹配的断点地址对应的调试信息记录中设置标记域,进行标记。一种优选的实施方式中,对与所述至少一个调试信息记录的每个一一对应的断点地址中除匹配的断点地址外的其它断点地址对应的调试信息记录设置标记,所述标记为在该调试信息记录的标记域中指向匹配的断点地址对应的调试信息记录的指针,也可以是匹配的断点地址对应的调试信息记录的名称,等等,只要能标记出该断点地址不是匹配的断点地址,任何标记方法都可以。图7示出了设置标记后的与该弱函数调试相关的数据结构,如图7,当调试信息记录1中的断点地址为匹配的断点地址时,调试信息记录2和调试信息记录3中都要包含标记域,这里使用指针指向调试信息记录1。实际上,与该弱函数调试相关的数据结构是否设置标记关系并不大,使用该数据结构的真正目的是获得匹配断点以外的其它断点。设置标记真正有影响的是在步骤S501获得的该程序的一个弱函数相关的至少一个调试信息记录,因此该记录才是后续重新调试的基础,因此,在获得的该程序的一个弱函数相关的至少一个调试信息记录中对匹配断点之外的其它断点设置标记域,标记域的设置方法与上面与该弱函数调试相关的数据结构设置标记的方法类似,这里不再赘述。
[0055]在一种优选的实施方式中,可以进一步扩展标记域,例如在标记域加入时间戳,对于时间戳小于目标文件生成的时间戳,可以忽视该标记,即,丢弃时间戳小于目标文件生成时间的当前至少一个调试信息记录;重新获得该程序的弱函数相关的至少一个调试信息记录。
[0056]这样,调试器就获得了链接器链接的弱函数,并且保存了该信息,在后续的调试过程中,可以利用该信息。则在步骤S506,响应于再次接收到对该程序中该弱函数设置断点的指令,根据设置标记后的至少一个调试信息记录,获得匹配的断点地址对应的调试信息记录。当再次接收到对该程序中该弱函数设置断点的指令,还需要根据获得的该程序的该弱函数相关的至少一个调试信息记录,获得匹配的断点地址对应的调试信息记录,使得后续函数调用简单化。一般的调试器还需要重新构建与该弱函数调试相关的数据结构,如果直接用原来的至少一个调试信息记录构建,可能成百上千,构建的工作量很大。其实根据本发明,这时获得的该程序的该弱函数相关的至少一个调试信息记录已经是标记后的调试信息记录,其中标记了链接器链接的弱函数实体地址是调试信息记录1对应的断点地址,这样,重新生成的新的与该弱函数调试相关的数据结构,就只包含调试信息记录1,即只有一个匹配的断点地址。具体获得匹配的断点地址对应的调试信息记录方法包括:首先对在设置标记后的至少一个调试信息记录中,获取一条调试信息记录;然后判断该调试信息记录中是否存在标记;再响应于该条调试信息记录中不存在标记,获得下一条调试信息记录,返回判断步骤;最后响应于该条调试信息记录中存在标记,则该条调试信息记录的标记域中指针指向的调试信息记录为匹配的断点地址对应的调试信息记录。这样就获得匹配的断点地址对应的调试信息记录,可以构建与该弱函数调试相关的新的数据结构。这时,与该弱函数调试相关的新的数据结构只包含一条调试信息记录,也就是匹配的断点地址,即对应于链接器所选择的弱函数。显然,如果是在匹配的断点地址对应的调试信息记录设置标记,获得匹配的断点地址对应的调试信息记录所要查询的调试信息记录的数量是不定的,但会比查询的全部的调试信息记录工作量减少。但是对除匹配的断点地址对应的调试信息记录设置标记,最多只要判别两条调试信息记录,就可以建立新的与该弱函数调试相关的新的数据结构,而原来建立这样的数据结构与原始的调试信息记录数量相关,如果有成千上万条调试信息记录,就会检索成千上万条调试信息记录,工作量大,调试耗时长,同时,在程序记数器指定的地址与断点内数据结构的调试信息记录的断点地址匹配过程,新的数据结构仅包含一个调试信息记录,也大量减少匹配的时间。使用本发明的方法,再次对相同的弱函数设置断点调试时,工作量将大大减少,同时,调试速度会显著提升。
[0057]在同一个发明构思下,本发明的实施方式还公开了一种程序调试器,图8示出了根据本发明一种实施方式的一种程序调试器的结构框图,根据图8,该程序调试器包括:记录获得装置,被配置为获得该程序的弱函数相关的至少一个调试信息记录;断点地址获得装置801,被配置为响应于接收到对该程序中该弱函数设置断点的指令,根据获得的该程序的该弱函数相关的至少一个调试信息记录,获得与所述至少一个调试信息记录的每个一一对应的断点地址;地址获得装置802,被配置为响应于该程序被执行到设置的该弱函数相关的断点,获得该程序的程序计数器所指向的地址;匹配装置803,被配置为在所述与所述至少一个调试信息记录的每个一一对应的断点地址中,获得与所述该程序的程序计数器所指向的地址匹配的断点地址;标记装置804,被配置为在所述该程序的弱函数相关的至少一个调试信息记录中,对匹配的断点地址设置标记;其中断点地址获得装置还被配置为响应于再次接收到对该程序中该弱函数设置断点的指令,根据设置标记后的至少一个调试信息记录,获得匹配的断点地址对应的调试信息记录。
[0058]在一种实施方式中,断点地址获得装置包括:数据结构建立装置(图8未示出),被配置为构建与该弱函数调试相关的数据结构,该数据结构中包含与所述至少一个调试信息记录的每个一一对应的断点地址。
[0059]在一种实施方式中,程序调试器中,响应于设置的断点为弱函数断点,调试信息记录对应弱函数的调试信息实体;响应于设置的断点为弱函数内部的行号断点,调试信息记录对应弱函数的调试行号实体。进一步地,对应弱函数的调试信息实体和对应弱函数的调试行号实体从编译器产生的编译文件获得。更进一步地,响应于设置的断点为弱函数断点,断点地址是程序装载到内存中的弱函数的入口地址;响应于设置的断点为弱函数内部的行号断点,断点地址是该程序装载到内存中的该弱函数的行的起始地址。
[0060]在一种实施方式中,程序调试器中,响应于设置的断点为弱函数断点,所述匹配装置被进一步配置为把程序计数器所指向的地址和与所述至少一个调试信息记录的每个一一对应的断点地址相比较,如果相等,则该断点地址为匹配的断点地址。
[0061]在另一种实施方式中,程序调试器中,响应于设置的断点为弱函数内部的行号断点,所述匹配装置被进一步配置为:首先把程序计数器所指向的地址和所述至少一个调试信息记录的每个一一对应的断点地址相比较;如果相等,再继续比较程序计数器所指向的地址与该行号实体所在的源程序的所有的调试信息实体的高地址与低地址;最后响应于程序计数器所指向的地址在所述该行号实体所在的源程序的所有的调试信息实体的高地址与低地址之间,则该调试信息记录的断点地址与程序计数器所指向的地址相匹配。
[0062]在一种实施方式中,程序调试器中,标记装置对匹配的断点地址设置标记包括:对与所述至少一个调试信息记录的每个一一对应的断点地址中除匹配的断点地址外的其它断点地址对应的的调试信息记录设置标记,所述标记为在该调试信息记录的标记域中指向匹配的断点地址对应的调试信息记录的指针。优选地,所述标记域包括时间戳,该程序调试器进一步包括:丢弃装置,被配置为丢弃时间戳小于目标文件生成时间的当前至少一个调试信息记录;其中获得装置被进一步配置为响应于丢弃装置丢弃时间戳小于目标文件生成时间的当前至少一个调试信息记录,重新获得该程序的弱函数相关的至少一个调试信息记录。
[0063]在一种实施方式中,程序调试器中,所述断点地址获得装置获得匹配的断点地址对应的调试信息记录进一步包括(图8未示出):单条调试信息记录获得装置,被配置为在设置标记后的至少一个调试信息记录中,获取一条调试信息记录;判断装置,被配置为判断该调试信息记录中是否存在标记;其中,单条调试信息记录获得装置被进一步配置为响应于该条调试信息记录中不存在标记,获取下一条调试信息记录,判断进一步被配置为响应于该条调试信息记录中存在标记,则该条调试信息记录的标记域中指针指向的调试信息记录为为匹配的断点地址对应的调试信息记录。
[0064]附图中的流程图和框图显示了根据本发明的多个实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
[0065]以上已经描述了本发明的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本【技术领域】的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术的技术改进,或者使本【技术领域】的其它普通技术人员能理解本文披露的各实施例。
【权利要求】
1.一种程序的调试方法,该方法包括: 获得该程序的弱函数相关的至少一个调试信息记录; 响应于接收到对该程序中该弱函数设置断点的指令,根据获得的该程序的该弱函数相关的至少一个调试信息记录,获得与所述至少一个调试信息记录的每个一一对应的断点地址; 响应于该程序被执行到设置的该弱函数相关的断点,获得该程序的程序计数器所指向的地址; 在所述与所述至少一个调试信息记录的每个一一对应的断点地址中,获得与所述该程序的程序计数器所指向的地址匹配的断点地址; 在所述该程序的弱函数相关的至少一个调试信息记录中,对匹配的断点地址设置标记;以及 响应于再次接收到对该程序中该弱函数设置断点的指令,根据设置标记后的至少一个调试信息记录,获得匹配的断点地址对应的调试信息记录。
2.如权利要求1所述的方法,其中所述获得与所述至少一个调试信息记录的每个一一对应的断点地址包括:构建与该弱函数调试相关的数据结构,该数据结构中包含与所述至少一个调试信息记录的每个一一对应的断点地址。
3.如权利要求1或2所述的方法,其中,响应于设置的断点为弱函数断点,调试信息记录对应弱函数的调试信息实体;响应于设置的断点为弱函数内部的行号断点,调试信息记录对应弱函数的调试行号实体。
4.如权利要求3所述的方法,其中对应弱函数的调试信息实体和对应弱函数的调试行号实体从编译器产生的编译文件获得。
5.如权利要求3所述的方法,其中响应于设置的断点为弱函数断点,断点地址是程序装载到内存中的弱函数的入口地址;响应于设置的断点为弱函数内部的行号断点,断点地址是该程序装载到内存中的该弱函数的行的起始地址。
6.如权利要求3所述的方法,其中响应于设置的断点为弱函数断点,所述获得与所述该程序的程序计数器所指向的地址匹配的断点地址包括把程序计数器所指向的地址和与所述至少一个调试信息记录的每个一一对应的断点地址相比较,如果相等,则该断点地址为匹配的断点地址。
7.如权利要求3所述的方法,其中响应于设置的断点为弱函数内部的行号断点,所述获得与所述该程序的程序计数器所指向的地址匹配的断点地址包括: 把程序计数器所指向的地址和所述至少一个调试信息记录的每个一一对应的断点地址相比较; 如果相等,继续比较程序计数器所指向的地址与该行号实体所在的源程序的所有的调试信息实体的高地址与低地址; 响应于程序计数器所指向的地址在所述该行号实体所在的源程序的所有的调试信息实体的高地址与低地址之间,则该调试信息记录的断点地址与程序计数器所指向的地址相匹配。
8.如权利要求1所述的方法,其中所述在所述该程序的弱函数相关的至少一个调试信息记录中,对匹配的断点地址设置标记包括: 对与所述至少一个调试信息记录的每个一一对应的断点地址中除匹配的断点地址外的其它断点地址对应的的调试信息记录设置标记,所述标记为在该调试信息记录的标记域中指向匹配的断点地址对应的调试信息记录的指针。
9.如权利要求8所述的方法,其中所述响应于再次接收到对该程序中该弱函数设置断点的指令,根据设置标记后的至少一个调试信息记录,获得匹配的断点地址对应的调试信息记录包括: 在设置标记后的至少一个调试信息记录中,获取一条调试信息记录; 判断该调试信息记录中是否存在标记; 响应于该条调试信息记录中不存在标记,获取下一条调试信息记录,返回判断步骤; 响应于该条调试信息记录中存在标记,则该条调试信息记录的标记域中指针指向的调试信息记录为匹配的断点地址对应的调试信息记录。
10.如权利要求8所述的方法,其中所述标记域包括时间戳,该方法进一步包括: 丢弃时间戳小于目标文件生成时间的当前至少一个调试信息记录; 重新获得该程序的弱函数相关的至少一个调试信息记录。
11.一种程序调试器,包括: 记录获得装置,被配置为获得该程序的弱函数相关的至少一个调试信息记录; 断点地址获得装置,被配置为响应于接收到对该程序中该弱函数设置断点的指令,根据获得的该程序的该弱函数相关的至少一个调试信息记录,获得与所述至少一个调试信息记录的每个一一对应的断点地址; 地址获得装置,被配置为响应于该程序被执行到设置的该弱函数相关的断点,获得该程序的程序计数器所指向的地址; 匹配装置,被配置为在所述与所述至少一个调试信息记录的每个一一对应的断点地址中,获得与所述该程序的程序计数器所指向的地址匹配的断点地址;以及 标记装置,被配置为在所述该程序的弱函数相关的至少一个调试信息记录中,对匹配的断点地址设置标记; 其中断点地址获得装置还被配置为响应于再次接收到对该程序中该弱函数设置断点的指令,根据设置标记后的至少一个调试信息记录,获得匹配的断点地址对应的调试信息记录。
12.如权利要求11所述的程序调试器,其中所述断点地址获得装置包 括: 数据结构建立装置,被配置为构建与该弱函数调试相关的数据结构,该数据结构中包含与所述至少一个调试信息记录的每个一一对应的断点地址。
13.如权利要求11或12所述的程序调试器,其中,响应于设置的断点为弱函数断点,调试信息记录对应弱函数的调试信息实体;响应于设置的断点为弱函数内部的行号断点,调试信息记录对应弱函数的调试行号实体。
14.如权利要求13所述的程序调试器,其中对应弱函数的调试信息实体和对应弱函数的调试行号实体从编译器产生的编译文件获得。
15.如权利要求13所述的程序调试器,其中响应于设置的断点为弱函数断点,断点地址是程序装载到内存中的弱函数的入口地址;响应于设置的断点为弱函数内部的行号断点,断点地址是该程序装载到内存中的该弱函数的行的起始地址。
16.如权利要求13所述的程序调试器,其中响应于设置的断点为弱函数断点,所述匹配装置被进一步配置为把程序计数器所指向的地址和与所述至少一个调试信息记录的每个一一对应的断点地址相比较,如果相等,则该断点地址为匹配的断点地址。
17.如权利要求13所述的程序调试器,其中响应于设置的断点为弱函数内部的行号断点,所述匹配装置被进一步配置为: 把程序计数器所指向的地址和所述至少一个调试信息记录的每个一一对应的断点地址相比较; 如果相等,继续比较程序计数器所指向的地址与该行号实体所在的源程序的所有的调试信息实体的高地址与低地址; 响应于程序计数器所指向的地址在所述该行号实体所在的源程序的所有的调试信息实体的高地址与低地址之间,则该调试信息记录的断点地址与程序计数器所指向的地址相匹配。
18.如权利要求10或11所述的程序调试器,所述标记装置对匹配的断点地址设置标记包括:对与所述至少一个调试信息记录的每个一一对应的断点地址中除匹配的断点地址外的其它断点地址对应的调试信息记录设置标记,所述标记为在该调试信息记录的标记域中指向匹配的断点地址对应的调试信息记录的指针。
19.如权利要求18所述的程序调试器,其中断点地址获得装置获得匹配的断点地址对应的调试信息记录包括: 单条调试信息记录获得装置,被配置为在设置标记后的至少一个调试信息记录中,获取一条调试信息记录; 判断装置,被配置为判断该调试信息记录中是否存在标记; 其中,单条调试信息记录获得装置被进一步配置为响应于该条调试信息记录中不存在标记,获取下一条调试信息记录,判断进一步被配置为响应于该条调试信息记录中存在标记,则该条调试信息记录的标记域中指针指向的调试信息记录为匹配的断点地址对应的调试信息记录。
20.如权利要求18所述的程序调试器,其中所述标记域包括时间戳,该程序调试器进一步包括: 丢弃装置,被配置为丢弃时间戳小于目标文件生成时间的当前至少一个调试信息记录; 其中获得装置被进一步配置为响应于丢弃装置丢弃时间戳小于目标文件生成时间的当前至少一个调试信息记录,重新获得该程序的弱函数相关的至少一个调试信息记录。
【文档编号】G06F11/36GK104346274SQ201310322560
【公开日】2015年2月11日 申请日期:2013年7月29日 优先权日:2013年7月29日
【发明者】C·贝茨, 王帆, 陈小玲 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1