一种程序调试方法和装置的制造方法_2

文档序号:9417286阅读:来源:国知局
43]202、将内存地址以及对应的调试信息中的调试动作信息发送至Release版本程序所在的程序调试装置,以使得在所述Release版本程序的所述内存地址处进行所述调试动作信息对应的调试处理;
[0044]203、接收所述程序调试装置返回的调试处理结果,所述调试处理结果包括所述内存地址、以及结果信息,将所述内存地址转换为Debug版本程序的所述调试位置,得到所述调试位置处的所述结果信息。
[0045]图3示例了本申请的程序调试方法的流程,该流程是以设备A的程序调试装置gdbserver执行为例,如图3所示,可以包括:
[0046]301、接收Debug版本程序所在的程序调试装置发送的内存地址、以及对应的调试动作信息,Debug版本程序与待测试的Release版本程序对应;
[0047]302、在Release版本程序的内存地址处,进行调试动作信息对应的调试处理;
[0048]303、将调试处理结果反馈至所述程序调试装置,调试处理结果包括所述内存地址、以及结果信息,以使得程序调试装置将内存地址转换为Debug版本程序的调试位置,得到调试位置处的所述结果信息。
[0049]结合图2和图3所示,在步骤201中,测试人员可以通过设备B的gdb设置调试信息,该调试信息可以包括:调试位置及调试动作信息。
[0050]例如,Debug版本程序即设置了调试信息的源代码文件,因此,可以在源代码中设置断点等调试信息。在本例子中,设置的调试信息中,调试位置即为断点设置位置(如,在源代码文件abc.c的第16行)以及调试动作信息,该调试动作信息可以为“设置断点”的动作指示,即在调试位置设置断点,该断点表示,当程序运行到第16行时将暂停,以方便测试人员查看相关变量值等运行结果。
[0051]又例如,在进行调试时,除了上述的设置断点,还可以获取程序中一些变量的运行结果值进行查看,以检测运行结果是否正确。在本例子中,设置的调试信息中,调试位置可以为Debug版本程序中要取值的目标变量对应的变量位置(如,在源代码文件abc.c的第16行中的变量X)以及调试动作信息,该调试动作信息可以为“取变量X的运行结果值”,该变量X可以称为目标变量,调试动作即获取目标变量的取值。
[0052]在步骤201中,gdb可以根据上述设置的调试信息,进行地址转换,主要是将调试信息中的调试位置转换为对应的内存地址。例如,在上述例子中,可以将断点设置位置(如,在源代码文件abc.c的第16行)转换成对应的内存地址,比如0x123456 ;又例如,还可以将第16行中的变量X也转换成对应的内存地址,即变量X的值位于某个对应的内存地址中。
[0053]在步骤202和步骤301中,gdb可以将在201中转换得到的内存地址以及对应的调试动作信息发送至gdbserver,并且是以gdbserver能够解析的协议格式进行信息传输;同样,当gdbserver向gdb传输信息时,也以gdb能够解析的协议格式,以使得程序调试装置双方能够进行通信的理解。
[0054]由上述可以看到,设备A的gdbserver加载的Release版本程序本身是不能对应源代码文件的,比如,如果gdb通知gdbserver在Release版本程序的第16行位置设置断点,那么Release版本程序将无法执行,因为其不能知道该源码中断点的位置,其他断点信息同理,如果通知Release版本程序获取变量x的值,其也不知道源码中x对应Release自身的位置而不能获取;基于此,本实施例的gdb将调试信息中的调试位置转换成了内存地址,Release版本程序和Debug版本程序在运行时占用的内存地址是相同的,因此,通过该内存地址使得Release版本程序确定调试信息的位置。
[0055]并且,gdb要在告知调试位置对应的内存地址时,还要通知在该内存地址需要进行何种调试处理,即调试动作信息;例如,在断点设置位置进行“设置断点”,或者,在变量位置获取目标变量对应的取值。
[0056]在步骤302中,设置A的程序调试装置gdbserver可以根据在步骤301中接收到的调试信息,在Release版本程序的对应上述内存地址的位置,进行调试动作信息对应的调试处理。例如,在断点设置位置进行设置断点的动作;或者,在变量X对应的内存地址获取该变量X的取值。
[0057]在步骤303中,gdbserver还可以将调试处理结果反馈至设备B侧的gdb,以供设备B的测试人员查看。该调试处理结果可以包括:内存地址以及该地址处的结果信息。
[0058]例如,当调试信息是在断点设置位置设置断点时,那么据此进行调试处理的结果包括“触发断点”以及内存地址,即gdbserver通知gdb已经在“内存地址”的位置实现了“触发断点”的结果。又例如,当调试信息是在获取变量X的取值时,那么据此进行调试处理的结果包括“变量X的取值”即运行结果、以及“内存地址”,此时该内存地址是变量X对应的内存地址。
[0059]需要说明的是,对于设备A的gdbserver来说,其只要根据gdb传输的调试信息中的内存地址以及调试动作信息,进行调试处理即可,但是,由于Release版本程序不与源码对应,gdbserver无法获知进行调试处理的内存地址处对应的是何种源码信息,比如,gdbserver在Release版本程序对应的内存地址0x123456处触发断点,而不能知道该地址0x123456对应的是源码文件的第16行;又例如,gdbserver在Release版本程序对应的一个内存地址获取了一个取值,但是并不能知道该取值对应的是源码文件的变量X的值。因此,在步骤303中,gdbserver要将结果信息及对应的内存地址返回给gdb。
[0060]而在步骤203中,gdb可以根据gdbserver反馈的调试处理结果,解析其中的结果信息对应的内存地址是源码的何种位置,比如,当gdbserver返回的调试处理结果包括“触发断点”(结果信息)以及“0x123456” (内存地址)时,gdb可以进行地址转换,将内存地址0x123456转换为源码文件abc.c第16行,从而获知gdbserver对Release版本程序相当于在源码第16行的位置触发了断点,即获得了在步骤201中最初设定的调试位置处的调试结果信息。
[0061]上述例子的程序调试方法,通过在gdb调试装置对Debug版本程序设置调试信息,并使用内存地址转换的方法,通知待测试的Release版本程序侧进行调试的内存地址及调试动作,可以使得Release版本程序执行设置的调试信息对应的调试处理;并且,通过由Release版本程序所在的gdbserver将调试结果及内存地址反馈回gdb,gdb也可以通过地址转换获知调试信息对应的调试结果,从而实现了对Release版本程序源码级的调试,能够尽快的定位Release版本的问题对应的源码位置,提高了故障定位的效率。
[0062]如下一个例子,描述使用本申请的程序调试方法对Release版本程序进行问题定位的过程;其中,在该例子中,假设Release版本程序对对应源码的第16行的位置出现了错误,并且假设是变量X的运行结果错误,那么图4的流程示例了使用本实施例的调试方法定位出该问题所在的步骤。如图4所示,该流程是gdb和gdbserver之间的通信过程,可以包括:
[0063]501、gdb获取加载的Debug版本程序设置的调试信息,包括断点设置位置和设置断点的动作;
[0064]例如,设备B安装的程序调试装置gdb,可以加载与待测试的Release版本程序对应的Debug版本程序。并且,测试人员可以通过gdb设置调试信息,包括调试位置以及在该位置处的调试动作信息。
[0065]示例性的,在本步骤中,可以设置在第16行的位置设置断点,即调试位置为源码文件的16行,调试动作为设置断点。
[0066]502、gdb将断点设置位置转换成内存地址;
[0067]例如,gdb可以根据加载的Debug版本程序将源码文件abc.c第16行这个信息转换成一个对应的内存地址,如0x123456。
[0068]503、gdb将内存地址以及设置断点的动作指示,传输至gdbserver ;
[0069]例如,gdb可以通过gdbserver能够解析的协议格式将上述的内存地址及设置断点指示传输至gdbserver。
[0070]504、gdbserver在内存地址处,对Release版本程序触发断点;
[0071]例如,gdbserver在接收到0x123456以及设置断点的信息后,可以对Release版本程序进行断点的设置,并当该程序运行到断点位置0x123456时触发断点。
[0072]505、gdbserver将调试处理结果反馈至gdb,包括触发断点及内存地址;
[0073]例如,在本步骤中,gdbserver相当于通知gdb,在内存地址0x123456的位置对Release版本程序进行了断点触发;可以通过gdb能够理解的协议格式发送该信息。
[0074]506、gdb将内存地址转换为对应源码的位置,获得断点调试的结果;
[0075]例如,gdb可以将在505中gdbserver返回的地址0x123456进行地址转换,得到该地址对应的是源码文件第16行,综合触发断点的结果信息,那就是“Release版本程序在对应源码16行的位置触发了断点”,实现了根据在步骤501中设置的调试信息的
当前第2页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1