发明内容
本发明提供一种程序调试方法、装置及系统,解决了调试过程中程序停止在库函数对应的机器码中的问题,进而能够确定目标芯片运行的二进制机器码与源程序之间的对应关系。
第一个方面,本发明实施例提供一种程序调试方法,包括:
向目标芯片发送程序调试指令,以使所述目标芯片根据所述程序调试指令运行二进制代码程序;
在程序运行停止时,读取所述目标芯片当前运行的二进制代码程序的PC;
判断所述PC是否在第一映射表内,所述第一映射表包括库函数与所述库函数在所述二进制代码程序中的PC之间的映射关系;
如果所述PC在所述第一映射表内,则重新向所述目标芯片发送程序调试指令,直到所述目标芯片在程序运行停止时的二进制代码程序的PC不在所述第一映射表内为止。
进一步的,所述向目标芯片发送程序调试指令之前,还包括:
接收界面处理装置发送的所述第一映射表,所述第一映射表为所述界面处理装置根据编译过程中生成的调试信息生成的,所述调试信息包括源代码行号与源代码对应的二进制代码的PC之间的对应关系,以及程序指令与当前运行的二进制代码的PC之间的对应关系,其中所述程序指令与二进制代码一一对应。
进一步的,还包括:
如果所述PC不在所述第一映射表内,则向界面处理装置发送所述PC,以使所述界面处理装置根据第二映射表,确定所述PC对应的源代码行号,所述第二映射表包括源代码行号与源代码对应的二进制代码的PC之间的映射关系。
可选的,在上述所有实施例提供的一种程序调试方法中,所述调试指令包括了单步指令、步越指令或停止运行指令。
第二个方面,本发明实施例提供一种程序调试方法,包括:
对源代码进行编译,生成二进制代码和调试信息,所述调试信息包括源代码行号与源代码对应的二进制代码的PC之间的对应关系,以及程序指令与当前运行的二进制代码的PC之间的对应关系,其中程序指令与二进制代码一一对应;
根据程序指令与当前运行的二进制代码的PC之间的对应关系,确定所述源代码中调用的库函数对应的二进制代码的起始PC和结束PC;
根据各个库函数对应的二进制代码的起始PC和结束PC,生成第一映射表,所述第一映射表包括库函数与所述库函数在所述二进制代码程序中的PC之间的映射关系;
根据源代码行号与源代码对应的二进制代码的PC之间的对应关系,生成第二映射表,所述第二映射表包括源代码行号与源代码对应的二进制代码的PC之间的映射关系。
进一步的,所述生成第一映射表之后,还包括:
向程序调试器发送所述第一映射表。
进一步的,所述向程序调试器发送所述第一映射表之后,还包括:
接收所述程序调试器发送的PC;
根据所述第二映射表,确定所述PC对应的源代码行号。
第三个方面,本发明实施例提供一种程序调试器,包括:
第一发送模块,用于向目标芯片发送程序调试指令,以使所述目标芯片根据所述程序调试指令运行二进制代码程序;
读取模块,用于在程序运行停止时,读取所述目标芯片当前运行的二进制代码程序的PC;
判断模块,用于判断所述PC是否在第一映射表内,所述第一映射表包括库函数与所述库函数在所述二进制代码程序中的PC之间的映射关系;
第一发送模块,还用于如果所述PC在所述第一映射表内,则重新向所述目标芯片发送程序调试指令,直到所述目标芯片在程序运行停止时的二进制代码程序的PC不在所述第一映射表内为止。
进一步的,所述第一发送模块还包括:
第一接收单元,用于第一发送模块向目标芯片发送程序调试指令之前,接收界面处理装置发送的所述第一映射表,所述第一映射表为所述界面处理装置根据编译过程中生成的调试信息生成的,所述调试信息包括源代码行号与源代码对应的二进制代码的PC之间的对应关系,以及程序指令与当前运行的二进制代码的PC之间的对应关系,其中所述程序指令与二进制代码一一对应。
进一步的,还包括:
第二发送模块,用于如果所述PC不在所述第一映射表内,则向界面处理装置发送所述PC,以使所述界面处理装置根据第二映射表,确定所述PC对应的源代码行号,所述第二映射表包括所述源代码行号与源代码对应的二进制代码的PC之间的映射关系。
第四个方面,本发明实施例提供一种界面处理装置,包括:
编译模块,用于对源代码进行编译,生成二进制代码和调试信息,所述调试信息包括源代码行号与源代码对应的二进制代码的PC之间的对应关系,以及程序指令与当前运行的二进制代码的PC之间的对应关系,其中所述程序指令与二进制代码一一对应;
确定模块,用于根据所述程序指令与当前运行的二进制代码的PC之间的对应关系,确定所述源代码中调用的库函数对应的二进制代码的起始PC和结束PC;
第一生成模块,用于根据各个库函数对应的二进制代码的起始PC和结束PC,生成第一映射表,所述第一映射表包括库函数与所述库函数在所述二进制代码程序中的PC之间的映射关系;
第二生成模块,用于根据源代码行号与源代码对应的二进制代码的PC之间的对应关系,生成第二映射表,所述第二映射表包括源代码行号与源代码对应的二进制代码的PC之间的映射关系。
进一步的,还包括
第三发送模块,用于在第一生成模块生成第一映射表之后,向程序调试器发送所述第一映射表。
进一步的,所述第三发送模块还包括:
第二接收单元,用于第三模块向程序调试器发送所述第一映射表之后,接收所述程序调试器发送的PC;
确定单元,用于根据所述第二映射表,确定所述PC对应的源代码行号。
第五个方面,本发明实施例提供一种程序调试系统,包括:
如上第三个方面任一所述的程序调试器和第四个方面的任一所述的界面处理装置。
本发明实施例提供的程序调试方法、装置及系统,通过向目标芯片发送程序调试指令,在程序停止时,读取目标芯片当前运行的二进制代码程序的PC,判断PC是否在第一映射表内,如果所述PC在所述第一映射表内,则重新向所述目标芯片发送程序调试指令,直到所述目标芯片在程序运行停止时的二进制代码程序的PC不在所述第一映射表内为止,解决了调试过程中程序停止在库函数对应的机器码中的问题,进而能够确定目标芯片运行的二进制机器码与源程序之间的对应关系。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图1为本发明程序调试方法实施例一的流程图。本实施例的执行主体为程序调试器,该程序调试器可以对目标芯片进行实时调试及监控,实现基本的调试命令,本实施例中程序调试器还可以对单片机进行调试。具体的,本实施例包括如下步骤:
步骤101、向目标芯片发送程序调试指令,以使所述目标芯片根据所述程序调试指令运行二进制代码程序。
在本实施例中,程序调试器 向目标芯片发送程序调试指令之前,程序调试器会将界面处理装置编译生成的可执行文件下载到目标芯片中,目标芯片运行的是二进制机器代码,所以可执行文件中的程序是以二进制形式表示的,该可执行文件中包含了用户自己编写的源代码对应的二进制代码以及源代码中调用的库函数对应的二进制代码,其中调用的库函数对应的二进制代码是通过链接方式连接到源代码对应的二进制代码中的。在本实施例中,程序调试器与界面处理装置通过串口、USB等方式进行数据交换,程序调试器与目标芯片通过专用调试线连接。在本实施例中,调试指令包括了单步指令、步越指令或停止运行指令,程序调试器开始调试时,接收界面处理装置发送的调试指令,程序调试器根据接收到的调试指令指示目标芯片根据调试指令运行二进制代码程序。
步骤102、在程序运行停止时,读取所述目标芯片当前运行的二进制代码程序的PC。
本实施例中,目标芯片根据调试指令停止运行时,程序调试器读取目标芯片当前运行的二进制代码程序对应的PC,由于目标芯片无法识别当前运行的二进制代码是用户自己编写的源代码还是源代码调用的库函数对应的二进制代码,所以目标芯片停止运行时,返回的PC可能是源代码对应的二进制代码的PC,也可能是库函数对应的二进制代码的PC,而在现有技术中,如果返回的PC是库函数对应的二进制代码的PC,即程序停止在库函数对应的二进制代码程序中,则界面处理装置根据该PC是无法找到对应的源代码行号的,也就无法显示当前运行的程序在源代码中的位置,如果返回的PC是用户自己编写的源代码对应的二进制代码的PC时,界面处理装置根据该PC能够找到对应的源代码行号信息,也就能够准确显示当前运行的程序在源代码中的位置。
步骤103、判断所述PC是否在第一映射表内,所述第一映射表包括库函数与所述库函数在所述二进制代码程序中的PC之间的映射关系。
本实施例中,程序调试器判断读取的PC是否在第一映射表内,第一映射表包括库函数与所述库函数在所述二进制代码程序中的PC之间的映射关系,具体地,所述库函数在所述二进制代码程序中的PC为库函数在所述二进制代码程序中的起始PC和结束PC的范围,如果读取的PC在库函数对应的二进制代码的起始PC和结束PC的范围内,则执行步骤104。
步骤104、如果所述PC在所述第一映射表内,则重新向所述目标芯片发送程序调试指令,直到所述目标芯片在程序运行停止时的二进制代码程序的PC不在所述第一映射表内为止。
本实施例中,如果读取的PC在第一映射表内,则重新向目标芯片发送调试指令,在该步骤中,重新向目标芯片发送的调试指令为单步指令或步越指令,目标芯片根据单步指令或步越指令继续执行一条指令,接着执行步骤102、步骤103,如果读取的PC还在第一映射表内,则继续执行步骤104,直到目标芯片在程序运行停止时的二进制代码程序的PC不在第一映射表内为止,如果读取的PC不在第一映射表内,即当前运行的二进制代码程序为用户自己编写的源代码程序而不是库函数对应的二进制代码,此时根据PC可以找到对应的源代码行号,进而能够显示当前运行的二进制代码在源代码中的位置。
本发明实施例提供的程序调试方法,通过向目标芯片发送程序调试指令,在程序停止时,读取目标芯片当前运行的二进制代码程序的PC,判断PC是否在第一映射表内,如果所述PC在所述第一映射表内,则重新向所述目标芯片发送程序调试指令,直到所述目标芯片在程序运行停止时的二进制代码程序的PC不在所述第一映射表内为止,解决了调试过程中程序停止在库函数对应的机器码中的问题,进而能够确定目标芯片运行的二进制机器码与源程序之间的对应关系。
图2为本发明程序调试方法实施例二的流程图,如图2所示,本实施例的方法可以包括:
步骤201、接收界面处理装置发送的第一映射表,所述第一映射表为界面处理装置根据编译过程中生成的调试信息生成的,调试信息包括源代码行号与源代码对应的二进制代码的PC之间的对应关系,以及程序指令与当前运行的二进制代码的PC之间的对应关系,其中程序指令与二进制代码是一一对应的。
在本实施例中,程序调试器接收界面处理装置发送的第一映射表并将其保存,第一映射表是界面处理装置根据编译过程生成的调试信息中分析得到所有库函数在二进制代码中的起始PC和结束PC而生成的,其中编译生成的调试信息中包括了源代码行号与源代码对应的二进制代码的PC之间的对应关系,以及程序指令与当前运行的二进制代码的PC之间的对应关系,其中程序指令与二进制代码是一一对应的,分析程序指令,找到所有库函数对应的二进制代码的PC并将其生成第一映射表。
步骤202、向目标芯片发送程序调试指令,以使所述目标芯片根据所述程序调试指令运行二进制代码程序。
在本实施例中,调试指令包括了单步指令、步越指令或停止运行指令,当目标芯片接收到单步指令时,目标芯片执行完一行指令后停止运行,只有再次接收到调试指令才会继续运行程序,当目标芯片接收到步越指令时,根据步越指令不同,运行的程序会执行步入函数或者不步入函数的操作,当正在运行的程序接收到停止运行指令时,该程序会停止运行。
步骤203、在程序运行停止时,读取所述目标芯片当前运行的二进制代码程序的PC。
在本实施例中,目标芯片执行完单步指令、步越指令或停止运行指令而停止时,程序调试器读取目标芯片当前运行的二进制代码程序的PC,
步骤204、判断PC是否在第一映射表内,第一映射表包括库函数与库函数在二进制代码程序中的PC之间的映射关系。
本实施例中,如果PC在第一映射表内,执行步骤205,否则执行步骤206。
步骤205、如果PC在第一映射表内,则重新向所述目标芯片发送程序调试指令,直到所述目标芯片在程序运行停止时的二进制代码程序的PC不在第一映射表内为止。
在本实施例中,PC在第一映射表内,即该PC对应的二进制代码为调用的库函数对应的二进制代码,此时程序调试器不会将该PC发送给界面处理装置,而是重新向目标芯片发送程序调试指令,在本实施例中,重新向目标芯片发送的调试指令为单步指令或步越指令,目标芯片根据单步指令或步越指令继续执行一条指令,接着继续执行步骤203和204,直到读取的PC不在第一映射表内才停止发送调试指令。
步骤206、如果PC不在第一映射表内,向界面处理装置发送所述PC,以使界面处理装置根据第二映射表,确定PC对应的源代码行号,第二映射表包括源代码行号与源代码对应的二进制代码的PC之间的映射关系。
在本实施例中,程序调试器读取的PC不在第一映射表内,即PC对应的二进制代码为用户自己编写的源代码对应的二进制代码而不是库函数对应的二进制代码,此时向界面处理装置发送PC,界面处理装置根据第二映射表,确定PC对应的源代码行号,第二映射表包括源代码行号与源代码对应的二进制代码的PC之间的映射关系。
本发明实施例提供的程序调试方法,通过向目标芯片发送程序调试指令,在程序停止时,读取目标芯片当前运行的二进制代码程序的PC,判断PC是否在第一映射表内,如果所述PC在所述第一映射表内,则重新向所述目标芯片发送程序调试指令,直到所述目标芯片在程序运行停止时的二进制代码程序的PC不在所述第一映射表内为止,解决了调试过程中程序停止在库函数对应的机器码中的问题,进而能够确定目标芯片运行的二进制机器码与源程序之间的对应关系,而且程序调试器只有判断出读取的PC不在第一映射表内时才向界面处理装置发送PC,节省了界面处理装置与程序调试器的通信时间消耗。
图3为本发明程序调试方法实施例三的流程图。本实施例的执行主体为界面处理装置,也可以为集成了编程、编译和调试等功能的其他集成装置,具体的,本实施例包括如下步骤:
步骤301、对源代码进行编译,生成二进制代码和调试信息,所述调试信息包括源代码行号与源代码对应的二进制代码的PC之间的对应关系,以及程序指令与当前运行的二进制代码的PC之间的对应关系,其中程序指令与二进制代码是一一对应的。
在本实施例中,界面处理装置对用户编写的源代码进行编译,生成目标芯片能够运行的二进制代码,在编译过程中生成二进制代码的同时,还会生成很多调试信息,然后由连接程序将调试信息整合起来生成一个调试文件,调试时,可以用该调试文件对程序进行调试,其中调试信息中包括源代码行号与源代码对应的二进制代码的PC之间的对应关系,以及程序指令与当前运行的二进制代码的PC之间的对应关系,除此之外,还包括源代码和二进制代码的类型、变量和函数等信息。
步骤302、根据程序指令与当前运行的二进制代码的PC之间的对应关系,确定所述源代码中调用的库函数对应的二进制代码的起始PC和结束PC。
步骤303、根据各个库函数对应的二进制代码的起始PC和结束PC,生成第一映射表,所述第一映射表包括库函数与所述库函数在所述二进制代码程序中的PC之间的映射关系。
本实施例中,界面处理装置分析编译过程中生成的调试信息,得到所有调用的库函数在二进制代码中的起始PC和结束PC,根据各个库函数对应的二进制代码的起始PC和结束PC生成第一映射表,界面处理装置将生成的第一映射表发送给程序调试器。
步骤304、根据源代码行号与源代码对应的二进制代码的PC之间的对应关系,生成第二映射表,所述第二映射表包括源代码行号与源代码对应的二进制代码的PC之间的映射关系。
在本实施例中,界面处理装置根据调试信息,将源代码行号与源代码对应的二进制代码的PC之间的对应关系生成第二映射表,在本实施例中,界面处理装置会接收程序调试器发送的不在第一映射表内的PC,根据所述第二映射表,确定PC对应的源代码行号。
本发明实施例提供的程序调试方法,通过界面处理装置生成二进制代码和调试信息,根据调试信息生成第一映射表并发送给程序调试器,程序调试器根据读取的PC判断是否在第一映射表内,如果所述PC在所述第一映射表内,则重新向所述目标芯片发送程序调试指令,直到所述目标芯片在程序运行停止时的二进制代码程序的PC不在所述第一映射表内为止,解决了调试过程中程序停止在库函数对应的机器码中的问题,进而能够确定目标芯片运行的二进制机器码与源程序之间的对应关系。
图4为本发明程序调试器一实施例的结构示意图。如图4所示,本实施例提供的程序调试器40包括:第一发送模块401、读取模块402和判断模块403。
其中,第一发送模块401用于向目标芯片发送程序调试指令,以使所述目标芯片根据所述程序调试指令运行二进制代码程序;
读取模块402用于在程序运行停止时,读取所述目标芯片当前运行的二进制代码程序的PC;
判断模块403用于判断所述PC是否在第一映射表内,所述第一映射表包括库函数与所述库函数在所述二进制代码程序中的PC之间的映射关系;
第一发送模块401还用于如果所述PC在所述第一映射表内,则重新向所述目标芯片发送程序调试指令,直到所述目标芯片在程序运行停止时的二进制代码程序的PC不在所述第一映射表内为止。
本实施例的程序调试器,可以用于程序调试方法实施例一的技术方案,其实现原理和技术效果类似,此处不再赘述。
进一步地,在图4实施例的基础上,还包括:
第二发送模块404,用于如果所述PC不在所述第一映射表内,向界面处理装置发送所述PC,以使所述界面处理装置根据第二映射表,确定所述PC对应的源代码行号,所述第二映射表包括源代码行号与源代码对应的二进制代码的PC之间的映射关系。
可选地,第一发送模块401还包括:
第一接收单元4011,用于第一发送模块向目标芯片发送程序调试指令之前,接收界面处理装置发送的所述第一映射表,所述第一映射表为所述界面处理装置根据编译过程中生成的调试信息生成的,所述调试信息包括源代码行号与源代码对应的二进制代码的PC之间的对应关系,以及程序指令与当前运行的二进制代码的PC之间的对应关系,其中程序指令与二进制代码是一一对应的。
本实施例的程序调试器,可以用于程序调试方法实施例二的技术方案,其实现原理和技术效果类似,此处不再赘述。
图5为本发明界面处理装置一实施例的结构示意图。本实施例提供的界面处理装置50包括:编译模块501、确定模块502、第一生成模块503和第二生成模块504。
其中,编译模块501用于对源代码进行编译,生成二进制代码和调试信息,所述调试信息包括源代码行号与源代码对应的二进制代码的PC之间的对应关系,以及程序指令与当前运行的二进制代码的PC之间的对应关系,其中程序指令与二进制代码是一一对应的;
确定模块502用于根据程序指令与当前运行的二进制代码的PC之间的对应关系,确定所述源代码中调用的库函数对应的二进制代码的起始PC和结束PC;
第一生成模块503用于根据各个库函数对应的二进制代码的起始PC和结束PC,生成第一映射表,所述第一映射表包括库函数与所述库函数在所述二进制代码程序中的PC之间的映射关系;
第二生成模块504用于根据源代码行号与源代码对应的二进制代码的PC之间的对应关系,生成第二映射表,所述第二映射表包括源代码行号与源代码对应的二进制代码的PC之间的映射关系。
进一步地,界面处理装置50还包括:第三发送模块505,用于在第一生成模块生成第一映射表之后,向程序调试器发送所述第一映射表。
可选地,第三发送模块505包括第二接收单元5051和确定单元5052。
第二接收单元5051用于第三模块向程序调试器发送所述第一映射表之后,接收所述程序调试器发送的PC;
确定单元5052用于根据所述第二映射表,确定所述PC对应的源代码行号。
本实施例的界面处理装置,可以用于程序调试方法实施例三的技术方案,其实现原理和技术效果类似,此处不再赘述。
图6为本发明程序调试系统一实施例的结构示意图,如图6所示,本实施例的系统包括:程序调试器40及界面处理装置50,其中,程序调试器40可以采用程序调试器一实施例的结构,其对应地,可以执行程序调试方法实施例一和二的技术方案;界面处理装置50可以采用界面处理装置一实施例的结构,其对应地,可以执行程序调试方法实施例三的技术方案,其实现原理和技术效果类似,此处不再赘述。
本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。