面向线程的调试的制作方法

文档序号:6467252阅读:133来源:国知局
专利名称:面向线程的调试的制作方法
背景技术
发明领域本发明涉及计算机程序的调试,而更具体地涉及调试多个线程的能力。
背景技术
采用许多不同技术来方便计算机程序的调试。一种常用的技术为在出现预定的事件时停止程序线程(即一序列指令)的运行并检查诸如寄存器、RAM中的地址等各种存储单元的内容。以这一方式停止线程的非常有用的措施便是断点。
可将停止当前正在运行的线程的执行的断点设定为以多种多样的方式出现。其实例包括在执行特定指令时出现的断点及访问特定存储单元时出现的断点。使用断点的特定指令类型的代表性实例示出在图1A至1F中。
图1A示出要调试的线程中的一序列指令。各指令包含一操作码后面跟随与该相应指令关联的任何参数(如操作数、地址、数据等)。通常,每一个操作码为一个字节长。在本例中,该序列包含三条指令,即指令A包括操作码A后随两个相关参数A1与A2;指令B包含操作码B后随一个相关参数B1;以及指令C包含操作码C后随两个相关参数C1与C2。
传统上,这些指令的每一条是在处理器中程序计数器的控制下按所示序列读取与执行的。
图1B示出在要调试的线程中如何设置断点。具体地,调试器用HALT(停止)操作码代替操作码B。
图1C描绘当处理器已执行了指令A并已将程序计数器中的值PC增量到存储HALT操作码的地址时的瞬间。此时,处理器停止运行线程并直接或间接地通知调试器已到达了断点。这能以多种方式完成,例如,由处理器激活中断到调试器或由调试器周期性轮询处理器的状态来检测处理器已到达HALT操作码。
如图1D中所描绘的,调试器用读取停止的线程的值PC来确定已到达(有可能许多)断点中的哪一个来应答HALT操作码的通知。然后调试器将对应的操作码(即图1B中已用HALT操作码替换的“操作码B”)写入存储器20中并命令处理器执行下一条指令。在执行该指令中,处理器将读取新写入的操作码B并增量程序计数器以指示相关的单字节参数B1的单元。
如图1E中所描绘的,这时处理器读取相关参数B1并将程序计数器增量到操作码C的地址。在完成了指令B时,处理器停止而调试器重新获得控制权。
如图1F中所描绘的,在处理器执行指令B之后但在读取操作码C之前,调试器重新用HALT操作码替换程序流中的操作码B。为了在线程中保持断点这是必要的。
从图1中所示的实例能看出即使是单线程的断点调试也能是复杂与耗时的过程。
发明概述本发明的目的为提供比已知断点调试技术更简单与耗时较少的断点调试方法。
本发明的另一目的为提供在多线程软件环境中便于一个线程的调试同时允许其它线程继续运行的调试方法。
按照本发明的一种方式,调试具有要处理器运行的一序列指令的程序线程的方法,包括用断点指示符替换至少一条指令的选择部分;将该选择部分保存在预定的存储单元中;顺序通过这些指令直到到达断点指示符为止;从该预定的存储单元中读取该选择部分而不改写断点指示符;执行多种预定的调试操作中至少一种。
按照本发明的另一方式,用于有选择地调试一个处理器能运行的多个程序线程的方法包括在所述线程的每一个的各自的环境中提供运行状态指示符;运行其状态指示符在第一状态中的每个线程;不运行其状态指示符在第二状态中的每个线程。
注意这里所使用的词“存储器”旨在解释为与其使用方式相符地广泛,并包括各种类型的易失性与非易失性器件,其中包括但不限于RAM、DRAM、ROM、寄存器及这些器件的组合。“专用”存储器表示该存储器具有处理器知道的一或多个特定单元。然而这些单元并不要求是固定的,而可在处理器的控制下改变。并且,如这里所使用的,词“指针”表示标识存储单元的任何值。此外,“访问”数据表示从存储器得到数据或将数据放入存储器。


