发明内容
本发明的主要目的是提供一种可在调试过程中动态设置断点的嵌入式***的在线调试***;
本发明的另一目的是提供一种应用上述嵌入式***的在线调试***对嵌入式***进行调试的在线调试方法。
为实现上述的主要目的,本发明提供的嵌入式***在线调试***包括嵌入式***和调试终端,该嵌入式***与调试终端通过连接设备连接。其中,该调试终端包括用户接口模块、符号处理模块和目标处理模块。用户接口模块接收和解释调试命令,其能根据调试人员的指令设置需要添加新断点的信息,并将调试命令的相关信息发送给符号处理模块,符号处理模块根据这些信息找出调试命令中相应变量或函数的地址等信息,并传送到目标处理模块。
目标处理模块根据用户接口模块发出的信息向被调试程序设置新断点,其包括执行模块和通信模块,其中执行模块执行用户接口模块发出的命令,并根据符号处理模块提供的地址信息向通信模块发出对嵌入式***进行调试的具体命令信息,通信模块将该命令信息发送到连接设备。
嵌入式***包括被调试程序和调试模块,其中被调试程序是在调试前下载到嵌入式设备上,调试模块包括通信模块、命令处理模块和上下文处理模块。通信模块用于接收连接设备发送的命令信息,并将该命令信息传送到命令处理模块,命令处理模块根据该命令信息执行相应的操作。上下文处理模块在被调试程序中断时保存被调试程序当前的运行信息,如各寄存器的值等。
当然,调试终端的目标处理模块中还可以设置栈帧分析模块,栈帧分析模块根据用户接口模块发出的信息和符号处理模块提供的相应地址信息,通过查看嵌入式***中相应函数的地址、栈帧指针、函数返回值等信息分析某一函数的调用关系,并将该调用关系传回用户接口模块,用户接口模块将调用关系显示出来。
由于符号处理模块可以获取各变量、函数的地址等信息,目标处理模块即可实时通过嵌入式***的调试模块对被调试程序进行修改,这样就可以动态的在被调试程序中添加新的断点,大大的方便调试人员的调试工作。并且由于可以动态添加断点,因此动态的单步运行也就可以实现。
同时,由于断点是在调试时动态添加的,因此在被调试程序中只需要设置一个默认断点即可,减少被调试程序占用的存储空间,避免造成存储空间的浪费。
为了实现上述的另一目的,本发明提供的嵌入式***在线调试方法应用在前述的嵌入式***在线调试***中,该调试方法包括以下步骤:
步骤一:在被调试程序中添加默认断点,并将被调试程序下载到嵌入式***中。
步骤二:在嵌入式***中运行被调试程序,被调试程序运行至断点时暂停运行,上下文处理模块保存被调试程序当前的运行信息,即将各参数的值、各寄存器中的值和PC(Program Counter,程序计数器)指针相对位置等信息存储到指定的位置中。
步骤三:调试终端查看和/或修改被调试程序的运行信息,判断是否需要在被调试程序中添加新的断点,若需要,则在被调试程序中添加新的断点,否则,执行下一步。
步骤四:命令处理模块向被调试程序发送继续运行的命令,上下文处理模块恢复被调试程序中断时的运行信息,即将步骤二中被存储的信息还原,被调试程序继续运行。
步骤五:若被调试程序遇到断点,则返回执行步骤二,否则,继续运行被调试程序。
其中在上述步骤三中,添加新的断点时,首先由用户接口模块设置需要添加断点的信息,包括添加断点的位置、断点的类型等,并将这些信息发送至符号处理模块,符号处理模块找出需要添加断点的地址,如断点在需要添加到嵌入式***中的地址等,然后将地址信息发出给执行模块。执行模块接收到用户接口模块发出需要添加断点的信息,并根据符号处理模块提供的地址信息,分析需要读取存储在嵌入式***中哪一地址内的数据,并通过通信模块及连接设备向嵌入式***发出读取存储在该地址内数据的命令信息。调试模块根据该命令信息读取相应数据后返回至调试终端,调试终端将该数据保存起来。然后执行模块再发出改写存储在该地址内数据的命令信息,改写为一个能够引发异常的调试指令。
由上述方法可见,被调试程序运行时遇到断点即暂停运行,并等待调试终端发出调试命令。若调试终端判断需要添加新的断点时即可动态的添加新的断点。这样,不需要预先在被调试程序中设置大量的断点,大大方便调试人员进行调试工作。同时,若需要进行动态单步运行时,只要在需要单步运行的地方设置单步运行的指令即可。
具体实施方式
参见图1,图1是本发明嵌入式***在线调试***实施例的示意框图。调试***由调试终端1、连接设备2和嵌入式***3组成,其中调试终端1通过连接设备2与嵌入式***3连接。
调试终端1包括用户接口模块11、符号处理模块12和目标处理模块13。用户接口模块11是调试终端1与调试人员的接口界面,用于接收和解释调试人员设置的调试命令,包括添加新的断点、查看某一参数的值、查看某一函数在被调试程序中的调用关系等等。同时,用户接口模块11还显示被调试程序当前运行的状态,如程序源代码、PC指针所在行等信息。
符号处理模块12通过解析被调试程序编译时生成的符号表、行号表等调试信息,获取如变量类型、变量地址、函数地址范围、源代码中行起始地址等信息,并根据用户接口模块11发出的信息向目标处理模块13提供相应的信息。
目标处理模块13包括执行模块15、栈帧分析模块16和通信模块17。执行模块15可接收用户接口模块11发出关于调试命令的信息,并接收符号处理模块提供的该调试命令中相应的变量、函数的地址等信息,并根据这些地址信息向通信模块17发出相应的命令信息,通信模块17将该命令信息传送至连接设备2。
栈帧分析模块16主要用于分析被调试程序中各函数的调用关系以及函数的参数、局部变量等信息。栈帧分析模块16需要分析某一函数的调用关系时,需要使用符号处理模块12提供的该函数的起始地址信息、函数的参数地址等从嵌入式***3中获取栈帧指针和栈指针的相对位置、函数的参数返回值等信息来分析函数的调用关系。同时,栈帧分析模块16将分析结果发送的用户接口模块11,用户接口模块11即将该结果显示出来。
嵌入式***3包括被调试程序31和调试模块32,其中被调试程序31在调试前下载到嵌入式***3中,调试模块32根据调试终端1发出的命令信息对被调试程序31进行调试。
调试模块32包括通信模块36、命令处理模块35和上下文处理模块34。通信模块36接收连接设备2传送的命令信息,并将这些命令信息传送至命令处理模块35,命令处理模块35根据这些命令信息执行相应的操作,如读取被调试程序31中某一变量的值、在被调试程序31中添加新的断点等,并在操作完毕后通过通信模块36、连接设备2向调试终端1返回相应的信息,如读取变量的值、操作是否成功等。
上下文处理模块34用于在被调试程序31中断时保存被调试程序31当前的运行信息。被调试程序31运行过程中遇到断点即暂停运行,此时,上下文处理模块34即将被调试模块31当前的运行信息,如各个寄存器中的数据等,存储到指定的位置。当被调试程序31需要继续运行时,上下文处理模块34将这些信息还原,即恢复被调试程序31中断时的运行状态。
使用本发明的嵌入式在线调试***对嵌入式***进行调试的过程如图2所示,图2也是本发明嵌入式***在线调试方法实施例的流程图。进行调试时,首先在被调试程序中添加一个默认断点,然后对被调试程序进行编译,并将编译后的程序下载到嵌入式***中(步骤S1)。然后调试终端将被调试程序编译时生成的调试信息读入,并与嵌入式***建立通信。
接着,在嵌入式***中运行被调试程序(步骤S2),并将被调试程序的运行状态信息在调试终端的用户接口模块上显示出来。嵌入式***判断被调试程序运行时是否遇到断点(步骤S3),若没有遇到断点,则进一步判断调试是否结束(步骤S4),如嵌入式***断电等,若调试结束,则结束调试,若调试没有结束,则返回步骤S2,继续运行被调试程序。
由于被调试程序中设置有默认断点,被调试程序运行至默认断点时将暂停运行。此时,上下文处理模块保存被调试程序当前的运行信息(步骤S5),即将被调试程序中各寄存器的值等存储到一个指定位置。
然后,调试终端查看被调试程序的运行信息(步骤S6),这些运行信息包括各寄存器的值等,调试人员通过判断这些信息判断被调试程序运行是否正常,从而判断是否需要添加新的断点(步骤S7),若需要添加新的断点,调试终端将向调试模块发出添加新断点的命令(步骤S8),如不需要添加新的断点,则直接执行步骤S9。
调试终端在被调试程序中设置断点后,调试模块向被调试程序发出继续运行的命令。此时,上下文处理模块恢复被调试程序中断时的运行信息(步骤S9),也就是将被调试程序中断时各寄存器的值等信息写回原来的位置,使被调试程序的运行信息与中断时一致。这样,被调试程序就可以在原来的运行环境中继续运行。当然,若调试人员在调试时改变被调试程序的运行环境,如改变某一参数的值等,则中断结束后,被调试程序在新的运行环境中运行。
被调试程序在运行时,嵌入式***将继续判断被调试程序是否遇到断点(返回步骤S3),并以此循环直至结束。
由于被调试程序中的断点可以被动态地设置,调试人员便不需要预先将大量断点设置在被调试程序中。调试人员可以在调试过程中根据被调试程序的运行情况判断是否需要添加新的断点,并判断添加新断点的位置,这样大大增加了调试工作的灵活性,给调试人员带来极大的方便。
同时,若调试人员需要让被调试程序实现动态单步运行,可由调试终端向嵌入式***发送汇编级的单步运行命令,嵌入式***中的命令处理模块处理该命令时,计算出PC指针下一个需要执行的机器指令地址,并在该地址上设置一个断点,然后让被调试程序继续运行。当被调试程序运行至该地址时即中断,并在中断后恢复原来的程序,同时将PC指针当前位置返回调试终端,调试终端判断源代码是否运行至下一行,若没有则继续发送汇编级的单步运行命令。这样,被调试程序运行下一条指令后将再次暂停运行,调试人员即可检验嵌入式***是否正确执行了该指令。
并且,由于调试人员无需在被调试程序预设大量断点,使被调试程序占用的存储空间大大减少,避免了存储空间的浪费。
在介绍本发明嵌入式***在线调试方法的调试流程后,下面介绍调试过程中调试终端是如何查看被调试程序中断时的状态信息的。
参见图3,图3是本发明嵌入式***在线调试方法实施例中查看被调试程序运行信息的流程图。通常,调试人员需要查看被调试程序中断时某一变量的值。当被调试程序遇到断点暂停运行后,调试人员通过调试终端的用户接口模块设置需要查看变量的变量名信息(步骤S11),并将该变量名的信息传送到符号处理模块和执行模块。
符号处理模块接收到用户接口模块发出的信息后,根据被调试程序编译时生成的调试信息找出该变量在嵌入式***中的地址(步骤S12),并将该地址信息发送至执行模块。执行模块根据符号处理模块的地址信息,获知需要读取嵌入式***中存储在哪一地址内的数据,即发出读取存储在该地址内数据的命令信息(步骤S13),并将该命令信息发送到调试终端的通信模块,并通过连接设备将该命令信息传送到嵌入式***的通信模块中。
嵌入式***的通信模块接收到命令信息后,将命令信息传送到命令处理模块,命令处理模块即根据该命令信息读取存储在该地址内的数据,并将数据传回用户接口模块(步骤S14),用户接口模块接收该数据后并将数据显示出来(步骤S15)。这样,调试人员即可查看到该变量的值,从而判断被调试程序是否存在问题。
修改某一变量的值的过程与上述查看某一变量值的过程类似。调试人员需要修改某一变量的值时,也是通过用户接口模块设置需要修改变量的信息,符号处理模块找到该变量的地址后,执行模块即可发出改写存储在该地址内数据的命令信息,嵌入式***在接收到该命令信息后执行相应的操作,并向用户接口模块返回修改成功或失败的信息。
当调试人员查看或修改存储在某一寄存器的值时,只要通过用户接口模块设置该寄存器名等信息,执行模块即通过通信模块发出查看或修改该寄存器值的命令。嵌入式***执行相关操作后,向用户接口模块返回该寄存器的值或修改是否成功的信息。
在嵌入式***的在线调试方法中,调试终端查看嵌入式***的运行信息后,往往需要在被调试程序中添加新的断点。参见图4,图4是本发明嵌入式***的在线调试方法的添加新断点的流程图。
添加新断点时,调试人员通过用户接口模块设置需要添加新断点的信息(步骤S21),包括断点添加的位置、断点类型等。例如,用户接口模块设置需要在被调试程序的第32行添加一新的断点,然后,将这一信息发送到符号处理模块和执行模块。
符号处理模块接收到该信息后,通过被调试程序编译时生成的调试信息找出需要添加断点的地址(步骤S22),如找出被调试程序第32行所对应的嵌入式***内的存储地址,例如该地址为0X1844,符号处理模块即将该地址发送给执行模块。
然后,执行模块根据符号处理模块提供的地址,发出读取存储在嵌入式***内地址为0X1844的数据的命令信息(步骤S23),并通过通信模块和连接设备将该命令信息传送至嵌入式***。
嵌入式***的通信模块接收到该命令信息后传送至命令处理模块,命令处理模块即读取存储在地址0X1844内的数据,并将该数据传送回用户接口模块。用户接口模块接收到该数据后,将该数据保存至指定的位置(步骤S24)。
接着,执行模块再发出改写地址0X1844内的命令信息(步骤S25),将一调试指令写入到该地址中,并将这一命令信息发送至嵌入式***。嵌入式***接收该命令信息后,将存储地址0X1844内的数据改写,并向用户接口模块返回是否改写成功的信息。
用户接口模块接收到该返回信息(步骤S26)后,判断改写是否成功(步骤S27),若改写成功,则结束,若改写失败,嵌入式***向用户接口模块返回改写失败的信息,用户接口模块即可接收该返回信息(步骤S28),并显示出来,调试人员即可知道改写失败。
这样,当被调试程序继续运行并遇到该调试指令时即引发异常,被调试程序暂停运行,即成功添加断点。
当被调试程序需要继续运行时,上下文处理模块将恢复被调试程序中断时的运行信息。但是,由于被调试程序中断点处的原有程序被修改,将造成被调试程序无法正常运行下去,因此,在恢复被调试程序的运行信息时,还需要将断点处的原数据写回被调试程序中。
本实施例中,断点处地址为0X1844,该地址内的原数据在添加断点时已经被用户接口模块保存,因此,用户接口模块即可方便的将原数据写回地址0X1844内,被调试程序即可继续运行。
同时,本发明的嵌入式***在线调试方法还可以查看嵌入式***内函数的调用关系。查看函数调用关系时,调试人员首先通过用户接口模块设置需要查看函数的信息,并将该信息发送至符号处理模块和栈帧分析模块。符号处理模块接收到该信息后,找出该函数的起始地址、函数的参数地址等信息,并发送至栈帧分析模块。栈帧分析模块根据这些地址信息,通过通信模块和连接设备向嵌入式***发送读取相应的栈帧指针和栈指针的相对位置等信息的命令。在嵌入式***将相应的信息返回至栈帧分析模块后,栈帧分析模块即根据这些信息,并结合函数参数和返回值的传递方式等分析函数的调用关系。分析完毕后,将分析结果发送至用户接口模块,用户接口模块将结果显示出来,调试人员即可查看到函数的调用关系,当然,也可以利用该函数的调用关系作为分析被调试程序运行是否存在问题的依据。
由此可见,本发明的嵌入式***在线调试方法可在被调试程序调试过程中动态地设置断点,使调试人员方便地查看被调试程序任一时刻的运行状况,并可根据需要实现单步运行,使调试变得更加灵活方便。同时,调试人员无需在被调试程序中预设大量的断点,减少被调试程序占用的存储空间。
嵌入式***的在线调试***和调试方法一个具体应用就是智能卡的调试,如SIM卡的调试。需要调试SIM卡的程序时,调试终端可以是调试计算机,嵌入式***是SIM卡,而读卡器则作为两者的连接设备。
当然,本发明不仅限于SIM卡的调试,其它的嵌入式***,如单片机等,可以使用本发明进行调试。若使用在其它嵌入式***的调试中,则调试人员应根据不同的嵌入式***选择相应的调试终端和连接设备。
最后,需要强调的是,本发明不限于上述实施方式,诸如默认断点设置位置的改变、连接设备的改变等微小变化也应该包括在本发明的保护范围内。