用于调试目标程序代码的方法及装置、电子设备转让专利
申请号 : CN202111631234.2
文献号 : CN113986771B
文献日 : 2022-04-08
发明人 : 不公告发明人
申请人 : 北京壁仞科技开发有限公司 , 上海壁仞智能科技有限公司
摘要 :
权利要求 :
1.一种用于调试由协处理器执行的目标程序代码的方法,包括:调试主程序获取调试过程代码,其中,所述调试过程代码包括所述目标程序代码以及插入到所述目标程序代码中至少一个调试位置的至少一个调试指令,所述调试主程序运行在主处理器中,所述主处理器不同于所述协处理器;
将所述调试过程代码以及调试辅助程序上载至所述协处理器,且使所述协处理器执行所述调试过程代码;
在所述协处理器运行所述调试过程代码的过程中,响应于执行所述至少一个调试指令,从所述调试过程代码跳转以使所述协处理器执行所述调试辅助程序,并由所述调试辅助程序返回所述调试过程代码当前的运行状态信息;
其中,所述方法还包括:
所述调试辅助程序向所述调试主程序发送第一通知信息,并基于轮询机制等待获取由所述调试主程序发送的第二通知信息,其中,所述第一通知信息表示所述至少一个调试指令被执行,所述第二通知信息表示所述调试主程序响应了所述第一通知信息;
其中,在调试由所述协处理器执行的所述目标程序代码的过程中,所述协处理器不使用硬件中断指令。
2.根据权利要求1所述的方法,还包括:所述调试主程序基于所述轮询机制查询获取由所述调试辅助程序发送的所述第一通知信息。
3.根据权利要求2所述的方法,其中,所述协处理器包括存储空间,所述存储空间配置为可以从所述协处理器外部和所述协处理器内部进行访问,所述调试辅助程序向所述调试主程序发送所述第一通知信息,并基于所述轮询机制等待获取由所述调试主程序发送的所述第二通知信息,包括:所述调试辅助程序将存储在所述存储空间中的第一信号位设置为有效值;
所述调试辅助程序轮询存储在所述存储空间中的第二信号位并判断所述第二信号位是否为有效值,响应于所述第二信号位为有效值,确定获取到所述第二通知信息。
4.根据权利要求3所述的方法,其中,所述调试主程序基于所述轮询机制查询获取由所述调试辅助程序发送的所述第一通知信息,包括:所述调试主程序轮询所述第一信号位,并判断所述第一信号位是否为有效值,响应于所述第一信号位为有效值,确定获取到所述第一通知信息。
5.根据权利要求4所述的方法,其中,由所述调试辅助程序返回所述调试过程代码当前的运行状态信息,包括:
所述调试辅助程序将所述调试过程代码当前的运行状态信息存储在所述存储空间中。
6.根据权利要求5所述的方法,还包括:响应于获取到所述第一通知信息,所述调试主程序访问所述存储空间以获取所述运行状态信息,并将所述第一信号位设置为无效值。
7.根据权利要求6所述的方法,还包括:基于所述运行状态信息,所述调试主程序执行打印操作和/或接收指令操作。
8.根据权利要求7所述的方法,其中,所述调试位置表示调试过程代码的断点,基于所述运行状态信息,所述调试主程序执行所述打印操作和/或所述接收指令操作,包括:
判断所述调试指令所在的调试位置表示的断点是否命中;
响应于所述断点命中,接收用户输入的指令以作为待执行指令;
响应于所述断点未命中,将继续执行指令设置为所述待执行指令;
响应于所述待执行指令为打印指令,根据标准调试文件打印所述运行状态信息后继续接收所述用户输入的指令;
响应于所述待执行指令不是所述打印指令,将所述待执行指令存入所述存储空间后向所述调试辅助程序发送所述第二通知信息。
9.根据权利要求8所述的方法,其中,判断所述调试指令所在的调试位置表示的断点是否命中,包括:
响应于所述断点处于启用状态且不是条件断点,确定所述断点命中;
响应于所述断点处于所述启用状态且是所述条件断点,并且所述条件断点对应的条件成就,确定所述断点命中。
10.根据权利要求8所述的方法,其中,向所述调试辅助程序发送所述第二通知信息,包括:
所述调试主程序将存储在所述存储空间中的所述第二信号位设置为有效值。
11.根据权利要求10所述的方法,还包括:响应于获取到所述第二通知信息,所述调试辅助程序访问所述存储空间以获取所述待执行指令,并将所述第二信号位设置为无效值。
12.根据权利要求11所述的方法,还包括:根据所述待执行指令的类型,确定是否从所述调试辅助程序跳转以使所述协处理器恢复执行所述调试过程代码。
13.根据权利要求12所述的方法,其中,根据所述待执行指令的类型,确定是否从所述调试辅助程序跳转以使所述协处理器恢复执行所述调试过程代码,包括:响应于所述待执行指令为所述继续执行指令或单步执行指令,从所述调试辅助程序跳转至所述调试过程代码,并向所述调试主程序发送第三通知信息,其中,所述第三通知信息表示所述调试辅助程序响应了所述待执行指令;
响应于所述待执行指令不是所述继续执行指令且不是所述单步执行指令,执行所述待执行指令后向所述调试主程序发送所述第三通知信息,并基于所述轮询机制获取由所述调试主程序发送的所述第二通知信息。
14.根据权利要求13所述的方法,其中,向所述调试主程序发送所述第三通知信息,包括:
所述调试辅助程序将存储在所述存储空间中的第三信号位设置为有效值。
15.根据权利要求14所述的方法,还包括:所述调试主程序基于所述轮询机制查询获取由所述调试辅助程序发送的所述第三通知信息。
16.根据权利要求15所述的方法,其中,所述调试主程序基于所述轮询机制查询获取由所述调试辅助程序发送的所述第三通知信息,包括:所述调试主程序轮询所述第三信号位,并判断所述第三信号位是否为有效值,响应于所述第三信号位为有效值,确定获取到所述第三通知信息。
17.根据权利要求16所述的方法,还包括:响应于获取到所述第三通知信息,根据所述待执行指令的类型,确定所述调试主程序的执行分支。
18.根据权利要求17所述的方法,其中,根据所述待执行指令的类型,确定所述调试主程序的执行分支,包括:
判断所述待执行指令是否为所述继续执行指令或所述单步执行指令;
响应于所述待执行指令是所述继续执行指令或所述单步执行指令,基于所述轮询机制获取由所述调试辅助程序发送的所述第一通知信息;
响应于所述待执行指令不是所述继续执行指令且不是所述单步执行指令,继续接收所述用户输入的指令。
19.根据权利要求1‑18任一所述的方法,还包括:响应于用户输入的指令为单步执行指令,基于标准调试文件,以所述目标程序代码中对应于目标程序下一行语句的代码处作为所述调试位置,插入所述调试指令,其中,所述调试位置表示的断点默认为启用状态。
20.根据权利要求1‑18任一所述的方法,还包括:以所述目标程序代码中对应于目标程序每一行语句的代码处作为所述调试位置,插入所述调试指令,并且根据预设状态表设置各个调试位置表示的断点是否为启用状态。
21.根据权利要求20所述的方法,其中,所述预设状态表记录各个调试位置表示的断点的状态,需要进行调试的调试位置表示的断点为启用状态。
22.根据权利要求20所述的方法,还包括:响应于用户输入的指令为单步执行指令,基于标准调试文件,将所述目标程序代码中对应于所述目标程序下一行语句的代码处所对应的调试位置表示的断点更新为启用状态。
23.根据权利要求1‑18任一所述的方法,其中,所述协处理器包括图形处理器和/或通用图形处理器。
24.一种用于调试由协处理器执行的目标程序代码的方法,用于运行在主处理器中的系统侧,所述主处理器不同于所述协处理器,其中,所述方法包括:获取调试过程代码,其中,所述调试过程代码包括所述目标程序代码以及插入到所述目标程序代码中至少一个调试位置的至少一个调试指令;
将所述调试过程代码以及调试辅助程序上载至所述协处理器,从而使所述协处理器执行所述调试过程代码;
获取所述调试辅助程序返回的所述调试过程代码当前的运行状态信息,其中,所述协处理器运行所述调试过程代码的过程中,响应于执行所述至少一个调试指令,从所述调试过程代码跳转以执行所述调试辅助程序;
其中,所述方法还包括:
运行在所述主处理器中的调试主程序基于轮询机制等待获取由所述调试辅助程序发送的第一通知信息,并发送第二通知信息,其中,所述第一通知信息表示所述至少一个调试指令被执行,所述第二通知信息表示所述调试主程序响应了所述第一通知信息;
其中,在调试由所述协处理器执行的所述目标程序代码的过程中,所述协处理器不使用硬件中断指令。
25.一种用于调试由协处理器执行的目标程序代码的方法,用于所述协处理器,包括:接收调试过程代码,其中,所述调试过程代码包括所述目标程序代码以及插入到所述目标程序代码中至少一个调试位置的至少一个调试指令,所述调试过程代码由运行在主处理器中的调试主程序发送,所述主处理器不同于所述协处理器;
接收调试辅助程序;
运行所述调试过程代码,响应于执行所述至少一个调试指令,从所述调试过程代码跳转以执行所述调试辅助程序,并由所述调试辅助程序返回所述调试过程代码当前的运行状态信息;
其中,所述方法还包括:
所述调试辅助程序向所述调试主程序发送第一通知信息,并基于轮询机制等待获取由所述调试主程序发送的第二通知信息,其中,所述第一通知信息表示所述至少一个调试指令被执行,所述第二通知信息表示所述调试主程序响应了所述第一通知信息;
其中,在调试由所述协处理器执行的所述目标程序代码的过程中,所述协处理器不使用硬件中断指令。
26.一种用于调试由协处理器执行的目标程序代码的装置,包括:代码获取单元,配置为由调试主程序获取调试过程代码,其中,所述调试过程代码包括所述目标程序代码以及插入到所述目标程序代码中至少一个调试位置的至少一个调试指令,所述调试主程序运行在主处理器中,所述主处理器不同于所述协处理器;
上载单元,配置为将所述调试过程代码以及调试辅助程序上载至所述协处理器;
调试辅助单元,配置为在所述协处理器执行所述调试过程代码的过程中,响应于执行所述至少一个调试指令,从所述调试过程代码跳转,并返回所述调试过程代码当前的运行状态信息;
其中,所述调试辅助单元还配置为:由所述调试辅助程序向所述调试主程序发送第一通知信息,并基于轮询机制等待获取由所述调试主程序发送的第二通知信息,其中,所述第一通知信息表示所述至少一个调试指令被执行,所述第二通知信息表示所述调试主程序响应了所述第一通知信息;
其中,在调试由所述协处理器执行的所述目标程序代码的过程中,所述协处理器不使用硬件中断指令。
27.一种电子设备,包括根据权利要求26所述的用于调试由协处理器执行的目标程序代码的装置。
说明书 :
用于调试目标程序代码的方法及装置、电子设备
技术领域
背景技术
统会提供Debugger程序,Debugger程序通过提供逐条执行代码、设置程序断点以及检查断
点处变量和内存等功能,帮助程序开发人员跟踪代码运行流程,定位程序异常点。
发明内容
以及插入到所述目标程序代码中至少一个调试位置的至少一个调试指令;将所述调试过程
代码以及调试辅助程序上载至所述协处理器,且使所述协处理器执行所述调试过程代码;
在所述协处理器运行所述调试过程代码的过程中,响应于执行所述至少一个调试指令,从
所述调试过程代码跳转以使所述协处理器执行所述调试辅助程序,并由所述调试辅助程序
返回所述调试过程代码当前的运行状态信息。
中,所述第一通知信息表示所述至少一个调试指令被执行,所述第二通知信息表示所述调
试主程序响应了所述第一通知信息。
述调试主程序发送所述第一通知信息,并基于所述轮询机制等待获取由所述调试主程序发
送的所述第二通知信息,包括:所述调试辅助程序将存储在所述存储空间中的第一信号位
设置为有效值;所述调试辅助程序轮询存储在所述存储空间中的第二信号位并判断所述第
二信号位是否为有效值,响应于所述第二信号位为有效值,确定获取到所述第二通知信息。
信号位,并判断所述第一信号位是否为有效值,响应于所述第一信号位为有效值,确定获取
到所述第一通知信息。
信息存储在所述存储空间中。
值。
括:判断所述调试指令所在的调试位置表示的断点是否命中;响应于所述断点命中,接收用
户输入的指令以作为待执行指令;响应于所述断点未命中,将继续执行指令设置为所述待
执行指令;响应于所述待执行指令为打印指令,根据标准调试文件打印所述运行状态信息
后继续接收所述用户输入的指令;响应于所述待执行指令不是所述打印指令,将所述待执
行指令存入所述存储空间后向所述调试辅助程序发送所述第二通知信息。
中;响应于所述断点处于所述启用状态且是所述条件断点,并且所述条件断点对应的条件
成就,确定所述断点命中。
值。
待执行指令为所述继续执行指令或单步执行指令,从所述调试辅助程序跳转至所述调试过
程代码,并向所述调试主程序发送第三通知信息,其中,所述第三通知信息表示所述调试辅
助程序响应了所述待执行指令;响应于所述待执行指令不是所述继续执行指令且不是所述
单步执行指令,执行所述待执行指令后向所述调试主程序发送所述第三通知信息,并基于
所述轮询机制获取由所述调试主程序发送的所述第二通知信息。
信号位,并判断所述第三信号位是否为有效值,响应于所述第三信号位为有效值,确定获取
到所述第三通知信息。
行指令;响应于所述待执行指令是所述继续执行指令或所述单步执行指令,基于所述轮询
机制获取由所述调试辅助程序发送的所述第一通知信息;响应于所述待执行指令不是所述
继续执行指令且不是所述单步执行指令,继续接收所述用户输入的指令。
所述调试位置,插入所述调试指令,其中,所述调试位置表示的断点默认为启用状态。
各个调试位置表示的断点是否为启用状态。
所对应的调试位置表示的断点更新为启用状态。
码以及插入到所述目标程序代码中至少一个调试位置的至少一个调试指令;将所述调试过
程代码以及调试辅助程序上载至所述协处理器,从而使所述协处理器执行所述调试过程代
码;获取所述调试辅助程序返回的所述调试过程代码当前的运行状态信息,其中,所述协处
理器运行所述调试过程代码的过程中,响应于执行所述至少一个调试指令,从所述调试过
程代码跳转以执行所述调试辅助程序。
程序代码以及插入到所述目标程序代码中至少一个调试位置的至少一个调试指令;接收调
试辅助程序;运行所述调试过程代码,响应于执行所述至少一个调试指令,从所述调试过程
代码跳转以执行所述调试辅助程序,并由所述调试辅助程序返回所述调试过程代码当前的
运行状态信息。
标程序代码以及插入到所述目标程序代码中至少一个调试位置的至少一个调试指令;上载
单元,配置为将所述调试过程代码以及调试辅助程序上载至所述协处理器;调试辅助单元,
配置为在所述协处理器执行所述调试过程代码的过程中,响应于执行所述至少一个调试指
令,从所述调试过程代码跳转,并返回所述调试过程代码当前的运行状态信息。
附图说明
具体实施方式
开的一部分实施例,而不是全部的实施例。基于所描述的本公开的实施例,本领域普通技术
人员在无需创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。
不表示任何顺序、数量或者重要性,而只是用来区分不同的组成部分。同样,“一个”、“一”或
者“该”等类似词语也不表示数量限制,而是表示存在至少一个。“包括”或者“包含”等类似
的词语意指出现该词前面的元件或者物件涵盖出现在该词后面列举的元件或者物件及其
等同,而不排除其他元件或者物件。“连接”或者“相连”等类似的词语并非限定于物理的或
者机械的连接,而是可以包括电性的连接,不管是直接的还是间接的。“上”、“下”、“左”、
“右”等仅用于表示相对位置关系,当被描述对象的绝对位置改变后,则该相对位置关系也
可能相应地改变。
Trap指令可以暂停当前用户程序并转入相应的异常处理程序。利用Debugger程序实现调试
通常需要硬件Trap指令和操作系统的支持。
跟踪和控制子进程(也即用户程序)的执行,并且检查和更改子进程内存和寄存器值。例如,
Debugger程序首先把需要设置断点的位置处的指令替换为INT 3指令,然后运行子进程,当
子进程执行到INT 3指令后会触发中断,操作系统内核暂停子进程并发送SIGTRAP信号。
Debugger程序截获该信号并判断是否断点命中,如果命中,则恢复被替换的指令并等待用
户输入,此时便可以通过Ptrace提供的一系列请求方法检查或更改断点处的实时环境,最
后通过Ptrace恢复子进程的运行。INT 3指令也属于Trap指令,是一种硬件指令。一些GPU也
提供了类似INT 3的Trap指令,可以暂停内核代码的运行并触发系统侧(Host侧)的中断。
的要求,过度依赖硬件指令,增加了实现调试的难度。
图形处理器的硬件条件要求低,不依赖特定硬件指令的支持,适用范围广。
到目标程序代码中至少一个调试位置的至少一个调试指令;将调试过程代码以及调试辅助
程序上载至协处理器,且使协处理器执行调试过程代码;在协处理器运行调试过程代码的
过程中,响应于执行至少一个调试指令,从调试过程代码跳转以使协处理器执行调试辅助
程序,并由调试辅助程序返回调试过程代码当前的运行状态信息。
备包括主处理器110和协处理器120,主处理器110与协处理器120通信连接。例如,主处理器
110可以为CPU,该电子设备的操作系统以及主要的程序进程运行在主处理器110中。例如,
协处理器120可以为GPU,协处理器120加载来自主处理器110的程序并运行,同时将运行结
果返回给主处理器110。例如,协处理器120可以作为主处理器110的加速单元,或者作为由
主处理器110管理的专用计算单元,或者还可以起到其他适用的功能和作用,本公开的实施
例对此不作限制。例如,协处理器120不限于为GPU,还可以为其他任意适用的具有运算能力
的装置,例如通用图形处理器(General‑purpose Computing on Graphics Processing
Unit,GPGPU)等,这可以根据实际需求而定,本公开的实施例对此不作限制。
合本公开实施例提供的用于调试由协处理器执行的目标程序代码的方法进行详细说明,此
处不再赘述。
程代码当前的运行状态信息。
程序,调试主程序可以利用操作系统提供的与Debugger有关的功能接口,从而提供调试功
能。
如ELF文件)。为了实现调试,需要提前在目标程序代码中至少一个调试位置插入至少一个
调试指令。例如,调试位置表示调试过程代码的断点,根据程序开发人员的需要而确定,调
试位置可以为目标程序代码中的任意位置。调试指令可以被称为Call Trap Handler指令,
用于在执行时使进程跳转。例如,调试指令的类型可以是Call指令、branch指令,或者也可
以是其他类型的能够实现进程跳转的指令,本公开的实施例对此不作限制。例如,调试指令
可以与通常的计算机系统中的Trap指令不同。
handler,用于在协处理器120中被调用以帮助实现程序调试。例如,调试过程代码被上载至
协处理器120之后便开始执行,而调试辅助程序被上载至协处理器120之后并不直接开始执
行,而是处于等待状态。例如,将调试过程代码以及调试辅助程序上载至协处理器120的方
式可以采用通常的CPU与GPU之间的加载方式,此处不再详述。
助程序,由调试辅助程序返回调试过程代码当前的运行状态信息。例如,调试辅助程序开始
执行后,会与运行在主处理器110中的调试主程序交互,通过调试辅助程序与调试主程序之
间的配合与交互,从而可以使调试主程序获取调试过程代码当前的运行状态信息(例如内
存和寄存器值等),并且实现调试功能。
程序调试,而无需使用硬件中断指令(例如Trap指令)。这对GPU/GPGPU的硬件条件要求低,
不依赖特定硬件指令的支持,适用范围广。即使在GPU/GPGPU架构缺少Trap指令的情况下,
本公开实施例提供的方法仍然能够实现GPU/GPGPU的程序调试,为GPU/GPGPU程序的开发与
调试提供了极大的便利。
一步包括步骤S14‑S21。例如,图3中的步骤S11‑S13与图2中的步骤S11‑S13基本相同,此处
不再赘述。
会向调试主程序发送第一通知信息。该第一通知信息表示至少一个调试指令被执行,也即,
通过第一通知信息告知调试主程序在协处理器120中运行的调试过程代码已经执行到调试
指令,并且跳转至调试辅助程序。
第二通知信息,则会一直基于轮询机制等待接收第二通知信息;如果调试辅助程序获取到
第二通知信息,则会进行后续操作。通过这种方式,可以使调试辅助程序陷入循环,从而暂
停调试过程代码的执行。
系统侧的主处理器110访问该存储空间。例如,在一些示例中,该存储空间可以为设置在协
处理器120中的内存,例如高带宽内存(High Bandwidth Memory,HBM),该高带宽内存可以
在协处理器120中访问,也可以从系统侧的主处理器110访问。当然,本公开的实施例不限于
此,存储空间可以为任意适用的存储装置,不限于HBM,这可以根据实际需求而定,本公开的
实施例对此不作限制。
目的。例如,在一些示例中,第一信号位和第二信号位可以分别为1位二进制数,“1”为有效
值,“0”为无效值。当然,本公开的实施例不限于此,可以采用任意的数据类型和数据位数来
表示信号位,这可以根据实际需求而定。
息的目的。
一定条件下,主处理器110中的调试主程序会将存储空间中的第二信号位设置为有效值,从
而便于协处理器120中的调试辅助程序查询,以达到传递第二通知信息的目的。关于传递第
二通知信息的相关说明,将在后文描述,此处不再赘述。
行状态信息存储在存储空间中。例如,运行状态信息可以包括协处理器120中的寄存器值和
栈内容,这些寄存器值和栈内容可以反映调试过程代码的当前运行状态,程序开发人员可
以根据这些寄存器值和栈内容判断程序是否需要修改以及如何修改,从而实现程序调试。
需要说明的是,运行状态信息不限于为寄存器值和栈内容,还可以为任意的需要使用的、可
以反映代码运行状态的信息,本公开的实施例对此不作限制。
第一通知信息。例如,在一些示例中,步骤S15进一步包括:调试主程序轮询第一信号位,并
判断第一信号位是否为有效值,响应于第一信号位为有效值,确定获取到第一通知信息。如
果调试主程序没有获取到第一通知信息,则会一直基于轮询机制等待接收第一通知信息;
如果调试主程序获取到第一通知信息,则表示协处理器120中运行的调试过程代码已经执
行到调试指令并且跳转至调试辅助程序,因此调试主程序会进行后续操作。
(例如在调试辅助程序将第一信号位设置为有效值之前),调试辅助程序会将调试过程代码
当前的运行状态信息存储在存储空间中。因此在步骤S16中,在调试主程序获取到第一通知
信息后,调试主程序通过访问存储空间可以读取到运行状态信息,然后将第一信号位设置
为无效值。
骤S171可以进一步包括:响应于断点处于启用状态且不是条件断点,确定断点命中;响应于
断点处于启用状态且是条件断点,并且条件断点对应的条件成就,确定断点命中。例如,当
某一断点不是条件断点时,则不需要判断对应的条件是否成就(条件是否满足),只需要该
断点处于启用状态(有效状态),则可以确定该断点命中,反之则未命中。如果某一断点是条
件断点,则不仅需要判断该断点是否处于启用状态,还需要判断对应的条件是否成就,当该
断点对应的条件成就(条件满足)并且该断点处于启用状态时,则确定该断点命中,反之则
未命中。
待执行指令。
令可以为continue指令,continue指令是程序调试过程中常用的一类指令。
指令,print指令是程序调试过程中常用的一类指令。例如,标准调试文件为DWARF信息文
件,是一种广泛应用的标准调试格式,其包含了源代码中变量、类型、函数等对象到硬件底
层存储的对应关系,DWARF信息文件由编译器产生且用于高级语言调试。具体地,DWARF信息
文件包含高级语言的代码行与可执行二进制文件中的指令行之间的映射关系,并且还可以
包含变量与寄存器之间的映射关系。
显示屏上、写入到指定的存储位置、传输到指定的接口程序、或者通过打印机打印等,可以
采用任意适用的方式输出信息,本公开的实施例对此不作限制。在打印运行状态信息之后,
又继续接收用户输入的指令。
一通知信息,也即,通过第二通知信息告知调试辅助程序在主处理器110中运行的调试主程
序已经读取了运行状态信息并且已将待执行指令存入了存储空间。
制等待获取由调试主程序发送的第二通知信息,例如轮询第二信号位并判断第二信号位是
否为有效值。如果调试辅助程序没有获取到第二通知信息(第二信号位一直为无效值),则
会一直基于轮询机制等待接收第二通知信息;如果调试辅助程序获取到第二通知信息(第
二信号位为有效值),则会进行后续操作。
此,可以将待执行指令从主处理器110传递至协处理器120,从而实现待执行指令的传递。
以进一步包括如下操作。
通知信息。
发送第三通知信息。例如,单步执行指令为next指令,next指令是程序调试过程中常用的一
类指令。第三通知信息表示调试辅助程序响应了待执行指令,也即,在该情形下,通过第三
通知信息告知调试主程序协处理器120已经跳转至调试过程代码。
号位可以为1位二进制数,“1”为有效值,“0”为无效值。当然,本公开的实施例不限于此,可
以采用任意的数据类型和数据位数来表示第三信号位,这可以根据实际需求而定。例如,向
调试主程序发送第三通知信息可以包括:调试辅助程序将存储在存储空间中的第三信号位
设置为有效值。由此,可以实现第三通知信息的传递。
存储空间中指定三个不同的存储位置(也即,指定三个不同的地址),以分别存储第一信号
位、第二信号位、第三信号位。调试主程序和调试辅助程序可以分别到指定的存储位置查询
第一信号位、第二信号位、第三信号位,从而分别实现第一通知信息、第二通知信息、第三通
知信息的传递。例如,本公开的实施例中,调试主程序和调试辅助程序通过轮询第一信号
位、第二信号位、第三信号位,从而建立实时交流协议。
知信息,然后开始基于轮询机制获取由调试主程序发送的第二通知信息,也即,轮询第二信
号位。第三通知信息表示调试辅助程序响应了待执行指令,也即,在该情形下,通过第三通
知信息告知调试主程序协处理器120已经执行了该待执行指令。例如,待执行指令可以是除
了continue指令和next指令以外的其他任意类型的指令,协处理器120根据待执行指令的
类型执行该待执行指令即可。例如,在一些示例中,待执行指令可以是更改内存和寄存器值
的指令,该指令可以根据用户的设置更改内存和寄存器值,从而便于用户进行程序调试。
号位,并判断第三信号位是否为有效值,响应于第三信号位为有效值,确定获取到第三通知
信息。例如,当协处理器120跳转以执行调试过程代码,或者执行待执行指令后,协处理器
120中的调试辅助程序会将存储空间中的第三信号位设置为有效值,从而便于主处理器110
中的调试主程序查询,以达到传递第三通知信息的目的。
一步包括如下操作。
行指令的备份,因此,调试主程序此时可以判断该待执行指令的类型。
类似地,调试主程序可以轮询第一信号位是否为有效值。当第一信号位为有效值时,则确定
获取到第一通知信息;若第一信号位为无效值时,则继续轮询第一信号位。
等待用户输入指令之后再恢复运行目标程序代码。通过调试主程序与调试辅助程序的配
合,可以提供打印、更改内存和寄存器值、继续执行、单步执行等多种功能。该方法可以实现
GPU的程序调试,无需使用硬件中断指令,对GPU的硬件条件要求低,不依赖硬件中断指令的
支持(例如不依赖Trap指令的支持),适用范围广。
置表示的断点默认为启用状态。
中的下一行语句在目标程序代码中对应的代码位置,并且在GPU的指令内存中目标程序代
码中对应的代码处插入调试指令,该调试位置作为单步临时断点。并且,该调试位置表示的
断点默认设置为启用状态(有效状态)。由此,当协处理器120执行调试过程代码并且执行到
该调试位置时,会触发跳转,协处理器120会跳转以执行调试辅助程序,从而可以执行上述
步骤S11‑S21,由此实现单步执行的程序调试。
状态。
句的代码处均插入调试指令。例如,预设状态表记录各个调试位置表示的断点的状态,需要
进行调试的调试位置表示的断点为启用状态(有效状态),其余的调试位置表示的断点则设
置为非启用状态(无效状态)。根据预设状态表设置各个调试位置表示的断点的状态,从而
标识该调试位置是否为用户需要调试的断点。例如,如果某一调试位置表示的断点设置为
启用状态(也即,对应的断点被启用),则在执行前述步骤S11‑S21时,根据前述的操作可以
实现程序调试;如果某一调试位置表示的断点设置为非启用状态(也即,对应的断点未启
用),则在执行前述步骤S11‑S21时,会在判断断点是否命中时认为该断点未命中,从而避免
错误地中断程序执行。
为启用状态。也即是,用户输入单步执行指令相当于将下一行语句对应的代码处的调试位
置表示的断点设为启用状态。由此,对应于下一行语句的代码处的调试位置表示的断点被
启用,则在执行前述步骤S11‑S21时,根据前述的操作可以实现单步执行。
来实现单步执行,而不限于上述两种方式,这可以根据实际需求而定。
目标程序代码的方法的工作流程图之二。下面结合图9和图10对本公开实施例提供的方法
的工作流程进行示意性说明。需要注意的是,图9为协处理器(Device侧)的工作流程,图10
为系统侧(Host侧)的工作流程。在该示例中,协处理器为GPU,该GPU上设置有高带宽内存
(HBM),该HBM中存储有第一信号位FA、第二信号位FB、第三信号位FC,并且该HBM既可以从
GPU内部读写,也可以从系统侧进行读写。
中的虚线框表示虚线框内的操作不在GPU上执行。
第一信号位FA置位,也即设置为1。需要说明的是,在后文的说明中,“置位”表示设置为1,相
同说明不再赘述。然后调试辅助程序开始以轮询方式检查第二信号位FB是否置位。如果第
二信号位FB没有置位,则调试辅助程序一直轮询检查。
HBM,将寄存器值和栈内容从HBM移到系统侧,之后将第一信号位FA清零。
户输入的指令,将用户输入的指令作为待执行指令。若断点未命中,则自动将待执行指令设
置为继续执行指令(continue指令)。
指令信息(也即待执行指令)写入HBM,之后将第二信号位FB置位。然后开始以轮询方式检查
第三信号位FC是否置位。
续执行指令(continue指令)或单步执行指令(next指令)。若是continue指令或next指令,
则调试辅助程序将第三信号位FC置位,并跳转至调试过程代码,使GPU程序恢复执行。若既
不是continue指令也不是next指令,则调试辅助程序根据指令的具体类型执行对应操作,
然后将第三信号位FC置位,并且开始继续检查第二信号位FB是否置位。
或next指令,则开始继续检查第一信号位FA是否置位。若既不是continue指令也不是next
指令,则继续等待用户输入下一个指令。
实现GPU的程序调试。该方法无需使用硬件中断指令,对GPU的硬件条件要求低,不依赖特定
硬件指令的支持,适用范围广。
本公开的实施例对此不作限制,只要能建立实时交流协议即可。
以执行调试辅助程序。
可以根据实际需求而定,本公开的实施例对此不作限制。
件条件要求低,不依赖特定硬件指令的支持,适用范围广。
元53。
以为图1中示出的代码获取单元111,并且可以执行图2所示的方法中的步骤S11。
单元53可以为图1中示出的调试辅助单元121,并且可以执行图2所示的方法中的步骤S13。
或通用的电路、芯片或装置等,也可以为处理器和存储器的结合。关于代码获取单元51、上
载单元52、调试辅助单元53的具体实现形式,本公开的实施例对此不作限制。
所示的装置50的组件和结构只是示例性的,而非限制性的,根据需要,该装置50还可以包括
其他组件和结构。
的支持,适用范围广。
示的用于调试由协处理器执行的目标程序代码的装置50。例如,该电子设备60可以为具有
中央处理器和图形处理器的计算机、服务器等,或者为其他任意的具有计算功能的电子设
备,本公开的实施例对此不作限制。关于该电子设备60的相关说明可参考上文中关于装置
50的描述,此处不再赘述。