CN101295279B - 多线程环境下的调试程序的方法和系统 - Google Patents
多线程环境下的调试程序的方法和系统 Download PDFInfo
- Publication number
- CN101295279B CN101295279B CN2007101077513A CN200710107751A CN101295279B CN 101295279 B CN101295279 B CN 101295279B CN 2007101077513 A CN2007101077513 A CN 2007101077513A CN 200710107751 A CN200710107751 A CN 200710107751A CN 101295279 B CN101295279 B CN 101295279B
- Authority
- CN
- China
- Prior art keywords
- breakpoint
- instruction
- mentioned
- debugging
- debugged program
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明提供一种多线程环境下的调试程序的方法和系统。该多线程环境下的调试程序的方法,通过利用中断指令替换希望设置调试用断点的位置处的指令来中断上述被调试的程序的执行,该方法包括:在将上述中断指令替换回上述设置调试用断点的位置处的指令时,将该调试用断点的位置之前的指令设置为守护断点;并且在再次利用中断指令替换上述设置调试用断点的位置处的指令时,将上述守护断点替换回该被调试的程序的该位置处的原指令。本发明通过在被调试程序的一个线程执行到调试用断点而进入断点处理机制后,在该调试用断点前设置守护断点,来避免其它线程错过此调试用断点。并且,本发明无需挂起其它线程,能够以较低开销实现多线程环境下的程序调试。
Description
技术领域
本发明涉及数据处理领域,具体地,涉及多线程环境下的调试程序的方法和系统。
背景技术
计算机系统以及基于计算机的装置(例如工业自动化系统)通常由一个或多个中央处理器、用于存储数据或控制指令的随机存取存储器、用于数据或指令输入等与用户交互的输入输出接口以及其它相关部件组成。这样的计算机系统及基于计算机的装置,为了发挥作用,均离不开操作系统及应用软件的支持。所有的软件产品,在投入使用前均需要进行调试,以保证其运行结果的正确性,使其符合设计要求。因此,就要用到调试工具。
调试器(调试程序)是一种软件产品,可以用于启动其它软件产品(称为“被调试的程序”)并监视其执行(参照图1)。调试器有一项功能被称为“单步执行”,可以控制被调试的程序使其一步一步执行(相对于连续执行而言)。此外,调试器同样也可控制被调试的程序,使其连续执行到某个用户预设的位置而停下来,这种控制是通过在被调试的程序中设置调试用断点来实现的。无论是断点方式还是单步执行方式,在被调试的程序每执行到一个调试用断点或每单步执行之后,调试器都会接管被调试的程序的执行而进行调试工作。这些调试工作包括但不局限于:
1.查看变量的值,例如查看中央处理器的特定寄存器中的内容,从而使用户可以分析导致程序发生错误的原因;
2.暂停某部分或全部程序的执行,并通过交互用户接口将控制交给程序开发人员;
3.运行用户预定义的某个例程;
4.对被调试的程序的状态进行记录(生成快照),即将其在某个时刻的运行情况映象保存到某个外部存储装置中以备分析。
综上所述,调试器(或其它类似的工具)的断点机制的基本功能是:当执行指令序列到达某个预设位置时生成一个通知或中断。此预设位置是在运行期间动态设定的,而非在被调试的程序的开发过程中预编程。调试器处理这种断点的方法被称为“断点处理机制”。
以下,对调试器的断点处理机制进行详细说明。
--单线程的软件断点处理机制
目前使用最广泛的一种断点处理机制是软件断点处理机制。这种机制完全由软件实现,不依赖于任何特定的硬件机制,其历史悠久,在计算机刚刚诞生的时代就存在了。这种机制将被调试程序的指令序列中的调试用断点处的指令替换为一条中断指令。当程序运行到中断指令处时,就会“自陷入”操作系统之中(即操作系统将取得控制权),且操作系统进而将控制权转交给调试器,由其来执行具体的调试工作。在调试器完成调试工作之后,需要恢复被调试的程序的正常执行。此时调试器会将被中断指令取代的原指令写回到被调试的程序中原位置处,使其得以执行(此时中断指令被覆盖并不复存在)。因为此时中断指令已不复存在,所以调试器需要在交权给被调试的程序之前将其恢复,才能使下一次被调试的程序执行到此处时仍能正确触发断点机制。
需要说明的是,在上面的说明中使用“替换”或“写”,而并非“插入”指令,是因为计算机的二进制指令是与其存储位置密切相关的。如果简单地在一段指令序列中“插入”一条新的指令,则位于其后的所有指令都将无法执行。所以对二进制指令序列的唯一有效的修改方法就是将其部分指令替换掉,否则只能修改源代码并重新编译。
图2是传统的单线程环境下的软件断点处理机制的流程示意图。其中,图中上部分是被调试的程序在不同时刻的指令序列的状态,是由左至右按时间顺序的指令序列的变化过程。
具体地,如图2所示,在时刻t1,在被调试之前,被调试程序的指令序列未经调试器进行任何修改(201)。接着,在时刻t2,用户例如在被调试程序的指令“INSTR.3”的位置处设置了调试用断点,在此情况下,调试器在被调试程序的指令流中用自陷指令替换指令“INSTR.3”(步骤202)。
并且,在如上所述修改了指令流之后,在步骤203,调试器启动被调试的程序。
并且,在被调试的程序启动之后,在其执行到自陷指令时,操作系统接过程序控制(挂起正在运行的被调试的程序),并且将程序控制交给调试器,从而进入调试器的断点处理机制(步骤204)。
具体地,在该断点处理机制中,首先,在步骤205,保存被调试的程序的当前运行状态。在本步骤中,保存当前运行状态的目的,是使调试器在完成调试而将控制权返回给被调试的程序前,能够恢复其之前的运行状态,否则被调试程序的运行环境就被破坏了。
接着,在步骤206,进行调试工作。调试工作如前所述,如查看变量的值;暂停某部分或全部程序的执行,并通过交互用户接口获取程序开发人员的指令并执行之;执行用户预定义的某个例程;生成被调试程序的运行情况的快照等。
在步骤207,恢复调试用断点处的被调试程序的原指令,即将自陷指令替换回指令“INSTR.3”。此时,被调试程序的指令序列如图2中的时刻t3所示。
具体地,一旦调试工作完成,被调试的程序必须恢复执行。但是,不能简单地使被调试的程序在此时继续运行,因为在自陷指令后的是指令“INSTR.4”,而指令“INSTR.3”在此时尚未被执行。如前所述,计算机二进制指令是与其存储位置密切相关的,所以不能简单地到其它位置去执行指令“INSTR.3”。因此,调试器必须恢复指令“INSTR3”,即将该指令写回到原来的位置,才能保证被调试的程序正确地继续执行。
接着,在步骤208,启用单步执行机制。
具体地,在本步骤中启用单步执行机制的原因是,在指令“INSTR.3”被恢复之后,调试器不能简单地使被调试的程序直接继续执行。因为,在指令“INSTR.3”被恢复之后,被调试程序的指令流中就不再存在中断指令了,从而当被调试的程序下一次运行到指令“INSTR.3”的位置时,就不会再遇到之前那样的调试用断点了。因此,在执行过指令“INSTR.3”之后,调试器必须尽早地再次设置回调试用断点,即用自陷指令替换指令“INSTR.3”。从而,使被调试的程序仅执行一条指令,即指令“INSTR.3”,然后便将控制权再交给调试器。这也就是上面所述的单步执行机制。
此外,有些体系结构支持“硬件单步”(如英特尔公司的IA32架构),有些则不支持(如IBM公司的POWER架构)。如果系统支持“硬件单步”,则调试器启用“硬件单步”机制,否则调试器启用操作系统提供的“软件单步”机制,来使被调试的程序在仅执行一条指令后便产生一个“自陷”事件。
在步骤209,根据在步骤205保存的程序运行状态,调试器恢复被调试的程序在被中断之前的运行状态,并将程序控制权交给被调试的程序,使其继续执行。
接着,如步骤210所指示的,在时刻t3,指令“INSTR.3”被执行。
并且,由于是单步执行机制,所以如步骤211所指示的,在指令“INSTR.3”被执行之后、指令“INSTR.4”被执行之前,在时刻t4,另一个“自陷”事件被自动触发,从而调试器再次取得程序控制权,进入断点处理机制。
具体地,在步骤212,调试器禁用单步执行机制,以避免不必要的“自陷”事件再次发生。
接着,在步骤213,保存被调试的程序的当前运行状态。
在步骤214,用自陷指令替换“INSTR.3”指令,此时的指令流如图2的时刻t5所示。
在步骤215,根据在步骤213保存的程序运行状态,调试器恢复被调试的程序的运行状态。
在步骤216,调试器将程序控制返回给被调试的程序,从而使其继续执行。即如图2的时刻t5所指示的,被调试程序从指令“INSTR.4”开始继续向下执行其余的指令。
--多线程的断点处理解决方案
上述传统的软件断点处理机制不能用来调试多线程的被调试程序。这是因为,这种机制在对指令序列进行修改的过程中,会导致被调试的程序有一段时间在指令流内不存在中断指令(如图2中的时刻t3和时刻t4),称之为“危险间隙”,参照Norman Ramsey的“Correctness of Trap-basedBreakpoint Implementations”(Proceedings of the21st ACM Symposium onthe Principles of Programming Languages,1994年1月)。这段时间,对于处理日益快速的计算机系统而言,已经足够长,将会使执行到此位置的其它线程错过此调试用断点。这种情况在多处理器的机器上尤为严重。
针对这种多线程的被调试程序的情况,目前存在以下解决方案。
方法一:当处理调试用断点时挂起所有的线程
第一种方法是在调试器处理调试用断点之前挂起其它所有运行着的线程,直到调试器完成所有的断点处理操作之后再恢复被挂起线程的正常运行。
图3是该断点处理方法的流程示意图。如图3所示,当一个线程执行到一个调试用断点或“自陷”指令时,调试器首先在进行下一步断点操作之前挂起所有其它线程(步骤318)。并且,在再次设置断点指令之后、使被调试的程序恢复正常执行之前,调试器恢复所有被挂起的线程(步骤319)。此外,其余的步骤301-316均与图2中的步骤201-216相同。
这种方法虽然能够实现多线程的被调试程序的断点处理,但挂起及恢复所有其它线程的代价是巨大的,且该代价会随着线程数的增加而增大。
方法二:将原指令移动到其它位置
在某些情况下,例如在调试操作系统内核或固件的情况下,对线程的挂起往往是不可能的,或是这种操作极慢而令人无法忍受。djprobe在主页“http://sourceforge.net/project/showfiles.php?group id=41854”以及kprobe在主页“http://sourceware.org/systemtap/kprobes/”均提供了一种不会导致“危险间隙”、也不需要挂起其它线程的多线程调试方法。
具体地,在方法二中,将调试用断点处的被调试程序的原指令移动到其它位置执行,而且保证其意义不发生变化。图4是该断点处理方法的流程示意图。如图4所示,在调试器完成调试工作之后,指令“INSTR.3”在新的位置上执行(步骤420)。此外,其余的步骤401-406、409均与图2中的步骤201-206、209相同。
但是,如前所述,指令的意义与其位置密切相关,所以若要移动一条指令到新的位置上,必须对其进行彻底地解析,然后在新的位置上实现与其完全一致的逻辑意义,这往往导致该条指令膨胀为多条指令。并且,这种解析工作往往是比较复杂的,并且是与具体的硬件架构紧密相连的,需要依硬件架构的不同而不同。
方法三:硬件断点
第三种方法是采用硬件断点机制来实现。例如,一些处理器包括有断点寄存器,其中可以被存入一个地址,当处理器执行或访问到此地址时便触发中断。采用硬件断点机制,无需对被调试的程序的指令序列进行修改。
但是,这些断点寄存器的数目是相当有限的,例如在英特尔的X86架构中仅有4个硬件断点寄存器,这往往很难满足实际应用中的需求。另外,还有很多硬件架构不支持硬件断点机制。因此,硬件断点机制往往只能用来作为对软件断点机制的一种辅助。
因此,需要为多线程的被调试程序设计出一种简单、低开销的断点处理机制,来解决现有技术中所存在的问题。
发明内容
本发明正是鉴于上述现有技术中的问题而提出的,其目的在于提供一种多线程环境下的程序调试方法和系统,以便通过在被调试的程序的一个线程执行到调试用断点而进入断点处理机制后,在该断点前设置守护断点,来防止其它线程错过此调试用断点,同时又不使这些线程挂起,从而以相对较低的开销来实现多线程的被调试程序的调试。
根据本发明的一个方面,提供一种多线程环境下的调试程序的方法,其通过利用中断指令替换希望设置调试用断点的位置处的指令来中断上述被调试的程序的执行,其特征在于:在将上述中断指令替换回上述设置调试用断点的位置处的指令时,将该调试用断点的位置之前的指令设置为守护断点;并且在再次利用中断指令替换上述设置调试用断点的位置处的指令时,将上述守护断点替换回该被调试的程序的该位置处的原指令。
根据本发明的另一个方面,提供一种多线程环境下的调试程序的系统,其通过利用中断指令替换希望设置调试用断点的位置处的指令来中断上述被调试的程序的执行,该系统包括:守护断点设置单元,用于在上述中断指令被替换回上述设置调试用断点的位置处的指令时,将该调试用断点的位置之前的指令设置为守护断点;以及守护断点取消单元,用于在再次利用中断指令替换上述设置调试用断点的位置处的指令时,将上述守护断点替换回该被调试的程序的该位置处的原指令。
附图说明
相信通过以下结合附图对本发明具体实施方式的说明,能够使人们更好地了解本发明上述的特点、优点和目的。
图1是调试器与被调试的程序的关系的示意图;
图2是传统的单线程环境下的软件断点处理机制的流程示意图;
图3是传统的多线程环境下的一种断点处理机制的流程示意图;
图4是传统的多线程环境下的另一种断点处理机制的流程示意图;
图5是根据本发明实施例的多线程环境下的调试程序的方法的流程示意图;
图6(a)和6(b)分别示出了一段示例性源代码及其相应的控制流图;
图7是图5的方法中设置守护断点的过程的流程图;
图8(a)和8(b)分别示出了一段示例性指令流及其相应的控制流图;
图9是图8(b)的控制流图的数据结构示意图;以及
图10是根据本发明实施例的多线程环境下的调试程序的系统的方框图。
具体实施方式
本发明的核心思想是保证在被调试程序的指令流中至少有一个中断指令在调试用断点的位置处或其附近。具体地,在本发明中,在进行被调试程序的一个线程的断点操作期间,在调试用断点前设置一个用户不可见的“守护断点”,以便在调试操作完成后的恢复原指令、单步执行原指令的期间,能够保证至少还有一个断点在被调试程序的指令流中。
也就是说,本发明中,在为某个执行到调试用断点处的线程进行断点操作期间,一个守护断点就会被插入到这个用户可见的调试用断点之前。从而,使其它的线程要么遇到守护断点,要么遇到调试用断点而停下来,而不会错过用户所设置的调试用断点。
下面就结合附图对本发明的各个优选实施例进行详细的说明。首先,描述本发明的多线程环境下的调试程序的方法。
图5是根据本发明实施例的多线程环境下的调试程序的方法的流程示意图。其中,图中上部分是被调试的程序在不同时刻的指令序列的状态,是由左至右按时间顺序的指令序列的变化过程。
具体地,如图5所示,在时刻t1,在进行调试工作之前,被调试程序的指令序列未被调试系统进行任何修改(501)。需要说明的是,该被调试的程序是已由编译工具编译后的二进制指令序列。
接着,在时刻t2,用户例如通过用户接口在被调试程序的指令“INSTR.3”的位置处设置调试用断点,在此情况下,调试系统在被调试程序的指令流中用中断指令替换指令“INSTR.3”(步骤502)。其中,该中断指令是自陷指令。也就是说,在本实施例中,利用中断指令来中断被调试程序的执行,以使其进入基于当前的运行状态的调试阶段。
接着,在如上所述修改了被调试程序的指令流之后,调试系统根据用户的指示,启动被调试的程序(步骤503)。
并且,在被调试的程序启动之后,在其某一线程执行到自陷指令时,操作系统接过程序控制,将正在执行的该线程挂起,并且将程序控制交给调试系统,从而使其进入图5的步骤505-510所示的断点处理阶段(步骤504)。
具体地,在该断点处理阶段,首先,在步骤505,保存被调试程序的该线程的当前运行状态。在本步骤中,保存该线程的当前运行状态的目的,是使在断点处理阶段完成而要将控制权返回给该线程之前,能够恢复到该线程被中断之前的运行状态,否则,该线程的运行环境就被破坏了,从而以后的运行可能会出现错误,或无法再正确执行。
接着,在步骤506,进行调试操作。具体地,在该步骤中,根据该线程的当前执行情况,例如根据寄存器中变量的当前值等,对被调试的程序进行调试操作。如前面所介绍的,调试操作如:查看变量的值;暂停某部分或全部程序的执行,并通过交互用户接口获取程序开发人员的指令并执行之;执行用户预定义的某个例程;生成被调试程序的运行情况的快照等。
接着,在步骤507,在上述调试用断点之前设置守护断点。具体地,在本实施例中,在调试用断点、即自陷指令的前一指令处设置守护断点,即将该前一指令替换为守护中断指令。在本实施例中,该守护中断指令是自陷指令。此时,被调试程序的指令序列如图5中的时刻t3所示。
在本步骤中设置守护断点的目的是,在调试操作完成之后,为了单步执行在调试用断点处被中断指令替换的原指令,要替换回原指令,这样,将使得被调试程序的指令流中有一段时间不存在调试用断点,从而,利用守护断点来确保在这一段时间内、被调试程序的其它线程不会错过该调试用断点。
此外,关于本步骤中设置守护断点的过程的细节,将在后面结合图6-9进行详细描述。
接着,在步骤508,取消调试用断点,恢复调试用断点处的被调试程序的原指令,即将该位置处的自陷指令替换回指令“INSTR.3”。此时,被调试程序的指令序列如图5中的时刻t4所示。
具体地,一旦调试工作完成,被中断的线程必须恢复执行。但是,不能简单地使该线程在此时继续运行,因为在自陷指令后的是指令“INSTR.4”,而指令“INSTR.3”在此时尚未被执行。如前所述,计算机二进制指令是与其存储位置密切相关的,所以不能到其它位置去执行指令“INSTR.3”。因此,必须恢复指令“INSTR3”,即将该指令写回到原来的位置,才能保证该线程正确地继续执行。
接着,在步骤509,启用单步执行机制。
具体地,在本步骤中启用单步执行机制的原因是,在指令“INSTR.3”被恢复之后,不能简单地使被调试程序的该被中断的线程直接继续执行。因为,在指令“INSTR.3”被恢复之后,被调试程序的指令流中就不再存在中断指令了,从而当被调试的程序的其它线程运行到指令“INSTR.3”的位置时,就不会再遇到之前那样的调试用断点了。因此,在执行过指令“INSTR.3”之后,必须尽早地再次设置回调试用断点,即用自陷指令替换指令“INSTR.3”。从而,优选地,使被调试程序的该线程仅执行一条指令,即指令“INSTR.3”,然后便将控制权再交给调试系统。这就是上面所述的单步执行机制。
此外,有些体系结构支持“硬件单步”(如英特尔公司的IA32架构),有些则不支持(如IBM公司的POWER架构)。如果系统支持“硬件单步”,则在本步骤中启用“硬件单步”机制,否则启用操作系统提供的“软件单步”机制,来使被调试程序的该线程在仅执行一条指令后便产生一个“自陷”事件。
在步骤510,根据在步骤505保存的程序运行状态,恢复被调试程序的该线程在被中断之前的运行状态,并将程序控制权交给该线程,使其继续执行。
接着,如步骤511所指示的,在时刻t4,指令“INSTR.3”被执行。
并且,由于是单步执行机制,所以如步骤512所指示的,在指令“INSTR.3”被执行之后、指令“INSTR.4”被执行之前,在时刻t5,另一个“自陷”事件被自动触发,从而调试系统再次取得程序控制权,进入图5步骤513-518所示的断点处理阶段。
具体地,在该断点处理阶段,首先,在步骤513,禁用单步执行机制,以避免不必要的“自陷”事件再次发生。
接着,在步骤514,保存被调试程序的该线程的当前运行状态。
在步骤515,再次设置调试用断点,用自陷指令替换“INSTR.3”指令。即,在本步骤中,再次在指令“INSTR.3”的位置处设置调试用断点,以使被调试程序的其它线程在执行到此处时仍会被中断而进入调试阶段。
接着,在步骤516,取消守护断点,即用指令“INSTR.2”替换守护中断指令。在步骤515重新设置了调试用断点之后,守护断点就不再需要、也不应该再继续存在于被调试程序的指令流中,所以,在本步骤中,将在步骤507设置的守护中断指令替换回为被调试程序的原指令。
在步骤517,根据在步骤514保存的程序运行状态,恢复被调试程序的该线程因单步执行机制而被中断之前的运行状态。
接着,在步骤518,将程序控制返回给被调试程序的该线程,从而使其继续执行。即如图5的时刻t6所指示的,该线程从指令“INSTR.4”开始继续向下执行其余的指令。
上面就是本实施例的多线程环境下的调试程序的方法的整个流程。
下面,结合图6-9对上面的步骤507设置守护断点的过程进行详细说明。
设置守护断点的过程的一项重要工作是定位守护断点的设置位置。如前所述,在本实施例中,将守护断点设置在调试用断点的前一指令处。因此,在该过程中,首先需要定位调试用断点的前一指令。
中央处理器在运行程序时,必须依次确定下一条将要执行的指令的地址,才能保证程序的正常执行。程序计数器PC正是用于此目的的元件,其用来存放下一条指令的存储单元地址。通常,程序是顺序执行的。在开始执行之前,总是将第一条指令的地址放入PC。当第一条指令被取出执行时,控制器就使PC的内容自动增量,指明下一条要执行的指令的存储单元地址。在遇到需要改变程序执行顺序的情况时,由转移类指令将转移目标地址送往程序计数器,来实现程序的转移。因此,对于当前执行的指令而言,其地址可能是与上一条指令连续的,也可能是不连续的。因此,如果没有关于程序指令序列的附加信息,准确定位当前指令的前一条指令是困难的。
在本实施例中,利用在编译过程中记录的被调试程序的控制流信息和指令长度信息作为附加信息,来定位调试用断点的前一条指令。
图6示出了一段示例性源代码及其相应的控制流图,其中,图中左侧为该示例性源代码,右侧则为其相应的控制流图。
控制流图是在编译过程中、在中间语言的基础上建立的一个数据结构,用来抽象当前正在编译的程序的函数控制流的行为。具体地,控制流图是有向图,由有限个节点和节点间的有向边构成。其中,有向边是程序在执行过程中所有可能被执行到的路径;而每一个节点则代表着一个基本块。基本块是一段连续执行的代码,其只有一个入口和一个出口。
在获得了在编译过程中记录的被调试程序的指令序列的控制流图和各指令的长度信息之后,实现守护断点的设置将是容易的。
具体地,根据控制流图信息,可以确定调试用断点的地址是否是其所在基本块的基地址。如果是基本块的基地址,即是该基本块的第一条指令,则意味着该调试用断点的前一指令的地址可能与其不连续,并且这样的前一指令可能会存在若干条。但可以确定的是,这些前一指令是调试用断点所在基本块的父基本块的最后一条指令。因此,根据控制流图确定其父基本块的列表并定位每一父基本块中的最后一条指令,来设置守护断点即可。
另一方面,如果调试用断点的地址并不是其所在基本块的基地址,则可以确定该调试用断点与其前一指令在同一基本块中,并且其地址是连续的。但是,对于支持可变长度指令的体系结构而言,逆向确定前一指令的地址是困难的。因此,可根据各指令的长度信息,通过将该基本块中每条指令的长度累加到这个基本块的基地址上、直到累加和等于调试用断点的地址、然后再减去当前指令(调试用断点的上一条指令)的长度的方式,来定位调试用断点的前一指令。当然,如果可以直接确定调试用断点的地址和其前一指令的长度,则可以通过求出它们之间的差,来定位其前一指令。
图7示出了根据本发明实施例的设置守护断点的过程的详细流程。如图7所示,首先,在步骤701,获得调试用断点的地址,作为输入。在本步骤中,可以根据程序计数器的当前值来确定调试用断点的地址。
接着,在步骤702,根据控制流图,判断在步骤701获得的调试用断点的地址是否在基本块的入口,即判断调试用断点是否被设置到了基本块的第一条指令的位置。如果是,则前进到步骤703,否则前进到步骤709。
在步骤703,得到调试用断点所在基本块的父基本块的列表。在本步骤中,也是根据所获得的控制流图的信息来得到该父基本块的列表。也就是说,在控制流图中,由有向边连接的该调试用断点所在基本块的上一基本块即是其父基本块。
接着,在步骤704,取得在步骤703确定的父基本块列表中的第一个基本块。
在步骤705,判断该基本块是否仍是上述调试用断点所在基本块的父基本块,即判断上述父基本块的列表是否已被遍历完。若是,则前进到步骤706,否则转到步骤715。
在步骤706,确定该父基本块中最后一条指令的地址。具体地,在本步骤中,首先获得在编译过程中记录的该父基本块的基地址及其指令长度列表,并遍历该指令长度列表,以便将各指令的长度累加到该父基本块的基地址上,直到遍历完该指令长度列表为止,然后再用该累加和减去当前指令(该父基本块的最后一条指令)的长度,便是该父基本块的最后一条指令的地址。
接着,在步骤707,在步骤706确定的该父基本块的最后一条指令的地址处设置守护断点,即将该地址处的指令替换为中断指令。
然后,在步骤708,取得上述父基本块列表中的下一个基本块,并转到步骤705继续进行下一个父基本块的守护断点的设置。
另一方面,在步骤709,将上述调试用断点所在基本块的基地址赋值给变量CUR_ADDR。
接着,在步骤710,判断变量CUR_ADDR的值是否等于上述调试用断点的地址。若是,则转到步骤713,否则前进到步骤711。
在步骤711,将当前指令的长度累加到变量CUR_ADDR上。
在步骤712,从该基本块的指令长度列表中读取下一条指令的长度,并返回至步骤710。
另一方面,在步骤713,用变量CUR_ADDR的值减去当前指令的长度,得到上述调试用断点的前一条指令的地址,即守护断点的设置位置。
在步骤714,在步骤713确定的位置处设置守护断点,即将该位置处的指令替换为中断指令。
接着,在步骤715,流程结束。
下面以具体示例来说明。
图8示出了一段示例性指令流及其相应的控制流图,其中,左侧的指令流在右侧相应的控制流图中被划分为基本块“BB.a”、“BB.b”以及“BB.c”。图9是图8的控制流图的数据结构示意图。
在图8、9的情况下,如果用户在指令“INST.4”的位置处设置了调试用断点,则由于指令“INST.4”不在基本块“BB.c”的入口,所以遍历图9所示的基本块“BB.c”的指令长度列表,将每条指令的长度累加到基本块“BB.c”的基地址上,直到累加和等于指令“INST.4”的地址(即调试用断点的地址)为止。然后,将累加和减去当前指令的长度(指令“INST.3”的长度是4),就是上一条指令“INST.3”的地址。从而,可以在指令“INST.3”的位置处设置守护断点。
此外,如果用户在指令“INST.3”的位置处设置了调试用断点,则由于指令“INST.3”是基本块“BB.c”的入口,所以在基本块“BB.c”的父基本块“BB.a”、“BB.b”的最后一条指令处分别设置守护断点,即在指令“INST.2”和“jne L:”处设置守护断点。
以上,是针对于将守护断点设置在调试用断点的前一指令处的情况来进行描述的,但是,并不限于此,只要能够达到守护调试用断点的目的,可将守护断点设置在被调试程序中的任何位置处。
以上,就是对本实施例的多线程环境下的调试程序的方法的详细描述。
本实施例通过在被调试程序的调试用断点前插入守护断点,来避免在被调试程序的某一线程执行到调试用断点而进入调试时,使其它线程错过该调试用断点。本实施例无需将其它的线程挂起,能够以较低的开销实现多线程环境下的程序调试。
在同一发明构思下,图10是示出根据本发明实施例的多线程环境下的调试程序的系统的方框图。
如图10所示,本实施例的多线程环境下的调试程序的系统10包括:调试用断点设置用户接口101、调试用断点设置单元102、程序启动单元103、程序挂起单元104、调试单元105、守护断点设置单元106、调试用断点取消单元107、单步执行单元108以及守护断点取消单元109。
其中,调试用断点设置用户接口101用于允许用户为被调试的程序设置调试用断点。
调试用断点设置单元102用于将被调试的程序的、用户设置调试用断点的位置处的指令替换为中断指令。也就是说,该调试用断点不是在程序编译过程中预编程的,而是在程序调试过程中动态设置的。
程序启动单元103用于根据用户的指示启动被调试的程序或使被挂起的被调试程序继续执行。
程序挂起单元104用于在被调试的程序的一个线程执行至调试用断点时,使该正在运行的被调试程序挂起,使其进入断点处理阶段,并保存其当前运行状态。
调试单元105用于在被调试的程序被挂起时,根据该被调试的程序的当前运行状态,对其进行调试操作。
守护断点设置单元106用于在调试单元105进行完调试操作之后,在调试用断点处的中断指令被替换回原指令之前,为被调试的程序设置守护断点。具体地,将该调试用断点的位置之前的指令设置为守护断点。关于该守护断点设置单元106的具体结构,将在下文进行详细描述。
接着,调试用断点取消单元107用于在守护断点设置单元106设置守护断点之后,取消被调试的程序的调试用断点。即将该调试用断点处的中断指令替换回该被调试程序的该位置处的原指令。
单步执行单元108用于单步执行调试用断点取消单元107所替换回的原指令,并在单步执行之后再次使被调试的程序陷入中断处理阶段。并且,在此中断处理阶段,调试用断点设置单元102将该原指令再次替换为中断指令,从而再次在该位置处设置调试用断点。
守护断点取消单元109用于在调试用断点设置单元102再次设置调试用断点之后,取消守护断点,即将守护断点处的中断指令替换回该被调试程序的该位置处的原指令。
此外,如图10所示,守护断点设置单元106进一步包括:程序信息获取单元1061、守护断点定位单元1062以及守护中断写入单元1063。
其中,程序信息获取单元1061用于获取在编译过程中记录的被调试程序的控制流信息和指令的长度信息。
守护断点定位单元1062用于定位守护断点的设置位置。具体地,其根据程序信息获取单元1061获取的控制流信息,判断被调试程序的调试用断点的地址是否是基本块的入口地址。
在该调试用断点是基本块的入口地址的情况下:守护断点定位单元1062根据控制流信息确定该基本块的父基本块的列表,并根据各父基本块的入口地址以及其中各指令的长度信息,依次定位各父基本块的最后一条指令的位置。关于此情况下定位守护断点的设置位置的方式,在前面已经结合图7进行了详细描述,因而在此省略其具体细节。
另一方面,在调试用断点的地址不是基本块的入口地址的情况下:守护断点定位单元1062获取该调试用断点处的地址及其前一指令的长度,并用该调试用断点处的地址减去该前一指令的长度,从而定位所求出的差值的对应地址。此外,在无法直接确定调试用断点的前一指令的长度的情况下,守护断点定位单元1062根据该基本块的指令长度信息,将该基本块的各条指令的长度依次累加到该基本块的入口地址上,直到累加和等于调试用断点的地址为止,从而定位将该累加和减去当前指令(调试用断点之前的指令)的长度而得到的地址。并且,关于此情况下定位守护断点的设置位置的方式,在前面也已经结合图7进行了详细描述,因而在此省略其具体细节。
守护中断写入单元1063用于将守护断点定位单元1062定位的位置处的指令替换为守护中断指令,即自陷指令。
以上,就是对本实施例的多线程环境下的调试程序的系统的详细描述。本领域的技术人员应当理解,本实施例的系统及其各个组成部分可以由可编程硬件设备的硬件电路实现,也可以用由各种类型的处理器执行相应的软件的方式实现,也可以由上述硬件电路和软件的结合实现。并且这些各个组成部分也可以物理上集中在一起实施,也可以物理上相互独立而操作上互相协作。
综上所述,本发明的多线程环境下的调试程序的方法和系统,通过设置守护断点,而在断点处理过程中所耗费的系统资源相对较低,并且本发明的实现简单,不依赖于任何特定的系统结构,可移植性较高。
具体地,用以下几种情形为例来说明本发明的优点。
1.对用解释性语言(诸如Java、Ruby、C#等)编写的程序或者为一些非常慢的处理器编写的程序进行调试的情形:线程操作(诸如挂起线程或继续执行线程等)比编译语言(诸如C或C++)慢几个数量级,所以要尽可能地避免线程操作。但在应用本发明的情形下,无须挂起其它活动线程,并且设置守护断点的方式几乎不需要增加操作和执行的复杂度。
2.对不能被挂起的程序进行调试的情形:有些程序是不能被挂起的,如操作系统内核、控制硬件的固件、无线通信协议栈和某些对实时性要求较高的程序。为了调试、跟踪或者调优这些程序,调试器应尽量减少它的操作痕迹。本发明无需挂起其它活动线程,并且不需要移动指令到其它位置去执行,便可实现多线程调试,显然适合于这样的情形。
3.软件产品需要被移植到不同的体系结构的情形:本发明几乎不依赖于系统的体系结构,并且不需要应用特殊的硬件机制,其移植简单,因此适合于这样的情形。
以上虽然通过一些示例性的实施例对本发明的多线程环境下的调试程序的方法和系统进行了详细的描述,但是以上这些实施例并不是穷举的,本领域技术人员可以在本发明的精神和范围内实现各种变化和修改。因此,本发明并不限于这些实施例,本发明的范围仅以所附权利要求为准。
Claims (16)
1.一种多线程环境下的调试程序的方法,其通过利用中断指令替换希望设置调试用断点的位置处的指令来中断上述被调试的程序的执行,其特征在于:
在将上述中断指令替换回上述设置调试用断点的位置处的指令之前,将该调试用断点的前一指令设置为守护断点,该步骤进一步包括:
定位上述守护断点的设置位置;
将该定位守护断点的设置的位置处的指令替换为守护中断指令;
其中所述定位上述守护断点的设置位置的步骤进一步包括:
根据上述被调试的程序的控制流信息和各指令的长度信息,来定位上述调试用断点的前一指令的位置,该步骤进一步包括:
根据上述控制流信息,判断上述调试用断点的地址是否是基本块的入口地址;
在上述调试用断点的地址是基本块的入口地址的情况下:
根据上述控制流信息查找出该基本块的所有父基本块;
根据上述各父基本块的入口地址以及其中各指令的长度信息,获得各父基本块的最后一条指令的地址;
定位上述所获得的各父基本块的最后一条指令的地址;
在上述调试用断点的地址不是基本块的入口地址的情况下:
获取该调试用断点处的地址以及前一指令的长度;
将该调试用断点处的地址减去前一指令的长度;以及
定位上述将该调试用断点处的地址减去前一指令的长度而获得的地址;
在再次利用中断指令替换上述设置调试用断点的位置处的指令之后,将上述守护断点替换回该被调试的程序的该设置守护断点的设置的位置处的原指令;
其中上述中断指令是自陷指令,上述守护中断指令是自陷指令;上述控制流信息是上述被调试的程序的控制流图的数据结构,其由连续执行代码的基本块和基本块之间的控制流向构成。
2.如权利要求1所述的多线程环境下的调试程序的方法,包括:
在上述被调试的程序运行之前:
在该被调试的程序中设置上述调试用断点;
将上述被调试的程序的、设置上述调试用断点的位置处的指令替换为中断指令;以及
启动该被调试的程序。
3.如权利要求1所述的多线程环境下的调试程序的方法,包括:
在上述被调试的程序的一个线程执行至上述调试用断点时:
挂起正在运行的该被调试的程序;以及
根据该被调试的程序的当前运行状态,对该被调试的程序进行调试操作。
4.如权利要求3所述的多线程环境下的调试程序的方法,其中上述设置守护断点的步骤在上述进行调试操作的步骤之后进行。
5.如权利要求4所述的多线程环境下的调试程序的方法,在上述设置守护断点的步骤之后还包括:
取消上述被调试的程序的上述调试用断点,以将该调试用断点处的指令替换回该被调试的程序的该设置调试用断点的位置处的原指令;
单步执行上述被替换回的设置调试用断点位置处的原指令;以及
在单步执行上述原指令之后,再次在该被替换回的设置调试用断点位置处的原指令的位置处设置调试用断点,以将该被替换回的设置调试用断点位置处的原指令替换为中断指令。
6.如权利要求5所述的多线程环境下的调试程序的方法,其中所述在再次利用中断指令替换上述设置调试用断点的位置处的指令之后,将上述守护断点替换回该被调试的程序的该定位守护断点的设置的位置处的原指令包括:在再次设置调试用断点之后,取消上述被调试的程序的上述守护断点,以将该守护断点处的指令替换回该设置守护断点的位置处的原指令。
7.如权利要求6所述的多线程环境下的调试程序的方法,在所述取消上述被调试的程序的守护断点的步骤之后还包括:
使上述被调试的程序继续执行。
8.如权利要求1所述的多线程环境下的调试程序的方法,其中上述控制流信息和各指令的长度信息是在上述被调试的程序的编译过程中记录的。
9.一种多线程环境下的调试程序的系统,其通过利用中断指令替换希望设置调试用断点的位置处的指令来中断上述被调试的程序的执行,其特征在于,该系统包括:
守护断点设置单元,用于在上述中断指令被替换回上述设置调试用断点的位置处的指令之前,将该调试用断点的前一指令设置为守护断点;
守护断点取消单元,用于在再次利用中断指令替换上述设置调试用断点的位置处的指令之后,将上述守护断点替换回该被调试的程序的该设置守护断点的位置处的原指令;
其中该守护断点设置单元进一步包括:
守护断点定位单元,用于定位上述守护断点的设置位置;
程序信息获取单元,用于获取在编译过程中记录的上述被调试的程序的控制流信息和指令的长度信息;
守护中断写入单元,用于将上述定位守护断点的设置位置处的指令替换为守护中断指令;
其中,上述守护断点定位单元根据上述控制流信息,判断上述调试用断点的地址是否是基本块的入口地址;
在上述调试用断点的地址是基本块的入口地址的情况下:
该守护断点定位单元根据上述控制流信息查找出该基本块的所有父基本块,并根据上述各父基本块的入口地址以及其中各指令的长度信息,定位上述各父基本块的最后一条指令的位置;
在上述调试用断点的地址不是基本块的入口地址的情况下:
该守护断点定位单元获取该调试用断点处的地址以及前一指令的长度,定位将该调试用断点处的地址减去前一指令的长度而获得的地址;
并且其中上述中断指令是自陷指令,上述守护中断指令是自陷指令,上述控制流信息是上述被调试的程序的控制流图的数据结构,其由连续执行代码的基本块和基本块之间的控制流向构成。
10.如权利要求9所述的多线程环境下的调试程序的系统,进一步包括:
调试用断点设置用户接口,用于允许用户为上述被调试的程序设置调试用断点;以及
调试用断点设置单元,用于将上述被调试的程序的、用户设置调试用断点的位置处的指令替换为中断指令。
11.如权利要求10所述的多线程环境下的调试程序的系统,进一步包括:
程序启动单元:用于启动上述被调试的程序或使被挂起的该被调试的程序继续执行。
12.如权利要求11所述的多线程环境下的调试程序的系统,进一步包括:
程序挂起单元,用于在上述被调试的程序的一个线程执行至上述调试用断点时,使该正在运行的被调试的程序挂起并保存其当前运行状态;以及
调试单元,用于在上述被调试的程序被挂起时,根据该被调试的程序的当前运行状态,对其进行调试操作。
13.如权利要求12所述的多线程环境下的调试程序的系统,其中上述守护断点设置单元在上述调试单元进行调试操作之后为该被调试的程序设置守护断点。
14.如权利要求13所述的多线程环境下的调试程序的系统,进一步包括:
调试用断点取消单元,用于在上述守护断点设置单元设置守护断点之后,取消上述被调试的程序的上述调试用断点,以将该调试用断点处的中断指令替换回该被调试的程序的该设置调试用断点位置处的原指令;以及
单步执行单元,用于单步执行上述被替换回的设置调试用断点位置处的原指令。
15.如权利要求14所述的多线程环境下的调试程序的系统,其中在上述单步执行单元执行上述被替换回的设置调试用断点位置处的原指令之后,上述调试用断点设置单元将该被替换回的设置调试用断点位置处的原指令再次替换为中断指令,从而再次在该替换为中断指令的位置处设置调试用断点。
16.如权利要求9所述的多线程环境下的调试程序的系统,其中上述控制流信息和各指令的长度信息是在上述被调试的程序的编译过程中记录的。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2007101077513A CN101295279B (zh) | 2007-04-29 | 2007-04-29 | 多线程环境下的调试程序的方法和系统 |
US12/110,430 US8201152B2 (en) | 2007-04-29 | 2008-04-28 | Method and system for debugging a program in a multi-thread environment |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2007101077513A CN101295279B (zh) | 2007-04-29 | 2007-04-29 | 多线程环境下的调试程序的方法和系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101295279A CN101295279A (zh) | 2008-10-29 |
CN101295279B true CN101295279B (zh) | 2012-05-09 |
Family
ID=39888569
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2007101077513A Expired - Fee Related CN101295279B (zh) | 2007-04-29 | 2007-04-29 | 多线程环境下的调试程序的方法和系统 |
Country Status (2)
Country | Link |
---|---|
US (1) | US8201152B2 (zh) |
CN (1) | CN101295279B (zh) |
Families Citing this family (37)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7926037B2 (en) * | 2006-01-19 | 2011-04-12 | Microsoft Corporation | Hiding irrelevant facts in verification conditions |
JP5163230B2 (ja) * | 2008-03-31 | 2013-03-13 | 富士通株式会社 | 検証プログラム、該プログラムを記録した記録媒体、検証装置、および検証方法 |
US8635603B2 (en) * | 2008-10-21 | 2014-01-21 | International Business Machines Corporation | Handling debugger breakpoints in a shared instruction system |
US8413120B2 (en) * | 2008-10-27 | 2013-04-02 | Advanced Micro Devices, Inc. | Method and system for thread monitoring |
US9645912B2 (en) * | 2008-12-01 | 2017-05-09 | Microsoft Technology Licensing, Llc | In-place function modification |
US8881106B2 (en) * | 2009-12-26 | 2014-11-04 | Intel Corporation | Debugging parallel software using speculatively executed code sequences in a multiple core environment |
WO2011089478A1 (en) * | 2010-01-25 | 2011-07-28 | Freescale Semiconductor, Inc. | Debugger system, method and computer program product for debugging instructions |
US9176845B2 (en) * | 2010-03-19 | 2015-11-03 | Red Hat, Inc. | Use of compiler-introduced identifiers to improve debug information pertaining to user variables |
US8572579B2 (en) * | 2010-08-19 | 2013-10-29 | Oracle International Corporation | Break on next called function or method in java debugger agent |
US8661413B2 (en) | 2011-04-13 | 2014-02-25 | International Business Machines Corporation | Impact indication of thread-specific events in a non-stop debugging environment |
US8776025B2 (en) * | 2011-11-04 | 2014-07-08 | International Business Machines Corporation | Integrated debugger and code coverage tool |
US9087153B2 (en) | 2011-11-04 | 2015-07-21 | International Business Machines Corporation | Code coverage framework |
US8726244B2 (en) * | 2011-11-09 | 2014-05-13 | Mediatek Singapore Pte. Ltd. | Software breakpoint handling by eliminating instruction replacement and execution under certain conditions |
US8832505B2 (en) * | 2012-06-29 | 2014-09-09 | Intel Corporation | Methods and apparatus to provide failure detection |
CN103577315B (zh) * | 2012-07-30 | 2017-02-22 | 国际商业机器公司 | 反向调试器和反向调试方法 |
US9274931B2 (en) * | 2013-05-06 | 2016-03-01 | International Business Machines Corporation | Inserting implicit sequence points into computer program code to support debug operations |
US20150052400A1 (en) | 2013-08-19 | 2015-02-19 | Concurix Corporation | Breakpoint Setting Through a Debugger User Interface |
EP3036636A4 (en) * | 2013-08-19 | 2017-06-21 | Microsoft Technology Licensing, LLC | Snapshotting executing code with a modifiable snapshot definition |
US9122796B2 (en) * | 2013-09-27 | 2015-09-01 | International Business Machines Corporation | Recreating timing issues during program debug |
CN104778116B (zh) * | 2014-01-09 | 2018-09-18 | 深圳市中兴微电子技术有限公司 | 一种多断点的软件调试装置和方法 |
GB2526088B (en) * | 2014-05-12 | 2016-03-30 | Sony Comp Entertainment Europe | Apparatus and method of data capture |
US9239773B1 (en) * | 2014-10-29 | 2016-01-19 | Cadence Design Systems, Inc. | Method and system for debugging a program that includes declarative code and procedural code |
CN104461876B (zh) * | 2014-11-26 | 2017-09-22 | 北京航空航天大学 | 一种基于运行快照序列的并行程序重现调试方法 |
CN104536892B (zh) * | 2015-01-05 | 2018-03-27 | 瑞斯康达科技发展股份有限公司 | 一种软件在线调试方法和系统 |
GB2552519A (en) | 2016-07-27 | 2018-01-31 | Undo Ltd | Debugging Systems |
TWI659361B (zh) * | 2018-01-09 | 2019-05-11 | 國立中央大學 | 支援多執行緒/並行程式除錯之方法、電腦可讀取之記錄媒體及電腦程式產品 |
US10817406B2 (en) * | 2018-03-30 | 2020-10-27 | Ab Initio Technology Llc | Debugging an executable control flow graph that specifies control flow |
CN108984392B (zh) * | 2018-06-12 | 2021-07-16 | 珠海市杰理科技股份有限公司 | 单步调试方法和调试器 |
CN110968494A (zh) * | 2018-09-28 | 2020-04-07 | 珠海格力电器股份有限公司 | 一种软件调试方法、装置及计算机存储介质 |
CN109582561B (zh) * | 2018-10-16 | 2022-02-08 | 创新先进技术有限公司 | 一种在线可视化编程的调试方法及装置 |
CN110489294B (zh) * | 2019-08-23 | 2023-12-19 | 上海光电医用电子仪器有限公司 | 一种基于日志实时单步调试方法和装置 |
CN112445696B (zh) * | 2019-09-02 | 2022-09-13 | 无锡江南计算技术研究所 | 面向异构众核Dcache纵向一致性的调试方法 |
CN110955598B (zh) * | 2019-11-20 | 2024-02-27 | 杭州迪普科技股份有限公司 | 一种内核态程序的断点处理方法及装置 |
CN111092767B (zh) * | 2019-12-20 | 2022-10-18 | 北京百度网讯科技有限公司 | 用于调试设备的方法及装置 |
CN111367742A (zh) * | 2020-03-02 | 2020-07-03 | 深圳中微电科技有限公司 | 调试mvp处理器的方法、装置、终端和计算机可读存储介质 |
CN114741434B (zh) * | 2022-06-10 | 2022-09-06 | 北京亿赛通科技发展有限责任公司 | 一种海量es搜索数据的预统计方法及系统 |
CN115048145B (zh) * | 2022-06-14 | 2023-04-25 | 海光信息技术股份有限公司 | 一种信息采集方法、装置及相关设备 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1316074A (zh) * | 1998-12-22 | 2001-10-03 | 皇家菲利浦电子有限公司 | 中断/软件控制的线程处理 |
CN1335962A (zh) * | 1999-09-07 | 2002-02-13 | 皇家菲利浦电子有限公司 | 面向线程的调试 |
US20040205747A1 (en) * | 2000-12-21 | 2004-10-14 | Debra Bernstein | Breakpoint for parallel hardware threads in multithreaded processor |
US20040205719A1 (en) * | 2000-12-21 | 2004-10-14 | Hooper Donald F. | Hop method for stepping parallel hardware threads |
US20050034024A1 (en) * | 1998-11-13 | 2005-02-10 | Alverson Gail A. | Debugging techniques in a multithreaded environment |
US20050246691A1 (en) * | 2004-04-29 | 2005-11-03 | Cheng-Hsueh Hsieh | Debugging tool for debugging multi-threaded programs |
Family Cites Families (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US194425A (en) * | 1877-08-21 | Improvement in pen-holders | ||
JPS56129950A (en) * | 1980-03-07 | 1981-10-12 | Hitachi Ltd | Information processor |
US5399898A (en) * | 1992-07-17 | 1995-03-21 | Lsi Logic Corporation | Multi-chip semiconductor arrangements using flip chip dies |
US5321277A (en) * | 1990-12-31 | 1994-06-14 | Texas Instruments Incorporated | Multi-chip module testing |
US5297274A (en) * | 1991-04-15 | 1994-03-22 | International Business Machines Corporation | Performance analysis of program in multithread OS by creating concurrently running thread generating breakpoint interrupts to active tracing monitor |
US5533192A (en) * | 1994-04-21 | 1996-07-02 | Apple Computer, Inc. | Computer program debugging system and method |
US5687375A (en) * | 1994-10-14 | 1997-11-11 | International Business Machines Corporation | Debugging of High Performance Fortran programs with backup breakpoints |
US6263489B1 (en) * | 1998-04-30 | 2001-07-17 | Hewlett-Packard Company | Method and apparatus for debugging of optimized code |
JP3571976B2 (ja) * | 1999-11-08 | 2004-09-29 | 富士通株式会社 | デバッグ装置及び方法並びにプログラム記録媒体 |
JP3339482B2 (ja) * | 1999-12-15 | 2002-10-28 | 日本電気株式会社 | 分散デバッグ装置及びデバッグ方法並びに制御プログラムを記録した記録媒体 |
US6681384B1 (en) * | 1999-12-23 | 2004-01-20 | International Business Machines Corporation | Multi-threaded break-point |
US7168067B2 (en) * | 2002-02-08 | 2007-01-23 | Agere Systems Inc. | Multiprocessor system with cache-based software breakpoints |
US6978399B2 (en) * | 2002-09-12 | 2005-12-20 | International Business Machines Corporation | Debug thread termination control points |
JP4718901B2 (ja) * | 2005-05-27 | 2011-07-06 | パナソニック株式会社 | 命令実行装置、デバッグ方法、デバッグ装置及びデバッグプログラム |
US20080127119A1 (en) * | 2006-10-02 | 2008-05-29 | Bulent Kasman | Method and system for dynamic debugging of software |
-
2007
- 2007-04-29 CN CN2007101077513A patent/CN101295279B/zh not_active Expired - Fee Related
-
2008
- 2008-04-28 US US12/110,430 patent/US8201152B2/en not_active Expired - Fee Related
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20050034024A1 (en) * | 1998-11-13 | 2005-02-10 | Alverson Gail A. | Debugging techniques in a multithreaded environment |
CN1316074A (zh) * | 1998-12-22 | 2001-10-03 | 皇家菲利浦电子有限公司 | 中断/软件控制的线程处理 |
CN1335962A (zh) * | 1999-09-07 | 2002-02-13 | 皇家菲利浦电子有限公司 | 面向线程的调试 |
US20040205747A1 (en) * | 2000-12-21 | 2004-10-14 | Debra Bernstein | Breakpoint for parallel hardware threads in multithreaded processor |
US20040205719A1 (en) * | 2000-12-21 | 2004-10-14 | Hooper Donald F. | Hop method for stepping parallel hardware threads |
US20050246691A1 (en) * | 2004-04-29 | 2005-11-03 | Cheng-Hsueh Hsieh | Debugging tool for debugging multi-threaded programs |
Also Published As
Publication number | Publication date |
---|---|
US20080270988A1 (en) | 2008-10-30 |
US8201152B2 (en) | 2012-06-12 |
CN101295279A (zh) | 2008-10-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101295279B (zh) | 多线程环境下的调试程序的方法和系统 | |
EP3362889B1 (en) | Move prefix instruction | |
KR101325229B1 (ko) | 비대칭 멀티프로세서 장치의 진단연산 수행 | |
US5974538A (en) | Method and apparatus for annotating operands in a computer system with source instruction identifiers | |
US7950001B2 (en) | Method and apparatus for instrumentation in a multiprocessing environment | |
CN100555218C (zh) | 用于改善片上仿真系统中高级语言的仿真速度的装置和方法 | |
CN104111848B (zh) | 一种基于异步检查点的多线程软件动态升级方法 | |
US8312455B2 (en) | Optimizing execution of single-threaded programs on a multiprocessor managed by compilation | |
US8806447B2 (en) | Step-type operation processing during debugging by machine instruction stepping concurrent with setting breakpoints | |
EP0926592A2 (en) | Software emulation system | |
EP1132814B1 (en) | Computer system and interruption mechanism | |
US20090165016A1 (en) | Method for Parallelizing Execution of Single Thread Programs | |
IL100991A (en) | Method for translating a first program cipher to a second program cipher | |
CN100359486C (zh) | 一种调试操作系统内核态程序的方法及装置 | |
CN105446806A (zh) | 一种应用程序无响应的处理方法及装置 | |
Braun et al. | A universal technique for fast and flexible instruction-set architecture simulation | |
US8661417B2 (en) | Debugging program function | |
CN101782868A (zh) | 一种用于对本地方法调用进行性能测试的方法和装置 | |
CN108182082A (zh) | 一种流水处理双发射处理器记分板电路 | |
CN102662845B (zh) | 一种实现经过性数据断点的方法、装置及系统 | |
CN101237350B (zh) | 用于多任务环境单板机的全局变量异常改写定位方法 | |
EP3619612B1 (en) | Temporary de-optimization of target functions in a cloud debugger | |
KR20190076217A (ko) | 멀티 코어를 이용한 동적 바이너리 인스트루멘테이션 장치 및 방법 | |
CN103593320B (zh) | 多处理器系统、装置和方法 | |
KR20120036629A (ko) | 디버깅 장치 및 방법 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20120509 |