专利名称:调试多线程代码的制作方法
调试多线程代码
背景技术:
本申请一般地涉及改进的数据处理装置和方法,更具体地说,涉及为调试多线程代码提供支持的机制。
在本领域的目前情况下,编写在多个线程中运行的计算机程序是用于改进应用性能的公认方法。与根据程序顺序依次执行指令的单线程应用不同,多线程应用通过在系统的各种处理组件上同时运行多个线程来改进性能。性能改进是因为多个处理器或硬件线程通常运行多线程代码,从而帮助应用以较短的时间完成其任务。然而,多线程应用的开发仍是一项困难的任务,因为程序员通常必须插入同步代码以使线程以所需方式运行,以便计算作为顺序程序运行的应用的等效结果。此类同步代码可能难以编写和维护。开发多线程应用代码的另一个困难是组织在线程之间共享数据。如果没有精心组织线程如何在它们自身之间共享数据,则应用中的线程可能覆盖彼此在存储器中的数据项更改,或者可能产生不可预测的结果,因为未对同一数据项的读取和写入进行正确排序。这种情况通常被称为“数据竞争”或简称“竞争条件”。已经发明了许多同步基元(primitive)以帮助程序员开发多线程应用。例如,信号、锁和监视器通常是用于强制共享数据访问顺序并确保线程以可预测的方式彼此交互的公认技术。当正确编写的并行程序使用这些结构时,它通常将产生正确的结果并以确定的方式运行。然而,即使使用这些结构和基元,开发多线程代码的任务也不是一项简单的任务。程序员可能由于未引入正确的同步代码而忘记保护对共享数据项的访问。此类未受保护的访问被称为恶魔访问(demonic access),并且在运行时非常难以跟踪。因为没有应用代码实际上可以被认为在实现时是正确的,所以在代码开发之后通常是调试和测试阶段。在此阶段内,应用运行测试套件(通常被称为回归测试),并检查结果以查看是否可以发布应用。如果结果显示应用代码中出现错误,则通过多种技术调试应用代码,例如将错误返回与其起源相联系直到确定并纠正错误源。这种技术(在顺序调试中已很困难)在多线程代码中甚至更难以使用,因为应用代码通常不是确定性的。例如,如果存在共享数据的恶魔访问,则针对恶魔访问运行应用可能具有不同的可能调度,其中某些调度可能根本不产生错误。因此,在调试多线程代码中,重复执行应用以查找错误并不是一种可行的方法。缺乏可以帮助调试多线程应用的工具加重了此问题。与顺序代码(其中当代码在程序的不同阶段运行时,程序员可以使用工具观察代码的行为)不同,并行程序可能不会每次都以相同方式执行。因此,将存在以下情况错误有时自己显现,或者更糟糕的是错误可能很少自己显现,从而使其难以被发现。此外,用于顺序调试的许多常规技术可能扰乱并行程序的计时,以致在调试会话开启时掩盖错误的出现,使错误仅在随后脱离调试工具时才出现。
发明内容
在一个示例性实施例中,提供了一种在数据处理系统的处理器中用于调试应用代码的方法。所述方法包括在所述处理器的硬件単元中接收指令,所述指令具有所述指令正在尝试访问的目标存储器地址。所述方法还包括捜索与所述硬件単元关联的内容可寻址存储器(CAM)以查找所述CAM中指定包括所述目标存储器地址的地址范围的表项。此外,所述方法包括响应于在所述CAM中找到指定包括所述目标存储器地址的地址范围的表项而判定所述表项中的信息是否将所述指令标识为感兴趣的指令。此外,所述方法包括响应于所述表项将所述指令标识为感兴趣的指令而生成异常并将所述异常发送到异常处理机或调试器应用之一。所述方法还包括程序员为与所述硬件关联的所述CAM加载包括在所述程序中各种线程之间共享的变量的地址范围。此外,所述方法包括根据本发明的一个实施例设置运行应用线程的每个硬件线程的CAM。然后运行所述程序,并 且如果线程访问在所述CAM中指定的范围内的变量,则调试器验证所述应用在访问所述变量之前已获得必需的同步结构。访问没有保护的变量可能出现同步错误,此同步错误在常规调试中难以检測。在其他示例性实施例中,提供了一种计算机程序产品,所述计算机程序产品包括具有计算机可读程序的计算机可用或可读介质。当所述计算机可读程序在计算设备上执行时,导致所述计算设备执行上面关于所述方法示例性实施例概述的各种操作和它们的组
ム
ロ ο在另ー个示例性实施例中,提供了一种系统/装置。所述系统/装置可以包括一个或多个处理器和耦合到所述ー个或多个处理器的存储器。所述存储器可以包括指令,当所述指令由所述ー个或多个处理器执行时,导致所述ー个或多个处理器执行上面关于所述方法示例性实施例概述的各种操作和它们的组合。本发明的这些和其他特性和优点将在以下对本发明的实例实施例的详细说明中进行描述,或者鉴于以下对本发明的实例实施例的详细说明,本发明的这些和其他特性和优点将对本领域的技术人员变得显而易见。
现在仅通过实例的方式參考附图描述本发明的各实施例,这些附图是图I是其中可以实现示例性实施例的各方面的处理器架构的实例图;图2是根据一个示例性实施例的加载/存储单元的实例方块图;以及图3是概述根据ー个示例性实施例的加载/存储单元的实例操作的流程图。
具体实施例方式示例性实施例提供ー种为多线程计算机代码提供调试支持的机制。示例性实施例的机制提供使得应用能够跟踪对存储器中多个范围的存储器访问的硬件支持。所述硬件支持包括内容可寻址存储器(CAM)结构,其可以由所述应用或控制所述应用的调试器设置。所述CAM结构中的每个表项都具有起始地址,其指定被监视的存储器范围的起始地址。所述表项还包括长度字段、存储位(或S位)和加载位(或L位),所述长度字段指定对应于所述表项的被监视的存储器范围的大小,所述存储位和加载位使能分别检测对由所述起始地址和长度定义的存储器范围的存储器存储和加载。在硬件级别,处理器在运行的线程中检查对存储器的毎次访问。如果存储器访问的地址与CAM中的表项之一匹配,即所述地址在与所述CAM中的表项对应的存储器范围内,则硬件发出异常。所述异常导致存储堆栈中的线程的状态,并执行跳转到软件中的异常处理例程。如果存储器访问是存储(store),并且对应的地址位于由对应S位被设置为预定值(例如I)的CAM表项之ー确定的范围内,则发生访问地址与CAM中的表项的匹配。如果存储器访问是加载(load),并且对应的地址位于由对应L位被设置为预定值(例如I)的CAM表项之ー确定的范围内,则也会发生匹配。如果所述S位或所述L位未被设置为预定值(例如,所述S位或L位被设置为0),并且所述访问分别是存储或加载,则忽略匹配。为了调试应用,所述应用或控制所述应用的调试器可以将被监视的存储器范围设置成CAM表项之一,并且可以提供异常处理机以处理对被监视范围的任何存储器访问时生成的异常。所述异常处理机可以用于例如通过记录出现异常时特定变量的状态以及例如可以由性能计数器生成的其他执行參数等而确定在执行期间在应用代码中 的何处修改了所述变量。所述CAM结构允许硬件同时监视多个存储器范围,而没有任何可以导致执行扩张的性能开销。为了调试多线程应用,所述应用或调试器可以将异常处理机设置为检查当另一线程在访问之前已获得保护同步对象(例如锁)时,所接收的指令是否对变量的存储器地址执行存储或加载。如果没有,则出现竞争条件或对共享变量的恶魔访问,它们很常见并且难以在多线程应用中发现错误。如果在访问之前已获得保护同步对象,则尚未遇到竞争条件或对共享变量的恶魔访问。可以使用示例性实施例的硬件机制发现其他类型的难以发现的错误,以便提供支持以生成调试异常并将执行转移到适当的异常处理机,从而收集跟踪信息以用于调试目的。示例性实施例的机制可以用于许多不同类型的数据处理系统和处理器架构。示例性实施例可以用于单处理器顺序处理架构和多处理器、多线程数据处理系统架构,以便为计算机程序的调试提供硬件支持。然而,出于此说明的目的,将假设其中实现示例性实施例的机制的数据处理系统是提供多线程硬件的多处理器(或多核)数据处理系统。然而,应理解,示例性实施例和本发明并不限于此。如本领域的技术人员将理解的,本发明可以体现为系统、方法或计算机程序产品。因此,本发明可以采取完全硬件实施例、完全软件实施例(包括固件、驻留软件、微代码等)或组合了软件和硬件方面的实施例的形式,所有这些实施例在此通常可以被称为“电路”、“模块”或“系統”。此外,本发明可以采取体现在任何有形表达介质(在介质中包含计算机可用程序代码)中的计算机程序产品的形式。可以使用一个或多个计算机可用或计算机可读介质的任意組合。所述计算机可用或计算机可读介质例如可以是(但不限干)电、磁、光、电磁、红外线或半导体系统、装置、设备或传播介质。所述计算机可读介质的更具体的实例(非穷举列表)将包括以下项具有一条或多条线的电连接、便携式计算机软盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦写可编程只读存储器(EPR0M或闪存)、光纤、便携式光盘只读存储器(⑶ROM)、光存储设备、诸如那些支持因特网或内联网的传输介质或磁存储设备。要指出的是,所述计算机可用或计算机可读介质甚至可以是程序被打印在其上的纸张或其他适合的介质,因为所述程序可以通过例如光扫描所述纸张或其他介质被电子地捕获,然后被编译、解释或另外以适合的方式被处理(如果必要),然后被存储在计算机存储器中。在本文档的上下文中,计算机可用或计算机可读介质可以是任何能够包含、存储、传送、传播或传输由指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合的程序的介质。所述计算机可用介质可以包括其中包含计算机可用程序代码(在基带中或作为载波的一部分)的传播数据信号。可以使用任何适当的介质(包括但不限于无线、线缆、光缆、射频(RF)等)来传输所述计算机可用程序代码。用于执行本发明的操作的计算机程序代码可以使用包含一种或多种编程语言的任意组合来编写,所述编程语言包括诸如J ava 、Smalltalk 、C++之类的面向对象的编程语言或者诸如“C”编程语言或类似的编程语言之类的常规过程编程语言。所述程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为独立的软件包、部分地在用户计算机上井部分地在远程计算机上执行,或者完全地在远程计算机或服务器上执行。在后者的情况中,所述远程计算机可以通过包括局域网(LAN)或广域网(WAN)的任何类型网络与用户的计算机相连,也可以与外部计算机进行连接(例如,使用因特网服务提供商通过因特网连接)。此外,所述程序代码可以包含在所述服务器或所述远程计算机上的计算机可读存储介质中,并通过网络下载到所述远程计算机或所述用户计算机的计算机可读存储介质中以便存储和/或执行。此外,通过网络从远程计算系统或数据处理系统下载所述程序代码之后,任何计算系统或数据处理系统都可以将所述程序代码存储在计算机可读存储介质中。下面參考根据本发明的示例性实施例的方法、装置(系统)和计算机程序产品的流程图和/或方块图对示例性实施例进行描述。将理解,所述流程图和/或方块图的每个方块以及所述流程图和/或方块图中的方块的组合可以由计算机程序指令来实现。这些计算机程序指令可以被提供给通用计算机、专用计算机或其他可编程数据处理装置的处理器以产生机器,以便通过所述计算机或其他可编程数据处理装置的处理器执行的所述指令产生用于实现ー个或多个流程图和/或方块图方块中指定的功能/操作的装置。这些计算机程序指令也可以被存储在能够引导计算机或其他可编程数据处理装置以特定方式执行功能的计算机可读介质中,以便存储在所述计算机可读介质中的所述指令产生一件包括实现在ー个或多个流程图和/或方块图方块中指定的功能/操作的指令装置的制品。所述计算机程序指令还可被加载到计算机或其他可编程数据处理装置,以导致在所述计算机或其他可编程装置上执行一系列操作步骤以产生计算机实现的过程,从而在所述计算机或其他可编程装置上执行的指令提供用于实现在ー个或多个流程图和/或方块图方块中指定的功能/操作的过程。附图中的流程图和方块图示出了根据本发明的各种实施例的系统、方法和计算机程序产品的可能实施方式的架构、功能和操作。在此方面,所述流程图或方块图中的每个方块都可以表示代码的模块、段或部分,所述代码包括用于实现指定的逻辑功能(多个)的一个或多个可执行指令。还应指出,在某些备选实施方式中,在方块中说明的功能可以不按图中说明的顺序发生。例如,示为连续的两个方块可以实际上被基本同时地执行,或者某些时候,取决于所涉及的功能,可以以相反的顺序执行所述方块。还将指出,所述方块图和/或流程图的每个方块以及所述方块图和/或流程图中的方块的组合可以由执行指定功能或操作的基于专用硬件的系统或专用硬件和计算机指令的组合来实现。
參考图1,根据示例性实施例示出了显示功能単元和寄存器的双线程处理器设计的示例性方块图。处理器100例如可以实现为多线程数据处理系统架构中的ー个或多个处理单元。即,处理器100可以包括支持同时执行多个线程的一个或多个处理器核心。例如,处理器100可以包括单个集成电路超标量微处理器,其具有也可以以单线程模式运行的双线程同步多线程(SMT)。因此,如下面进ー步讨论的那样,处理器100包括各种单元、寄存器、缓冲器、存储器和其他部分,它们全部由集成电路形成。应理解,尽管在此出于示例目的參考特定处理器架构和特定多线程能力,但示例性实施例的机制适用于支持任何级别的多线程(例如,双线程、四线程等)的任何处理器架构。如图I中所示,指令取回単元(IFU) 102连接到指令高速缓存104。指令高速缓存104保存多个待执行程序(线程)的指令。指令高速缓存104还具有到2级(L2)高速缓存/储器106的接ロ。IFU 102根据指令地址从指令高速缓存104请求指令,并将指令传递到指令解码单元108。在一个示例性实施例中,IFU 102可以同时针对最多两个线程从指令高速缓存104请求多个指令。指令解码单元108同时针对最多两个线程对多个指令进行 解码,并将解码后的指令传递到指令定序器単元(ISU) 109。处理器100还可以包括发出队列110,发出队列110从ISU 109接收解码后的指令。当等待分派到适当的执行单元时,指令被存储在发出队列110中。为了使乱序处理器以顺序方式运行,ISU 109可以选择性地使用每个指令之间的伪相关性快速发出指令。例如在写后读相关性中,如果指令没有产生数据,则ISU 109可以按指令添加额外的源操作数(也被称为消费者)以指向上一个目标指令(也被称为产生者)。当发出产生者吋,发出队列110则可以唤醒消费者以便发出。通过引入伪相关性,可以创建相关指令链,而指令则可以仅顺序发出。ISU 109使用添加的消费者实现指令调度目的,并且当执行指令时,实际上不使用来自添加的相关性的数据。一旦ISU 109选择性地添加了任何所需的伪相关性,发出队列110就接管并针对每个线程顺序发出指令,然后针对每个线程将指令输出或发出到处理器的执行单元 112、114、116、118、120、122、124、126 和 128。在一个示例性实施例中,处理器的执行单元可以包括分支単元112、加载/存储单元(LSUA) 114和(LSUB) 116、定点执行单元(FXUA) 118和(FXUB) 120、浮点执行单元(FPUA)122和(FPUBH24,以及向量多媒体扩展单元(VMXA)126和(VMXB)128。执行单元112、114、116、118、120、122、124、126和128完全在两个线程之间共享,意味着执行单元112,114,116、118、120、122、124、126和128可以从ー个或两个线程接收指令。所述处理器包括多个寄存器组130、132、134、136、138、140、142、144和146,它们也可以被称为架构式寄存器文件(ARF)。ARF是在指令完成执行之后存储完成的数据的文件。ARF 130、132、134、136、138、140、142、144和146可以针对两个线程中的每个线程単独存储数据,并可以按指令类型存储数据,即,通用寄存器(GPR) 130和132、浮点寄存器(FPR) 134和136、专用寄存器(SPR)138和140,以及向量寄存器(VR) 144和146。按类型和按线程単独存储完成的数据有助于在处理指令时减少处理器竞争。所述处理器另外包括ー组共享专用寄存器(SPR) 142以便保存程序状态,例如指令指针、堆栈指针或处理器状态字,它们可以用于来自ー个或两个线程的指令。执行单元112、114、116、118、120、122、124、126和128通过简化的内部总线结构149连接到ARF 130、132、134、136、138、140、142、144 和 146。为了执行浮点指令,FPUA 122和FPUB 124从FPR 134和136检索寄存器源操作数信息,此信息是执行指令所需的输入数据,前提是执行指令所需的指令数据完整或者数据已经过管道中的清仓点(flushing point)。完整数据是指在指令完成执行之后由执行单元生成并存储在ARF (例如ARF 130、132、134、136、138、140、142、144和146)中的数据。不完整数据是指在其中指令尚未完全执行的指令执行期间生成的数据。FPUA122和FPUB 124根据每个执行指令所属的线程输入它们的数据。例如,FPUA 122将完成的数据输入到FPR134,FPUB 124将完成的数据输入到FPR 136,因为FPUA 122,FPUB 124以及FPR 134和136是线程特定的。 在指令执行期间,当指令已在管道中经过清仓点时,FPUA 122和FPUB 124将其目的地寄存器操作数数据或在指令执行期间生成的指令数据输出到FPR 134和136。在指令执行期间,当指令已在管道中经过清仓点时,FXUA 118、FXUB 120、LSUA 114和LSUB 116将其目的地寄存器操作数数据或在指令执行期间生成的指令数据输出到GPR 130和132。在指令子集的执行期间,当指令已在管道中经过清仓点时,FXUA 118、FXUB120和分支单元112将其目的地寄存器操作数数据输出到SPR 138、140和142。存储在SPR 138和140中的程序状态(例如指令指针、堆栈指针或处理器状态字)指示到达ISU 109的线程优先级152。在指令执行期间,当指令已在管道中经过清仓点时,VMXA 126和VMXB 128将其目的地寄存器操作数数据输出到VR 144和146。数据高速缓存150还可以具有与之关联的非缓存单元(未示出),所述非缓存单元接受来自处理器的数据并将其直接写入2级高速缓存/储器106。通过这种方式,所述非缓存单元绕过存储到高速缓存所需的一致性协议。响应于从指令高速缓存104输入并由指令解码单元108解码的指令,ISU 109选择性地将指令分派到发出队列110,然后针对指令类型和线程分派到执行单元112、114、116、118、120、122、124、126 和 128。接着,执行单元 112、114、116、118、120、122、124、126 和 128执行具有特定指令类别或类型的一个或多个指令。例如,FXUA 118和FXUB 120针对寄存器源操作数执行定点数学运算,例如加法、减法、“与”运算、“或”运算和“异或”运算。FPUA122和FPUB 124针对寄存器源操作数执行浮点数学运算,例如浮点乘法和除法。LSUA 114和LSUB 116执行加载和存储指令,这些指令在数据高速缓存150与ARF 130、132、134和136之间移动操作数数据。VMXA 126和VMXB 128执行包括多个数据的单指令运算。分支单元112执行分支指令,这些指令通过修改IFU 102使用的指令地址以便从指令高速缓存104请求指令而有条件地改变程序的执行流程。指令完成单元154监视内部总线结构149以确定在执行单元112、114、116、118、120、122、124、126和128中执行的指令何时完成将其操作数结果写入ARF 130、132、134、136、138、140、142、144 和 146。由分支单元 112、FXUA 118、FXUB 120、LSUA 114 和 LSUB116执行的指令需要相同数量的周期以便执行,而由FPUA 122,FPUB 124,VMXA 126和VMXB128执行的指令需要可变且更大数量的周期以便执行。因此,分组在一起并同时开始执行的指令不一定冋时完成执彳丁。指令的“完成”意味着指令在执打单兀112、114、116、118、120、122、124、126或128之一中完成执行、已经过清仓点,并且已经以架构状态更新所有较旧的指令(因为指令必须顺序完成)。因此,指令现在可以完成并更新架构状态,这意味着在指令完成时更新数据的最终状态。架构状态仅可顺序更新,即指令必须顺序完成,并且必须在每个指令完成时更新完成的数据。指令完成单元154监视指令的完成,并将控制信息156发送到ISU 109以通知ISU109可以将更多的指令组分派到执行单元112、114、116、118、120、122、124、126和128。ISU109发送分派信号158,此信号用作节流阀以将更多指令沿管道带给所述分派单元、IFU102和指令解码单元108,以便指示它已准备好接收更多解码后的指令。尽管处理器100提供了单个集成电路超标量微处理器的详细说明,所述微处理器具有也可以以单线程模式运行的双线程同步多线程(SMT),但示例性实施例并不限于此类微处理器。S卩,示例性实施例可以以使用管道技术的任何类型的处理器实现。在图I中所示的架构中,可以增加一个或多个加载/存储单元114和 116以包括硬件内容可寻址存储器(CAM)结构和逻辑以便实现示例性实施例的机制。内容可寻址存储器(CAM)是一种特殊类型的硬件搜索引擎,其对于搜索密集型应用而言远快于算术方法。CAM包括常规半导体存储器(通常为SRAM)并添加了使得搜索操作能够在单个处理器时钟周期内完成的比较电路。有关CAM的更多信息,请参考Pagiamtzis等人的“Content-Addressable Memory(CAM)Circuits and Architectures:ATutorial andSurvey (内容可寻址存储器(CAM)电路和架构教程和调查)” (IEEE固态电路期刊,第41卷第3期,第712-727页,2006年3月)。所述加载/存储单元的逻辑及其CAM结构可由应用、调试器等配置,以便定义存储器(例如主存储器)范围,针对此存储器范围的加载和/或存储操作应为此范围生成异常以便促进收集调试信息。所述处理器增加了特殊指令以允许调试器或应用访问CAM结构,以便例如为CAM结构加载范围并设置对应的S和L位。此外,该指令允许应用在不发生调试时完全关闭CAM以节省能源。所述应用或调试器在CAM结构中创建表项,此表项指定存储器范围的起始地址、存储器范围的长度,以及到此存储器范围的加载、存储或加载和存储是否生成异常以便由异常处理机或调试器应用来处理。此信息被存储在CAM结构内的表项中,并可根据访问操作的地址搜索以判定所述访问操作的地址是否落入由CAM结构中的表项之一指定的范围之内。如果是,并且所述访问操作是被指示为生成异常的访问操作,则可以生成异常并由异常处理机或调试器处理异常以便收集调试信息和/或执行应用的实际调试。无论应用是否为多线程应用,都可以执行此操作。异常处理机或调试器可以被配置为在多线程应用中标识难以发现的错误,例如竞争条件或对共享变量的恶魔访问。例如,为了检查竞争条件或恶魔访问,异常处理机或调试器可以进行检查以查看提交访问操作的线程是否在尝试所述访问操作之前已获得由所述访问操作中的地址指定的存储器位置上的锁。如果是,则调试器或异常处理机可以不执行任何操作并且允许应用继续执行。然而,如果尝试所述访问操作的线程没有首先获得存储器位置的锁,则调试器或异常处理机可以接管应用的执行并检索调试或跟踪信息以便在分析中使用,从而标识应用代码中的潜在错误。如果所述访问操作不是被指示为生成异常的访问操作,或者所述访问操作的地址未落入由CAM中的表项定义的存储器范围之一内,则可以执行所述访问操作而不生成异
堂
巾O
图2是根据一个示例性实施例的加载/存储单元的实例方块图。如图2中所示,增加了加载/存储单元230以包括内容可寻址存储器(CAM),其具有一个或多个CAM表项和搜索逻辑249。每个CAM表项包括起始地址242、长度244、存储位(S位)246和加载位(L位)248。起始地址242和长度244定义使用CAM 240监视的存储器的地址范围。起始地址242和长度244可以按照有效地址、虚拟地址、实地址或物理地址等指定,具体取决于特定的实施方式。S位246和L位248指定是监视针对由对应起始地址242和长度244指定的存储器地址范围的存储和加载指令/操作之一还是两者,即,应生成需要异常处理的异常。应指出,在示例性实施例的某些实施方式中,可以使用单个CAM结构240处理由在处理器架构中执行的所有线程所执行的所有加载/存储指令。备选地,可以针对每个线程提供单独的CAM结构240,以便CAM结构240与线程上下文关联。因此,加载/存储单元230可以具有多个CAM结构240,在处理器中执行的每个线程具有一个CAM结构240。备选地,在具有多个加载/存储单元230的架构中,每个加载/存储单元230可以针对它们处理的每个线程具有一个或多个CAM结构240。在多个CAM结构240的情况下,每个线程具有一个结构,哪个CAM结构240对应于哪个线程可以在特定线程的线程上下文信息中指定。 应用或调试器280可以在CAM 240中生成表项,以便监视特定存储器地址范围,并监视针对被监视存储器地址范围的特定指令,例如存储和/或加载指令。应理解,使用示例性实施例的机制,不需要监视被监视存储器的所有部分。相反,示例性实施例的机制允许应用或调试器280针对存储器的个体部分,即存储器的个体地址范围,以便可以执行有针对性的跟踪和调试。例如,CAM中的表项可以与对应于特定变量的存储器地址范围关联,因此,示例性实施例的机制可以用于根据此特定变量来跟踪和调试应用代码的执行。CAM 240的搜索逻辑249用于在同一处理器周期内快速搜索CAM240中的所有表项,并判定是否具有输入地址的匹配表项。具体地说,响应于发出队列210向加载/存储单元230发出指令220,搜索逻辑249接收与指令220关联的输入地址222。指令220可以是加载或存储指令。响应于接收到指令220及其输入地址222,搜索逻辑249搜索由CAM 240中的每个表项的起始地址242和长度244指定的地址范围,以判定输入地址222是否落入CAM 240中的表项的地址范围之内。如果是,则确定匹配表项的S位246和L位248的状态并将其与加载或存储指令220的操作码比较。如果指令220的操作码指示所述指令是存储指令,并且对应的匹配CAM表项的S位246被设置为预定值(例如1),则CAM 240的逻辑可以生成异常250。同样,如果指令220的操作码指示所述指令是加载指令,并且对应的匹配CAM表项的L位248被设置为预定值(例如1),则CAM 240的逻辑也可以生成异常250。如果所述指令是加载指令或存储指令,并且对应的S位246或L位248未被设置为预定值,则不生成异常,并且所述指令的执行简单地通过加载/存储单元230以正常方式继续。应指出,针对提交加载/存储指令220的每个线程执行此对CAM 240中的表项的检查。因此,可以在处理器中执行多个线程,并且每个线程都由其对应的CAM结构以上述方式检查,以判定加载/存储指令220是否针对感兴趣的地址范围并且是否是感兴趣的指令。因此,可以基本上同时监视多个线程,而不必如现有技术需要的那样按线程序列化对线程的监视。此外,CAM结构240允许针对存储器的个体地址范围以及个体指令类型,例如加载、存储或加载和存储两者。如果CAM 240生成异常250,则可以将该异常提供给异常处理机260。备选地,可以将该异常直接发送到应用或调试器280而不是具有单独的异常处理机260。可以预先注册异常处理机260或应用/调试器208以代表执行应用接收异常。这可以使用诸如UNIX的ptrace O系统调用或UNIX和UNIX式系统的信号处理机制之类的传统操作系统技术来执行。操作系统负责将异常引导到适当的实体(调试器或应用)以及适当的代码处理器,如在本领域中执行的那样。如果生成异常250,则将应用代码的执行转移到异常处理机260或应用/调试器280,它们然后可以运行以在跟踪数据结构270中收集跟踪/调试信息。应用/调试器280可以针对跟踪数据结构270运行以执行分析并标识应用代码中的潜在错误。例如,应用/调试器280可以通过基本上同时访问同一存储器地址范围的多个线程而标识潜在的竞争条件或恶魔访问。竞争条件或恶魔访问可能对应用代码的执行造成严重的问题,因为数据可能损坏或以其他方式对于尝试访问此数据的一个或多个线程而言变得不正确,这归因于一个线程正在修改数据,而另一个线程正在尝试使用该数据或以不同方式修改该数据。例如,第一线程的类型可以为 Lock(I);V+= I;Unlock (I);第二线程的类型可以为v+=2 ; //恶魔变量访问如果在进入第一线程之前v==3,则在退出之后v==4、v==5、v==6均有可能。如果在进入第二线程之前v==2,则同样如此。此外,如果在进入第二线程之前v==3,则也可能v==5和v==6。因此,如果并行执行第一和第二线程,则当在第一和第二线程中V值相同时,可能发生竞争条件或恶魔访问。可以针对线程2检测此类竞争条件或恶魔访问,因为线程2没有在尝试访问存储器位置之前获得此位置上的锁。这是一个简单的实例,但它示出了可能的问题。多线程应用中发生的实际错误通常比这更复杂,但同样可以使用示例性实施例的CAM结构和异常处理来检测。应用/调试器280可以提供调试器输出290,其详述了应用/调试器280针对存储在跟踪数据结构270中的跟踪信息执行的分析的结果。例如,应用/调试器280可以按线程标识可能的竞争条件或恶魔访问,标识涉及的线程以及引起竞争条件/恶魔访问的指令等。根据在跟踪数据结构270中收集的跟踪信息以及应用/调试器280执行的分析,可以提供各种类型的调试器输出290。图3是概述根据一个示例性实施例的加载/储单元的实例操作的流程图,此流程图关于当加载和/或存储指令(无论线程为何)尝试访问感兴趣的存储器地址范围时,使用内容可寻址存储器(CAM)触发异常。图3中的操作假设加载/存储单元中存在CAM结构,并使用指定调试器感兴趣的存储器地址范围的一个或多个表项填充所述CAM结构。如上所述,调试器可以向CAM结构中写入表项以标识调试器感兴趣的存储器地址范围,并可以针对调试器感兴趣的指令类型设置适当的S位和/或L位。可以向系统注册调试器以便处理由CAM结构生成的异常,如上面讨论的那样。如图3中所示,所述操作始于在加载/存储单元中接收加载或存储指令(步骤310)。在CAM中执行查找操作或搜索以获得在所述加载或存储指令中指定的地址,以便判定所指定的地址是否在所述CAM中的表项之一定义的地址范围内(步骤320)。判定是否存在匹配表项(步骤330)。如果有,则根据所述匹配表项的S位和L位的设置判定是否生成异常(步骤340)。例如,如上所述,如果所述指令是存储并且设置了 S位,或者如果所述指令是加载并且设置了 L位,则可以生成异常。否则,不生成异常。如果要生成异 常,则生成异常并将其发送到异常处理机或调试器(步骤350)。将发出加载或存储指令的线程的状态存储在堆栈中(步骤360),并针对生成异常的线程收集调试或跟踪信息(步骤370)。然后由异常处理机或调试器处理所述异常(步骤380)。例如,异常处理机可以分析收集的调试/跟踪信息并判定是否检测到已发生竞争条件或恶魔访问。其中可以检测此类情况的一种方法是判定发出加载或存储指令的线程是否在尝试针对存储器位置执行所述加载或存储之前,获得CAM中的对应表项的地址范围上的锁,或者至少由加载或存储指令中的地址标识的特定存储器位置上的锁。如果是,则没有竞争条件或恶魔访问。如果没有获得锁,则可能发生竞争条件或恶魔访问。因此,示例性实施例提供硬件机制,以便提供CAM结构以帮助调试应用代码。示例性实施例的机制尤其适用于帮助调试多线程应用代码,因为可以提供可与特定线程上下文关联的一个或多个CAM结构,以便每当处理器尝试访问存储器地址范围时生成异常,而无论尝试所述访问的特定线程为何。通过这种方式,可以针对感兴趣的特定地址范围和针对感兴趣的特定指令类型同时监视多个并行运行的线程。应理解,尽管按照在处理器的加载/存储单元中提供用于监视对特定存储器地址范围的加载和/或存储的CAM结构描述了示例性实施例,但示例性实施例并不限于此。相反,可以在处理器的其他功能单元中提供类似的CAM结构,以便监视在处理器中执行的不同类型的指令。例如,可以在图I的分支单元112、浮点单元122或124等中提供类似的CAM结构,以便监视不同类型的指令并生成对应的异常,从而生成调试或跟踪信息。关键概念是使用硬件CAM结构指定感兴趣的存储器地址沮围和感兴趣的指令类型,并在感兴趣的指令针对感兴趣的地址范围时生成异常,而无论哪个线程执行所述指令。如上所述,应理解,示例性实施例可以采取完全硬件实施例、完全软件实施例或包含了硬件和软件元素的实施例的形式。在一个实例实施例中,示例性实施例的机制以软件或程序代码实现,所述软件或程序代码包括但不限于固件、驻留软件、微代码等。适合于存储和/或执行程序代码的数据处理系统将包括至少一个直接或通过系统总线间接连接到存储器元件的处理器。所述存储器元件可以包括在程序代码的实际执行期间采用的本地存储器、大容量存储装置以及提供至少某些程序代码的临时存储以减少必须在执行期间从大容量存储装置检索代码的次数的高速缓冲存储器。输入/输出或I/O设备(包括但不限于键盘、显示器、指点设备等)可以直接或通过中间I/o控制器与系统相连。网络适配器也可以被连接到系统以使所述数据处理系统能够通过中间专用或公共网络变得与其他数据处理系统或远程打印机或存储设备相连。调制解调器、电缆调制解调器和以太网卡只是当前可用的网络适配器类型中的少数几种。出于示例和说明目的给出了对本发明的描述,并且所述描述并非旨在是穷举的或是将本发明限于所公开的形式。对于本领域的技术人员来说,许多修改和变化都将是显而易见的。实施例的选择和描述是为了最佳地解释本发明的原理、实际应用,并且当适合于所构想的特定使用时,使得本领域的其他技术人员能够理解本发明的具有各种修改的各种实施例。
权利要求
1.一种在数据处理系统的处理器中用于调试应用代码的方法,包括 在所述处理器的硬件单元中接收指令,所述指令具有在所述数据处理系统的存储器中的所述指令正在尝试访问的目标存储器地址; 搜索与所述硬件单元关联的内容可寻址存储器(CAM)以查找所述CAM中与所述目标存储器地址对应的表项; 响应于在所述CAM中找到与所述目标存储器地址对应的表项,判定所述表项中的信息是否将所接收的指令标识为感兴趣的指令;以及 响应于所述表项将所接收的指令标识为感兴趣的指令,生成异常并将所述异常发送到异常处理机或调试器应用之一。
2.根据权利要求I的方法,其中搜索所述CAM包括搜索所述CAM中的表项以查找具有与所述目标存储器地址所在的存储器地址范围对应的起始地址和长度的表项。
3.根据权利要求I的方法,其中判定所述表项中的信息是否将所述指令标识为感兴趣的指令包括 确定所接收的指令的类型; 判定所述表项中的值是否指示所接收的指令的类型是应针对其生成异常的指令类型;以及 响应于所述表项中的所述值指示所接收的指令的类型是应针对其生成异常的指令类型,确定所接收的指令是感兴趣的指令。
4.根据权利要求I的方法,其中所接收的指令的类型是加载指令或存储指令之一,并且其中所述表项中的所述值指示加载指令或存储指令是否是感兴趣的指令。
5.根据权利要求I的方法,其中由所述调试器应用创建所述CAM中的表项以标识所述存储器中出于调试目的而被监视的地址范围。
6.根据权利要求I的方法,其中所述异常处理机通过记录出现异常时特定变量的状态而确定在应用代码的执行期间在所述应用代码中的何处修改了该变量。
7.根据权利要求I的方法,其中所述异常处理机通过检查当另一线程在所接收的指令尝试访问变量的目标地址之前已获得保护同步对象时,所接收的指令是否针对所述变量的所述目标地址执行操作来检查竞争条件,并且其中在以下情况下不存在竞争条件所接收的指令未针对这样的变量的目标地址执行操作对于所述变量的所述目标地址,另一线程在所接收的指令尝试访问所述变量的所述目标地址之前已获得保护同步对象。
8.根据权利要求I的方法,其中所述处理器维护多个CAM,针对所述处理器支持的每个执行线程维护一个CAM。
9.根据权利要求I的方法,其中所述CAM中的表项包括起始地址、长度,以及标识感兴趣的指令的类型的一个或多个位,其中将所述一个或多个位设置为预定值指示对应类型的指令是要针对其生成异常的感兴趣的指令。
10.根据权利要求I的方法,其中所述异常处理机检查所接收的指令是否在未获得对应同步对象的情况下针对变量的目标地址执行操作。
11.一种数据处理系统,包括 处理器,包括具有内容可寻址存储器(CAM)的硬件单元;以及 耦合到所述处理器的存储器,其中所述处理器被配置为执行权利要求I至10中的任一权利要求的步骤。
12.—种计算机程序产品,包括具有记录在其上的计算机可读程序的计算机可记录介质,其中当所述计算机可读程序在计算设备上执行时,导致所述计算设备执行权利要求I至10中的任一权利要求的步骤。
全文摘要
提供了使用内容可寻址存储器调试应用代码的机制。所述机制在数据处理系统的处理器的硬件单元中接收指令,所述指令具有所述指令正在尝试访问的目标存储器地址。搜索与所述硬件单元关联的内容可寻址存储器(CAM)以查找所述CAM中与所述目标存储器地址对应的表项。响应于在所述CAM中找到与所述目标存储器地址对应的表项,判定所述表项中的信息是否将所述指令标识为感兴趣的指令。响应于所述表项将所述指令标识为感兴趣的指令,生成异常并将其发送到异常处理机或调试器应用之一。通过这种方式,可以以高效的方式执行多线程应用的调试。
文档编号G06F11/36GK102844744SQ201180019490
公开日2012年12月26日 申请日期2011年3月31日 优先权日2010年4月19日
发明者E·N·埃尔诺扎伊, A·盖特 申请人:国际商业机器公司