图1A至1F示出已知的断点技术。
图2为展示在说明本发明的较佳实施例中有用的示范处理系统的框图。
图3A至3E示出按照本发明的实施例的断点技术。
最佳实施例描述图2的处理系统包括处理器10与存储器20。示范性处理器10为硬件加速的单元,它利用时钟脉冲来顺序通过用程序计数器寄存器标识的指令。通常,程序计数器寄存器包含要由处理器读取与作用在其上的下一条指令的存储单元。
处理器包含环境寄存器组12、指令译码器14、算术逻辑单元16、SS OPCODE(操作码)寄存器17、SSTC PTR寄存器18、及包含OPCODEIS VALID(操作码是有效的)标志的寄存器19。在本示范性实施例中的存储器20包括具有用于存储多个线程环境及其它的许多存储单元的RAM。
处理器10与存储器20连接在公共总线30上互相通信并与连接在总线上的其它硬件通信。总线包含用于传送诸如地址、中断、数据、读选通脉冲、写选通脉冲与设备选择选通脉冲等信息的相应线路。最好,这是至少部分地形成在与处理器及存储器的公共硅基板上的高速总线。
环境寄存器组12包括多个用于包含当前处理器10正在运行的线程的环境的寄存器。在本较佳实施例中,寄存器组12包括包含该处理连续地更新以标识要访问的存储器20中下一条指令的地址的PC值的程序计数器寄存器121;用于保持指示要存储处理器当前正在运行的线程的环境的存储器地址的指针TC PTR的寄存器122;
用于保持与处理器当前正在运行的线程相关的STATUS(状态)信息的寄存器123;以及用于保持算术逻辑单元16从存储器20读取或生成的附加线程环境信息与数据及其它的一或多个附加寄存器125。
指令译码器14为用于将读自存储器20的指令转换成低级操作码的传统硬件部件,诸如定序器或微定序器。算术逻辑单元16也是传统硬件部件。
设置了SS OPCODE寄存器17、SS TC PTR寄存器18及SS OP FLAG(标志)寄存器19用于保持对断点调试特别相关的信息。具体地,寄存器17保持来自正在调试的线程(被调试线程)的操作码,寄存器18保持与该被调试线程相关的指针SS TC PTR,而寄存器19保持与寄存器17相关的标志。
操作中,处理器一次运行一个线程(当前线程),但能用多种多样的措施切换到任何其它线程,例如,用内部定时器中断,用外部中断,或用当前线程本身中的指令。如在本技术中众所周知的,这是通常通过将当前线程环境(保持在环境寄存器组12中的)存储到包含在寄存器122中的指针TC PTR所指示的存储器地址中来完成的。然后处理器将下一个要运行的线程的相应环境读入环境寄存器组12中。
图3A至3E总的示出按照本发明的实施例的断点调试的实例。在本实例中采用了示出在图1A至1F中的在已知技术中使用的同一指令序列以便进行比较。
图3A至3C与图1A至1C完全相同。即,图3A示出插入断点操作码之前的序列;图3B示出调试器已代入断点操作码HALT;及图3C描绘当处理器已将程序计数器寄存器121中的值PC增量到存储HALT操作码的地址的瞬间。此时,处理器也停止运行该线程并通知调试器已到达断点。
如图3D中所描绘的,调试器用读取被停止的线程的值PC来应答HALT操作码的通知。然而,不是将操作码B(已用HALT操作码替换的)写在HALT操作码上,而是处理器将操作码B写入SS OPCODE寄存器17中,将HALT操作码留在线程中,并置位OPCODE IS VALID标志。然后,处理器将程序计数器增量到指示相关的单字节参数B1的单元。
如图3E中所描绘的,处理器读取相关的参数B1,将程序计数器增量到操作码C的地址,并执行刚读取的指令B。
这样消除了重新用HALT操作码替换操作码B所需的所有步骤。这通常包含在完成指令B时停止处理器,用HALT操作码改写操作码B,然后恢复运行停止的线程或不同的线程。
执行断点调试的特定方式将取决于提供给调试器的选项及处理器正在运行的线程的数目。按照本发明的较佳实施例,调试器提供有下述选项,无论正在运行的是一个还是多个线程,所有这些选项都可获得停止运行的线程;从断点或从断点以外的点的单步运行;从断点或从断点以外的点恢复运行。
为了方便这些选项,提供了标志与命令供调试器与处理器使用,包含包含在各线程的STATUS(状态)信息中的RUNNING(运行)标志,它指示各自的线程正在运行还是停止;包含在寄存器19中的OPCODE IS VALID标志,它置位时,指示等待执行的操作码已加载到SS OPCODE寄存器17中;复位时,指示应从程序流中取下一条指令;SINGLE-STEP(单步)命令,它导致处理器只执行停止的线程中的下一条指令;RESUME(恢复)命令,它导致处理器恢复停止的线程的运行。
如果正在运行一个以上线程,正在受调试的各线程将在出现HALT操作码时停止,并将该线程的RUNNING标志复位。处理器将继续轮流地处理所有线程,但每一次它访问到停止的线程的环境时,它将检测到该线程的环境中的RUNNING标志的复位状态,这时不做任何事情直到出现中断为止,这导致处理器切换到序列中的下一线程。
调试器可调试各设置一或多个断点的一或多个线程。为了响应断点上HALT的出现,调试器必须能定位HALT操作码所替换的操作码。调试器最好通过令处理器通知它处理HALT指令的线程的线程环境地址或通过访问各被调试线程的线程环境中的状态寄存器以检测RUNNING标志的状态来做到这一点。注意,复位(即停止)状态有可能同时存在在一个以上被调试线程中。
停止运行的线程调试器可选择停止任何正在运行的线程。为了做到这一点,调试器将指令处理器用标识保持运行的被调试线程的环境的存储单元的指针加载SS TC PTR寄存器18。然后调试器发布HALT命令,导致处理器将任何当前正在运行的线程的环境保存在当前在寄存器122中的指针TC PTR所指示的存储器地址中的。
将寄存器122的内容拷贝到寄存器18中(方便以后重新装入刚才运行的线程)并将寄存器18的内容(指针SS TC PTR)拷贝到寄存器122中;将位于由指针SS TC PTR(现在在寄存器122中)标识的存储器地址处的被调试环境读入环境寄存器组12中;复位RUNNING标志;将刚才已停止的被调试线程的当前环境保存在存储器中;将寄存器18的内容拷贝到寄存器122中,以便实现前面运行的线程的重新装入;将位于由寄存器122中的指针PC PTR标识的存储器地址处的线程环境读入环境寄存器组12中。
注意被调试的线程的保存的环境的RUNNING标志是复位的。从而处理器继续循环通过它正在处理的所有线程,但它每次到达被调试的线程的环境时它注意到状态信息中的RUNNING标志仍然是复位的而并不运行该被调试的线程。
单步调试器可选择单步运行停止的任何线程。为了做到这一点,调试器将指令处理器用标识保持被停止的被调试线程的环境的存储单元的指针加载SS TC PTR寄存器18。然后调试器将读取被调试线程的程序计数器来确定它是否被停止在断点上。如果在断点上,它便将被HALT操作码替换的操作码(如图3D中的操作码B)加载进SS OPCODE寄存器17中并置位OPCODE IS VALID标志。如果不在断点上,则已复位OPCODE IS VALID标志。
这时调试器发布SINGLE-STEP命令,导致处理器将任何当前正在运行的线程的内容保存在由当前在寄存器122中的指针PC PTR所指示的存储器地址中;将寄存器122的内容拷贝到寄存器18中(以便以后装入刚才运行的线程)并将寄存器18的内容(指针SS TC PTR)拷贝到寄存器122中;将位于由指针SS TC PTR(现在在寄存器122中)标识的存储器地址上的被调试环境读入环境寄存器组12中,该内容包含HALT操作码所在的断点的值PC;检验OPCODE IS VALID标志来确定要使用的操作码的源,即如果该标志是置位的则来自寄存器17,或如果该标志是复位的则来自程序流;复位OPCODE IS VALID标志以指示在寄存器17中无等待执行的操作码;增量寄存器121中的值PC(例如到图3D中的参数B1的地址);如果有的话,读取在增量后的值PC处的参数(如参数B1);根据需要重复最后两步来读取与从寄存器17读取的操作码关联的任何附加参数;执行从刚才读取的操作码及任何与之关联的参数构成的完整指令,然后将值PC增量到下一个操作码(如图3E中的操作码C);将刚才单步运行的被调试的线程的当前环境保存在存储器中;将寄存器18的内容拷贝到寄存器122中,以便实现前面运行的线程的重新装入;将位于由寄存器122中的指针TC PTR所标识的存储器地址上的线程环境读入环境寄存器组12中。
注意,所保存的环境中包含被调试线程中要执行的下一条指令的值PC与仍然是复位的RUNNING标志。从而处理器继续循环通过它正在处理的所有线程,但每次到达被调试线程的环境时,它注意到STATUS信息中的RUNNING标志仍然是复位的而并不运行被调试的线程。
恢复运行调试器可选择恢复被停止的任何线程的运行。为了做到这一点,调试器将指令处理器用标识保持停止的被调试线程的环境的存储单元的指针加载SS TC PTR寄存器18。
然后调试器读取被调试线程的程序计数器以确定它是否停止在断点上。
如果是在断点上,它便将已被HALT操作码替换的操作码(如图3D中的操作码B)加载到SS OPCODE寄存器17中并置位OPCODEISVALID标志。
然后调试器发布RESUME(恢复)命令,导致处理器将任何当前正在运行的线程的环境保存在当前在寄存器122中的指针PC PTR所指示的存储器地址中;将寄存器122的内容拷贝到寄存器18中(以便以后重新装入刚才运行的线程)并将寄存器18的内容(指针SS TC PTR)拷贝到寄存器122中;将位于由指针SS TC PTR(现在在寄存器122中)标识的存储器地址上的被调试环境读入环境寄存器组中,该环境中包含HALT操作码所在的断点的值PC;检验OPCODE IS VALID标志以确定要使用的操作码的源,即,如果该标志是置位的则来自寄存器17,或如果该标志是复位的则来自程序流;复位OPCODE IS VALID标志从指示寄存器17中无等待执行的操作码;增量寄存器121中的值PC(例如到图3D中的参数B1的地址);读取在增量后的值PC上的任何参数(如参数B1);根据需要重复最后两步以读取与读自寄存器17的操作码关联的任何附加参数;置位包含在寄存器123中的STATUS信息中的RUNNING标志;执行从刚才读取的操作码及与之关联的任何参数构成的完整指令,然后将值PC增量到下一个操作码(如图3E中的操作码C);将被调试线程的当前环境保存在存储器中;将寄存器18的内容拷贝到寄存器122中,以实现前面运行的线程的重新装入;
将位于用寄存器122中的指针TC PTR标识的存储器地址上的线程环境读入环境寄存器组12中。
另一方面,如果不在断点上,则已复位了OPCODE IS VALID标志。然后调试器将发布RESUME命令而导致处理器将任何当前正在运行的线程的环境保存在当前在寄存器122中的指针TC PTR指示的存储器地址中;将寄存器122的内容拷贝到寄存器18中(以便以后重新装入刚才运行的线程)并将寄存器18的内容(指针SS TC PTR)拷贝到寄存器122中;将位于由指针SS TC PTR(现在在寄存器122中)所标识的存储器地址上的被调试环境读入环境寄存器组中,该环境中包含线程中下一个操作码的值PC;置位包含在寄存器123中的STATUS信息中的RUNNING标志;将被调试线程的当前环境保存在存储器中;将寄存器18的内容拷贝到寄存器122中,以实现前面运行的线程的重新装入;将位于由寄存器122中的指针TC PTR标识的存储器地址上的线程环境读入环境寄存器组12中。
注意,所保存的环境中包含被调试线程中要执行的下一条指令的值PC及RUNNING标志(现在是置位的)。从而处理器继续循环通过它正在处理的所有线程,并且每次它到达被调试的线程的环境时它注意到STATUS信息中的RUNNING标志是置位的而运行被调试的线程。
权利要求
1.一种调试包括要由处理器(10)运行的一序列指令的程序线程的方法,所述方法包括a.用断点指示符(HALT)替换至少一条指令的选择部分(操作码B);b.在存储器中保存该选择部分(操作码B);c.顺序通过这些指令直到到达断点指示符(HALT)为止;d.从存储器中读取该选择部分(操作码B)而不改写断点指示符(HALT);e.执行多种预定的调试操作中至少一种。
2.权利要求1中的方法,其中将选择部分保存在预定的存储器位置中并从其中读取。
3.权利要求1中的方法,其中该选择部分包括操作码。
4.权利要求1中的方法,其中该选择部分包括用于停止线程的运行的HALT操作码。
5.权利要求1中的方法,其中这些预定的调试操作包含a.在断点上停止程序线程的运行;b.单步运行停止的线程;c.恢复停止的线程的运行。
6.权利要求1中的方法,其中提供了标志来指示是否已将选择部分读入专用存储器中并正在等待利用。
7.一种用于处理器能运行的多个程序线程的选择性调试的方法,所述方法包括a.在各所述线程的各自的环境中提供运行状态指示符;b.运行其状态指示符在第一状态中的每个线程;c.不运行其状态指示符在第二状态中的每个线程。
8.权利要求7中的方法,其中调试器利用该运行状态指示符来选择一个线程供调试,同时允许至少另一线程继续运行。
全文摘要
提供了用于调试器线程而不改写该线程中替换该线程的断点指示符的一种方法。到达该断点后,将操作符读入专用寄存器中供利用。还提供了方便线程的调试同时允许至少另一线程继续运行的一种方法。
文档编号G06F11/36GK1335962SQ00802558
公开日2002年2月13日 申请日期2000年8月21日 优先权日1999年9月7日
发明者W·L·萨维勒, K·罗斯 申请人:皇家菲利浦电子有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1