|Publication number||US7047520 B2|
|Application number||US 10/121,898|
|Publication date||May 16, 2006|
|Filing date||Apr 11, 2002|
|Priority date||Oct 25, 2001|
|Also published as||US20030084375|
|Publication number||10121898, 121898, US 7047520 B2, US 7047520B2, US-B2-7047520, US7047520 B2, US7047520B2|
|Inventors||Richard John Moore, Suparna Bhattacharya|
|Original Assignee||International Business Machines Corporation|
|Export Citation||BiBTeX, EndNote, RefMan|
|Patent Citations (2), Referenced by (49), Classifications (9), Legal Events (4)|
|External Links: USPTO, USPTO Assignment, Espacenet|
The present invention relates to debugging computer programs, and in particular to a method of debugging or probing programs that involves use of a virtual memory paging mechanism.
A watchpoint (also known as a hardware breakpoint) defines a contiguous range of addresses in computer memory that will trigger an interruption to program execution if any address within the range is referenced by the program. The interrupt so generated is known as a watchpoint interrupt, or alternatively as a debug interrupt or debug exception, since it is typically employed for debugging or monitoring purposes. A watchpoint interrupt causes current program execution to be suspended, and execution to continue in special code called a watchpoint (or debug) interrupt handler. Interrupts generated synchronously though execution of a machine instruction are frequently referred to as exceptions (the terms exception and synchronous interrupt are used interchangeably herein).
Watchpoint interrupts can be divided into three main classes, according to the type of access being made to the relevant address: execute, read or write. In the first case, known as an execution watchpoint, the watchpoint is triggered when the processor tries to execute the instruction stored in the relevant address. In the latter two cases, known as a storage watchpoint, the watchpoint is triggered when the processor tries to access data stored (or to be stored) in the relevant address.
Processors typically provide special registers and instructions for storage of watchpoint addresses and ranges. However, the number of available watchpoints is limited by the number of registers provided for this purpose. In one prior art architecture, known as IA32 (implemented by various 32-bit processors from Intel Corporation) there are debug registers to provide a watchpoint capability, and a maximum of four watchpoints can be defined, each with a corresponding address range of one, two or four bytes. This limitation can represent a significant constraint on the effectiveness of debugging operations using watchpoints. Another problem is that such restrictions on watchpoints tend to be processor specific, with little commonality across different architectures. For example, the IA64 architecture (implemented on 64-bit processors from Intel Corporation) has a significantly different watchpoint implementation from the IA32 architecture.
One particular parameter that tends to vary according to processor architecture is the timing of the watchpoint interrupt. Thus some processor architectures generate a watchpoint interrupt before the relevant instruction executes, whilst others generate it afterwards. The case of the IA32 architecture is more complex in that the timing of the interrupt depends on the nature of the instruction; execution watchpoints generate an interrupt before instruction execution, whereas storage access watchpoints occur after successful access to the relevant storage location.
The specific code that is invoked by the operating system as a result of a watchpoint interrupt is referred to herein as a watchpoint interrupt handler. The watchpoint interrupt handler usually invokes a debugging function. Frequently this function is not part of the core operating system, but rather some ancillary utility or program, such as a kernel debugger or application debugger.
Interrupt handlers are generally identified to the processor by having their starting addresses stored in memory locations reserved for this particular purpose.
The second interrupt handler in
Thus as is well known, a paging mechanism is provided on many processors to enable programs to execute as if much more system memory were present than is really the case (up to the maximum provided by the address space, e.g. 4 Gbytes on a 32 bit system). The apparent memory seen by programs is known as virtual memory (or virtual storage), whereas the actual amount of memory installed is called physical memory or physical storage (on some architectures the term real is used instead of physical). The mismatch between virtual and physical memory is accommodated by using some form of additional external storage, typically a hard disk drive, as an overflow for physical storage.
The paging mechanism generally divides all of virtual memory into evenly sized segments known as pages; the page size is typically 4K bytes or 4M bytes, or some other value depending upon the processor architecture. Any given page of virtual memory is present either in system memory, or in the external overflow area, stored in the latter case in what is termed a swap or page file.
Programs cannot access data directly in the page file. Instead, the page manager component of the operating system has the task of copying of data saved in the page file into physical memory, from where it can be accessed by programs. This typically requires that other data in physical memory is first copied to the page file, in order to create some vacancy in physical memory.
The transfer of data between system and external memory (effectively between real and virtual memory) is carried out in units of pages, and hence is known as paging, or sometimes as swapping. This transfer is largely transparent to application programs, except that access to data in a page file will be much slower than access to system memory, to allow time for the necessary paging to be performed.
In practice, the page table 220 is most commonly split into a hierarchy of tables, such as shown in
Also shown in
It will be appreciated that while the hierarchy shown in
For performance reasons, processors generally cache the most frequently referenced page table entries in an internal area, frequently referred to as the Translate Look-aside Buffer (TLB) (not shown in
If the processor tries to access a page which is not in physical memory, but instead located in the page file, then a page fault interrupt or exception occurs. The current program execution is temporarily suspended and execution continues with the page fault handler. This is made known to the processor by the standard interrupt mechanism, which for the IA32 architecture is an appropriate entry in the IDT. Returning to
On receipt of an interrupt, the page fault handler 122 determines whether the interrupt occurred because of an erroneous storage access made by the program that was interrupted, or because the desired data is currently stored in the page file. In the latter case, the requested page is copied into an unused region of physical storage. The corresponding PTE is then updated, to indicate that the page is now present in system memory, and to identify the physical page where it is stored.
If there is no spare page in physical memory in which to store the incoming page, then space must first be made available. This is achieved by removing a page from physical memory, more particularly by copying its data to the page file, and then updating the page table entry accordingly. In addition, the page fault handler updates certain status information (not shown in
Note that in order to handle the page fault, the address of the instruction causing the page fault and the accessed memory address for which the fault occurred are necessarily made available to the page fault handler 122 by the processor. The precise mechanism for passing this information is processor specific; in the case of IA32, the instruction address is pushed onto the stack used by the page fault handler, a memory area accessible from the Extended Stack Pointer Register (ESP), and the accessed memory address is presented in Control Register 2 (CR2).
The page table may be updated not only in response to a page fault, but also in certain other circumstances. Of particular relevance here is the situation for operating systems that provide a multi-tasking environment, where different tasks have task-specific views of virtual storage. This requires the operating system to maintain a (logically) separate copy of the page table for each task that has a task-specific view. Whenever a new task is run, the page manager (of which the page fault handler is a part) refreshes the processor's page tables so that it contains the data appropriate for the new task.
U.S. Pat. No. 5,611,043 describes a debugging system, which utilises the operating system paging mechanism to provide watchpoints, thereby overcoming limitations on the number of hardware breakpoints that can be supported. Thus a page for which a watchpoint is set is marked in the page table as “non-writable”, whilst the correct information from the page is stored separately. When an attempt is made by the application being debugged to access the page, a page fault interrupt is raised because the page is apparently non-writable, which in turn passes control to the debugger. After any desired analysis, the page is restored to its original format, and the application allowed to proceed with a single step. This time the instruction executes correctly, rather than triggering the page fault, because of the updated page information, but hands control back to the debugger when it has completed its single step. The watchpoint is then restored by again altering the page table, so that it will trip again for any future accesses to the page, and the application is allowed to continue.
Although the system described in U.S. Pat. No. 5,611,043 offers significant advantages over hardware breakpoints, it too has certain limitations. For example, it is only effective for operating systems that provide a debugging interface with access to the paging mechanism, and even for operating systems that do have such a facility, there is little commonality across the different implementations. It is also restricted to task-specific watchpoints (i.e. the application actually being debugged), and so can't handle access from kernel-space rather than the user-space of the application.
Accordingly, the invention provides a method of providing a watchpoint in a computer system, said method comprising the steps of:
modifying the system page table for a memory page containing a watchpoint, such that a page fault interrupt is triggered when said memory page is accessed;
modifying the paging mechanism of the computer system, so that responsive to a page fault interrupt, a determination is made as to whether said interrupt has been triggered by an access to a watchpoint; and
responsive to said determination being positive, passing control to a watchpoint handler.
The present invention utilises page fault interrupts (exceptions) to extend the number and ranges of watchpoints. Page-faults used for this purpose are generally referred to herein as pseudo-page faults and the set of watchpoints implemented in this manner for a given page as a pagepoint.
It will be appreciated that the prior art, in particular U.S. Pat. No. 5,611,043, also teaches the use of paging as a mechanism for triggering a watchpoint. However, the present invention modifies the system paging functionality in a quite different way from the prior art, thereby providing much more power and flexibility for investigating program behaviour. In particular, the system page table and paging mechanism are specifically modified to allow watchpoints to be defined, and if such a watchpoint is triggered, control is then passed to a watchpoint handler. This does away with the need for a debugging environment and has several advantages over the prior art. Thus the technique is extendable to all operating systems (with paging support), irrespective of the type of debugging facilities that they provide. It is also more efficient, in that program execution continues normally except for page fault interrupts, compared to the prior art approach where all interrupts are passed back to the debugger. In addition, setting watchpoints through a debugger is limited to user address space (for the application being debugged), whereas the present invention can be utilised with respect to both user and system space. Furthermore, the present invention provides a wider range of exploitation mechanisms, in that the watchpoint handler can be configured to take any desired action (for example, outputting selected trace information to a log file), rather than returning to a debugger.
In a preferred embodiment, a pagepoint table is provided. The entries in this pagepoint table correspond to memory pages, and information stored in the pagepoint table defines the watchpoints contained within each page. In one embodiment, the pagepoint table contains one entry for each page of memory (analogous to the system page table), whilst in another embodiment, the pagepoint table contains entries only for those pages that contain a watchpoint. The latter approach allows the pagepoint table to be much more compact, especially if pagepoints are defined for only a few pages, but does make it slightly more difficult to locate the pagepoint entry for a particular page. One efficient way of doing this is to have the page table entry for a page which contains a watchpoint include a reference to the entry in the pagepoint table for that page, although some other indexing method could be used instead.
In the preferred embodiment, a page table entry for a page includes a presence status, which indicates whether or not that page is currently present in system memory. If a page contains a watchpoint, the entry for the page in the system page table is modified. In particular, the presence status for the page is modified to indicate that such page is not currently present in memory (irrespective of the true current location of the page). The consequence of this is that when an attempt is made to access the page, a page fault is automatically generated, and hence this provides a mechanism for instituting a watchpoint. Note that the original presence status for the memory page (i.e. prior to modification) is stored in the pagepoint table entry for that page. Consequently, the true location of page remains known, and so it can be properly processed, even if a pagepoint is generated.
One complication is that on multi-tasking systems, the operating system typically maintains a different page table for each task (reflecting the particular memory usage of that task). This opens up the possibility of having task-specific watchpoints, in that different modifications can be made to the different page tables. Note that it is most convenient in this situation if a different pagepoint table is defined for each task. However, it may be desirable to have a common set of watchpoints across all tasks (this corresponds most directly to a hardware breakpoint). In this case all the task-specific page tables must be updated to reflect a new watchpoint—this can be done either when the watchpoint is defined, or for each task as it becomes active.
In one preferred multi-tasking embodiment, each pagepoint table comprises a task-specific component and a generic component that is common to all tasks. Typically the two table components are essentially separate tables, which logically act together as one overall table to cover all the address space. Note that the latter, generic component generally matches system space. since this is active for all tasks.
In most modern computing systems, the processor maintains its own copy of selected parts of the page table for rapid access in what is known as a table lookup buffer (i.e. this is effectively operating as a cache). It is therefore important that any modifications to the system page table are immediately propagated to the table lookup buffer, to ensure that proper cache synchronisation is maintained.
In the preferred embodiment, the determination as to whether said interrupt has been triggered by an access to a watchpoint comprises a two-step test. Firstly, it is tested whether the page for which the interrupt has been triggered contains any watchpoints, and if not, the interrupt is treated as a standard page fault interrupt (i.e. because the requested page is not present, rather than because of any artificial manipulations of the page table to indicate a watchpoint). Secondly, it is tested whether the address for which the interrupt has been triggered matches a watchpoint. This is because a page is a rather large granularity for a watchpoint, which might instead be required only for a small portion of a page. If this is indeed the case, then any access to the page will trigger an interrupt, but this will only be of interest if the requested address actually matches the specific address range of the watchpoint; otherwise the application can be allowed to proceed.
Note that in the preferred embodiment, certain measures are necessary to allow the application to proceed (either because the address that triggered the interrupt does not correspond to a watchpoint, or because it does, and the watchpoint handler has now completed). In particular, a straightforward attempt by the application to continue would immediately result in another attempt to access the memory location that originally generated the page fault, and processing would become locked in a circular loop. Therefore, before the application can proceed, the pagepoint for the page is removed (i.e. the original status of the page table entry is restored), and the application is allowed to perform a single step of execution. Following this, the application is again interrupted, to allow the pagepoint to be reinstated, thereby ensuring that further accesses to this page can be detected by the watchpoint. The application is then able to proceed once more.
Note that in making this single step, the processor instruction will generally either execute to completion or generate a synchronous interrupt. The latter indicates to the operating system that conditions were not correct for complete execution of the instruction, and prompts the processor to give control to an interrupt handler that attempts to resolve the problem. The instruction can then be re-executed if the problem is successfully resolved. A consequence of this is that if a watchpoint is used in an automated manner to generate a trace of watchpoint events, it may not be desirable to record multiple events for a single instruction that is re-executed due to some recoverable condition. To support this, in the preferred embodiment, the watchpoint handler is extended to provide two additional functions, watchpoint commit and watchpoint discard. The purpose of these additional functions is to respectively commit or discard trace information relating to the execution of a particular instruction. Effectively, watchpoint data is only committed when the instruction that triggered the watchpoint executes successfully.
Some known hardware breakpoint schemes can detect the type of access to a memory location (read/write or execute), and alter their response accordingly. In a preferred embodiment of the software watchpointing system of the present invention, this behaviour is emulated. In particular, the system page table for a memory page containing a watchpoint is modified such that a page fault interrupt is triggered only for certain types of access to said page. As an example of one way of doing this, a pagepoint can modify the writeable status of a page, rather than its presence status. In this configuration, a pagepoint will be triggered by a write access, but not by a read access.
There are a variety of mechanisms available to the skilled person for modifying the system paging facility as required by the present invention. In some situations, the source code may be available (e.g. for the Linux platform), and so the modifications can be made direct to the code. On the other hand, if the source code is not available, a typical mechanism for altering the paging function of the computer system is to modify the interrupt descriptor table, so that the code invoked responsive to a page fault interrupt is that required by the present invention, rather than the standard paging facility.
The invention further provides a computer system supporting the provision of watchpoints and including:
a system page table having a modified entry for a memory page containing a watchpoint, such that a page fault interrupt is triggered when said memory page is accessed;
a paging mechanism, modified so that responsive to a page fault interrupt, a determination is made as to whether said interrupt has been triggered by an access to a watchpoint; and
a watchpoint handler, which receives control responsive to said determination that the interrupt has been triggered by access to a watchpoint.
The invention further provides a computer program for implementing the above methods. In particular, the computer program comprises instructions, which when loaded into a computer system, are executed to cause it to perform such methods. Note that the program instructions may be encoded onto a hardware medium such as a floppy disk, CD ROM, tape or DVD for loading into the computer, or transferred into the computer over a network connection, for example, via a modem or a local area network link. A further possibility is that the instructions are preloaded onto the computer system at manufacture, either onto the hard disk, or in ROM.
It will be appreciated that the computer system and computer program of the invention will generally benefit from the same preferred features as the method of the invention. Note also that the term computer system in this context should be interpreted broadly to cover any device capable of running the software programs described herein, whether a personal computer, server, mainframe, laptop, handheld device, WAP telephone or equivalent, or any other form of embedded system including the relevant computer functionality (which may possibly be utilised in a wide range of devices, such as television systems, automobiles, etc.).
A preferred embodiment of the invention will now be described in detail by way of example only with reference to the following drawings:
The present invention is based on the utilisation of a system paging mechanism to provide watchpoints for debugging, probing or other purposes. In particular, pseudo page-faults (as discussed in more detail below) can be utilised as a mechanism for triggering watchpoints. A page which is marked for a pseudo-page fault on behalf of a watchpoint is referred to herein as a pagepoint. Implementations of this approach for a range of different environments will now be described.
Note that throughout the detailed discussion it is assumed that normal programming precautions are taken to ensure consistent results when accessing and updating certain components, such as the pagepoint manager structures and tables (as described below). A spinlock, semaphore or interrupt disablement will suffice for this purpose, depending on the environment of the embodiment. Where operating system page manager and pagepoint manager structures need to be accessed atomically then a consistent locking hierarchy must be established. The algorithms discussed below assume that pagepoint serialisation is performed before that of page management., and in particular the pagepoint serialisation is done on entry to each of the procedures described.
1) A Single-tasking Environment
There are three main aspects which need to be addressed in order to properly handle pagepoints:
In order to implement pagepoints, the preferred embodiment utilises a pagepoint table, as shown in
Each entry in the pagepoint table contains at least three fields:
(1) a status flag 331 indicating whether a pagepoint is active for the corresponding page;
(2) a status flag 332 which is copy of the entry 276 (see
(3) a pointer 333 to a chain of watchpoint definition structures if the pagepoint is active (otherwise the value is undefined or null).
(Note that in some embodiments, the status flag could be replaced by a counter that indicates the number of appended watchpoint definition structures, or omitted altogether since its value can already be deduced from whether or not pointer 333 is null).
Each virtual page in
In the preferred embodiment, each watchpoint definition structure includes at least the following three fields:
(1) A pointer to the next watchpoint structure for this page (i.e. the next link in the chain)
(2) The beginning address of the watchpoint within the page
(3) The end address of the watchpoint, or equivalently the size of the watchpoint range.
Likewise, watchpoint definition structure 374 includes second and third fields 374B, 374C that identify the start and end locations of a region 394 within the same page 391 (since structures 373 and 374 are part of the same chain 370). Watchpoint 374 is triggered by any access to memory region 394. (Note that since structure 374 is the end of the chain for pagepoint entry 311, field 374A may be null, or have some other suitable housekeeping value).
It will be appreciated that watchpoint definition structures 371 and 372 also define watchpoint ranges (not shown) within page 391, since they are part of the same chain 370 as structures 373 and 374. On the other hand, watchpoint definition structures 381 and 382 define watchpoint ranges in a different page (not shown in
A determination can therefore be made as to whether a given memory address is covered by a watchpoint by first locating the entry 221 in the page table for the page which includes the address. From here the corresponding pagepoint table entry 311 for the page can be located, and in turn flag 331 examined. If this flag is set, this indicates that there is at least one active pagepoint for this page. If flag 331 is indeed set, then pointer 333 can be used to identify the corresponding chain 370 of watchpoint definition structures. The first field in each definition structure can then be used to navigate down the chain. This allows the memory address in question to be tested against the second and third fields in each definition structure to determine whether or not the address falls within the range covered by that structure, and therefore whether or not a watchpoint is to be triggered.
It will be appreciated that a watchpoint definition structure may be extended with addition information, depending upon the requirements of a particular embodiment. For example, in some circumstances it may be desirable for watchpoint-specific handlers to gain control when a pseudo-page fault interrupt occurs.
The next step is to locate the corresponding pagepoint and page table entries for the new watchpoint (step 410). In practice this involves using the watchpoint address to form an index into the respective tables. A test is now made (step 415) to determine whether or not there is already an active watchpoint in this page, in other words to see if the watchpoint definition structure chain contains any entries. This test can be performed by looking at the status of flag 331 in the pagepoint table (see
The method now proceeds to step 425, in which the relevant page has its status in the page table set to not present (i.e. not in system memory). Thus flag 276 (
As explained earlier, for performance reasons processors typically cache a portion of the page table in the TLB. The next step (430) is therefore to synchronise the processor by purging at least the TLB entry corresponding to the page in question, or the entire TLB if there is no facility to manipulate individual TLB entries. This ensures that the TLB contains an updated page table, containing the modified presence information.
The method is now able to update the watchpoint chain structure to reflect the new watchpoint (step 435). This involves adding a watchpoint definition structure to the end of the chain for the page. If this is the first watchpoint for the page, then there will only be a single entry in the new chain; alternatively, if there is at least one existing watchpoint definition structure, the new structure must be added to the end of the existing chain. This is accomplished by updating the forward pointer for the structure currently at the end of the chain, so that it points to the new structure. As an example of this, prior to the addition of watchpoint 374 in
Adding the watchpoint to the chain is followed by populating the watchpoint definition structure with position information (step 440), to indicate the range within the page that will trigger this watchpoint. Referring again to structure 374 in
The method then proceeds to step 445, which updates flag 331 in the pagepoint table to indicate that there is an active pagepoint for this page. Of course, this flag will already have been set if all we have done is to add a new watchpoint structure at the end of an existing chain. In other words, if there is already at least one active pagepoint for this page, then flag 331 will have been set earlier when this previous pagepoint was activated.
At step 520, a test is performed to determine if there are any watchpoints still present on this page. If so, then the method can terminate directly. On the other hand, if the test of step 520 is negative, then the page table presence status is restored from the pagepoint table back to the page table (step 525). In other words, field 332 of the pagepoint table (
It will be appreciated that the test of step 520 is essentially the same as whether or not to serialise the page manager in step 510, since the latter is only required if the page table is being updated. Once such an update has been performed at step 525, (re)synchronisation must be performed with the processor (step 530), to appropriately renew the TLB. Finally, the serialisation of the page manager can be released (step 535), once the updates to the page table and TLB cache version of it have been completed.
B) Handling Pseudo-page-faults
Having now discussed the activation and deactivation of pagepoints, we are now in a position to discuss how they are handled by the system. In particular, the operating system's page fault handler needs to be extended with a function that manages distinguishes and manages pseudo-page-faults (i.e. those generated by a pagepoint). The exact manner of this updating will be platform specific. For example, in an open-source environment such as Linux, the standard operating system page-fault handler may be readily extended because of the availability of the source code. Alternatively, in a closed-source environment such as the OS/2 operating system from IBM Corporation that runs under the IA32 architecture, the IDT can be updated (see
Note that that in this section we do not explicitly mention the need to serialise the page manager, because most page managers will be implemented so as not to permit the state of the paging system to be disturbed while handling a page fault. If this is not the case with a particular embodiment then additional serialisation steps must be added to these procedures described herein.
The operation of the modified (pseudo) page-fault handler is illustrated in
Next a test is performed to see whether the triggering address is actually within a watchpoint. Referring back to
Once the watchpoint handler has completed (or directly if there is no watchpoint), the present/not-present status for this page from the original page-table (i.e. as copied from field 276 in
The method now proceeds to set up a single-step operation of the instruction that triggered the pagepoint (step 645). The current interrupt enablement state must be noted and restored after single-step if the instruction does not modify the state. This information can be saved in any convenient memory location that is accessible at all times. The purpose of the single-stepping is to ensure that the pagepoint can be subsequently reactivated. Note that it is currently deactivated (by temporarily storing the correct presence information in the page table) in order for the original instruction to properly proceed.
Thus the original instruction that triggered the pagepoint is allowed to execute in single-step mode (step 650). This will be followed by a further interrupt (step 655), which can arise from one of two possibilities: either the single-step instruction may execute to completion and then present a single-step interrupt or it may execute partially or not at all and generate an exception (for some error condition).
The details of the single-step handling are illustrated in
Turning now to the situation where a different interrupt is received (step 755) (i.e. not a single step), then again a test is made to see if a pagepoint is being processed (step 760). If this is not the case, then if the interrupt is due to a (pseudo) page fault (step 790), the pseudo page fault handler will be invoked (step 795), in other words, taking us into to the processing of
Returning now to step 760, if we are in pagepoint single-step, then it is next determined whether or not a watchpoint is present (step 765)—again this will be based on the outcome of step 625. If a watchpoint is indeed present, then in the preferred embodiment, a watchpoint discard function is called (step 770), whose purpose will be described in more detail below. Once this has been completed, or directly if there is no watchpoint, then the pagepoint can be reinstated (step 775) and single step reset (step 780), mirroring the operations performed in steps 725 and 730. However, on completion of step 775 and step 780, control is passed to the system interrupt handler (step 750), rather than returned to the original program, since it is still necessary to clear whatever generated the interrupt at step 755.
The reason for this difference is that an instruction might fail for multiple reasons, all of which are recoverable, and it may well be re-executed more than once. The strategy described above is effective even with multiple retries. Thus when some other form of interrupt is presented at step 755 after setting up the single-step, execution is allowed to continue at step 750 with the operating system's interrupt handler (there may be a number of specific handlers which we have to distinguish). If the instruction is subsequently retried and the error condition is corrected, then because the pagepoint was reactivated at step 775, a pseudo-page-fault will again be generated. However, this time on single-stepping, since the error has been cleared, the instruction will pass through to a single-step interrupt (step 705), which will ultimately allow continuation of the original program (step 740).
It is in this context of the same instruction being re-executed potentially multiple times that the watchpoint commit and discard functions are provided, since it may not be desirable to repeatedly collect essentially the same trace information each time a pagepointed instruction fails. Thus in one preferred embodiment, watchpoint information is provisionally written by the watchpoint handler at step 630. However, if the single step does not complete (i.e. it is interrupted at step 755), then this information is discarded at step 770 by the watchpoint discard function. The trace information is then regenerated when the reactivated pagepoint is again triggered for this instruction, but will be discarded again unless the single step completes, in other words the instruction is successful. In this latter case the watchpoint commit function (step 720) serves to confirm the provisional trace information.
It will be appreciated that this use of watchpoint commit and discard is generally convenient for a user, but may not be appropriate in all circumstances. For example, in some circumstances, it may be desirable to collect all trace information for both successful and failed attempts at an instruction. In this case, the watchpoint commit and discard functions are not needed, since the trace information can be securely output at step 630.
Referring first to
The single-stepping itself can now be invoked by setting the TRACE flag (step 915) and then the Extended Flags Register (EFLAGS). The IRET instruction is employed (step 920) to simultaneously load a new value in EFLAGS and return to the instruction we wish to single-step.
Resetting the single-step is shown in
On the other hand, if the instruction completes and does modify the INTERRUPT flag then the value of the INTERRUPT flags from the saved EFLAGS is not restored (step 980). Rather, a determination is made as to whether the instruction has saved the modified INTERRUPT flag (step 980), and if so, then this saved value is modified in accordance with the saved EFLAGS value (step 985), before the method finally exits.
C) Synchronising with the Page Manager
The pagepoint manager intercepts page manager operations when it updates the status of a page table entry in order to make the corresponding update to the pagepoint table entry. Specifically this occurs when a page-in or page-out operation is performed. (The page manager may perform intermediate steps for a page-out operation. These do not concern us, only the point at which the page table entry is updated is of interest).
2) A Single Processor, Multi-tasking Environment
A multi-tasking environment has additional complexity, which arises because part or all of the page table entries may be either refreshed or switched to a new set when a task switch (sometime referred to as a process switch) occurs. This forces pagepoints to be managed on a per-task basis, if watchpoints are to be defined as being task specific. This requires the pagepoint manager to maintain a set of entries per-task as is done by the page manager.
Thus looking at
Note that since processor watchpoints themselves are not task-specific, a strict generalisation from processor watchpoints to pagepoint-implemented watchpoints does not require the provision of watchpoints on a task-specific basis. However, processor watchpoints are frequently made task-specific by saving and restoring task-specific watchpoint information during a task switch. It will be appreciated that this indicates the general need for task-specific watchpoints, and accordingly the task-specific nature of pagepoints as implemented herein is a useful enhancement.
In a multi-tasking environment, the pagepoint manager must be able to determine which task is currently active. This can be done by using the same mechanisms that the operating system employs (and so will necessarily be operating system specific). For example, in an OS/2 implementation, the current task (or process) and its associated copies of page table entries may be determined from the system variable _pPTDA. Alternatively, in a Linux embodiment, the same information may be determined from the system variable current. The skilled person will be aware of corresponding mechanisms that can be employed on other platforms.
The page manager typically uses one of two methods to ensure the correct page tables entries are used by the processor after a task switch. In the first method, referred to as a page table switch, the entire set of page tables is switched and no individual editing of page table entries takes place. This is usually achieved by loading a special register that points to the tables. Linux page management operates with this design criterion: under IA32, the Control Register 3 (CR3) is used to point to the new set of page tables. Since no page table editing is performed for a task switch the pagepoint manager does not have to take specific actions to support the task switch (this applies under Linux).
The alternative approach is where page table entries are edited (irrespective of whether or not a page table switch also occurs). The fact that individual page table entries are edited during a task switch requires the page manager to maintain information per table entry from which the editing is done—we refer to these sources as shadow page table entries. This method is used under OS/2. The existence of such shadow page table entries requires further involvement from the pagepoint manager.
In particular, the operating system's page manager must maintain its shadow page tables. This may be done either when a new task is to be made active, by coping the current values of the page table entries back to the shadow table entries, or else piecemeal, whenever a page table entry is changed during page-in and page-out operations.
The pagepoint manager therefore has two options for ensuring that pagepoints for the new task are correctly re-instated after a page switch. The first strategy is to maintain shadow entries in tandem with the page manager. Thus whenever the page manager updates its shadow page table entries, the pagepoint manager overrides the update to be consistent with the page table entry, if there is an active pagepoint. This requires that the page manager processing can be intercepted at points after such updates are made to the shadow entries. This also requires that the activation of a pagepoint marks the shadow page table entry status as not-present as well as the actual page table entry. Although this method is achievable, it is dependent on intercepting every instance of the operating system's use of the shadow page table entries and can require multiple intrusions into normal page management processing. It would therefore be highly specific to the operating system of the relevant embodiment.
An alternative mechanism is not to update shadow page table entries, but rather to intercept the processing in the operating system after a task switch has occurred. At this point selected page table entries can be updated, according to whether or not a pagepoint is active, and the original page table entry status is saved in the corresponding pagepoint table entry. This can be performed efficiently if for each process the pagepoint manager maintains a status indictor that determines whether any pagepoints are active in a task. The overhead to task switching would thus be negligible for those tasks with no pagepoints defined.
Note that where task-specific watchpoints are implemented, the pagepoint manager also needs to gain control at task termination to remove any remaining task-specific pagepoint tables entries and watchpoint structures. This can be performed in essentially analogous fashion to that employed for task switching at task commencement.
3) A Multi-Processor, Multi-tasking Environment
There are two additional considerations in this environment. Firstly, proper serialisation must be achieved. In the preferred embodiment, the same integrity protection mechanisms used by the operating system when updating page tables are used when making any updates to pagepoint tables and/or watchpoint structures. Typically this implies the use of a spinlock to guarantee serial access to resources.
The second issue is the synchronisation of pagepoints between the different processors. Thus synchronisation is required when watchpoints are used in a non-task specific context. This requires that page table entry updates made by the pagepoint manager are replicated to each processor's set of tables, assuming the page tables are assigned per processor (if the page tables are shared then an update from one processor serves all). Note that in either case, all processors will need to be resynchronised with the page tables after an update (analogous to step 430 of
Alternatively, if task-specific watchpoints are to be maintained then no synchronisation is required across processors. However since more than one task may be concurrently active, in fact one per processor, then the pagepoint manager may be required to maintain a single-step global status flag per processor in the case where the processor architecture discards lower priority interrupts when concurrent interrupts are generated (this would be the case for IA32).
The pagepoint mechanisms described so far have not distinguished the type of access being made at a watchpoint. Typically processor watchpoints can distinguish read from write access, and in some processor architectures they can also distinguish between execution and I/O operations.
In certain embodiments where the page fault mechanism allows types of access to be distinguished, it is also possible for a pagepoint scheme to differentiate according to type of access. As an example, consider the IA32 architecture, in which a writeable status flag in a page table entry is used to permit a store operation if set, and to deny the operation if the flag is not set. In the latter case, a page fault interruption occurs, and status information set by the processor enables the page fault handler to distinguish the reason for the page fault.
Thus there are two possible mechanisms generating pseudo-page-faults. In the first, setting a present status combined with writeable will generate a page fault on write but not on read. This combination therefore effectively provides a write access watchpoint. Alternatively, a not present status will generate a page fault on read and write regardless of the writeable status flag. In other words, not present with writeable can be utilised to set a read access watchpoint, and not present with not writeable can be utilised to set a read or write access watchpoint.
In such an embodiment, the status flags in the page table entry corresponding to the pseudo-page-fault need to be interrogated to distinguish the category of access, with the pagepoint manager saving both original present/not-present and the original writeable/not-writeable status in the corresponding pagepoint table entry. To ensure that this information remains accurate, the pagepoint manager must also intercept any process within the operating system that updates the writeable status (and/or the present status) of the corresponding pagepoint tables entries, to remain in synchronisation with the page manager.
Two preferred embodiments of the invention will now be described for the Linux operating system over IA32. The first is suitable for kernel mode and non-task-specific watchpoints and is managed within the kernel; the second is intended for task specific watchpoints to be managed by a user level debugger, in which breakpoint management is handled in user mode as in Linux and other UNIX operating systems. Only the aspects that are unique or specific to the implementation on Linux will be discussed here.
1) Non-task-specific Watchpoints
This implementation follows the general approach described earlier for a multi-tasking environment, with the following points of details and potential alternatives being of particular interest.
As an alternative to having pagepoint table entries for every page of virtual storage in the system, the pagepoint table can instead be allocated with enough space for the maximum number pagepoints expected to be active at a time. This is possible because when a page is marked as not present, there are available bits in the page table entry (PTE), which can be used to correlate a particular page of virtual storage with the index of its corresponding pagepoint structure. A similar technique is used by the current Linux page manager to locate an entry in the swap file that corresponds to a swapped out page. However, when a page is marked not-present artificially by the pagepoint manager then these additional bits within the PTE will be unused by Linux.
To support this approach, a pagepoint table entry contains the following additional piece of information, namely the virtual address of the page to which the pagepoint refers (this enables a distinction to be made between the existence of a pagepoint and a swapped-out page whose swap-entry index incidentally matches a pagepoint index).
In this embodiment therefore, under IA32, when a PTE has the not-present flag set, the remaining 31 bit positions within the PTE are available for use as a pagepoint table index. Pagepoint table entries are therefore allocated on a word boundary to accommodate a 32-bit address in 32 bits. Since the not-present bit is bit 0 and has a value 0 the entire PTE appears to be the pointer to the pagepoint table entry.
This approach is illustrated in
The approach of
In performing the page table and pagepoint operations, serialisation with the page manager is achieved by acquiring the appropriate locks for the memory management structures. In other words, for kernel space, the mmap semaphore is first obtained, followed by the page_table_lock, which is located from the init_mm structure. Alternatively, for user space, the mmap semaphore is first obtained, followed by the page_table_lock, located from the mm structure of each task active on each processor (activation of pagepoints for inactive tasks is managed during the task context switch).
The use of the arrangement of
On a multi-processor system, one complication arises if a watchpoint is to be effective globally across all process contexts, and the corresponding pagepoint address lies in the region of address space managed by task-specific page tables. In this case an additional step is necessary of using an Inter-processor interrupt (IPI) to propagate the page table changes to all processors. Additionally, the pagepoint entry must maintain the saved PTEs for every processor (because non-task-specific watchpoints are in use). If CR3 is reloaded during a task context switch then all active pagepoints must be reset both for the outgoing task, and also for the new task.
Considering now the implementation of the pseudo-page-fault handler in the Linux environment, one possibility would have been to call the pagepoint manager from within the memory management function that is used for bringing pages in, after all validations have been done and the memory management semaphore acquired. The advantage of such an approach is that it could also work in situations where pages are explicitly forced in (made present explicitly rather than relying on a page-fault interrupt) by a kernel function, in addition to page-faulting. Thus most of the ways in which a PTE entry could be updated would be intercepted.
However, this approach would suffer from the disadvantage that it could not properly handle watchpoints that are encountered by interrupt handler code. This is because handle_pte_fault( ), the routine that brings pages in, does not run when interrupts are disabled; the page fault handler invokes this routine only after ensuring that it was not invoked at interrupt time.
Thus the approach adopted in the preferred embodiment is to call the pagepoint handler from the page-fault handler code. In other words, the pagepoint handler is called from the do_page_fault( ) routine immediately after it has obtained the faulting address from the CR2 register. This routine runs with interrupts disabled (as mentioned earlier, the page-fault handler can be set up as an interrupt gate to achieve this under IA32). If the pagepoint handler returns indicating that it hasn't handled the pagepoint then interrupts are enabled before continuing with normal page fault handling. If the pagepoint is handled, then the code returns from the page fault handler so that subsequent processing may continue (including single-stepping as described above).
Note that the pagepoint handler must acquire the page_table_lock, for serialization reasons. To locate the pagepoint structure, it locates the PTE for the faulting address, and if the page is marked not-present it interprets the index field of the PTE as the pagepoint entry index, provided it is a valid index and the pagepoint entry contains the matching virtual address, as described above in relation to
The subsequent stages of single-stepping and reinstating the pagepoint are as described above (see
Note that since a PTE may be altered by the handle_pte_fault( ) routine, which is used for bringing pages into physical memory, the pagepoint manager needs to intercept handle_pte_fault processing in multiple places to ensure the PTE contents are correct for the do_swap_page( ) function. In particular, the pagepoint manager redirects updates that otherwise would have been made to the PTE to the pagepoint table entry, without allowing the PTE contents to change (since this would provide an opportunity for watchpoints to be missed).
There is no necessity to intercept swap-out processing; pages that are marked not-present will not be swapped out. However, there is an impact on the system, more so if there are a large number of active pagepoints, because the presence of a pagepoint makes the page non-swappable once they've been brought into memory. To address this one could optionally intercept swap-out processing in multiple places to ensure that it references the true PTE entry saved in the pagepoint table entry. This would enable pagepoint pages to remain swappable.
2) Task Specific Watchpoints
In the case of task specific watchpoints, an alternative implementation is to use methods similar to those utilised by breakpoint management facilities provided for user level debuggers in Linux (and some other variants of the UNIX operating system). This requires the ptrace( ) system call to be extended with options to enable a user mode debugger to read and write the contents of any PTE that maps user space virtual addresses in the debugee and to temporarily mark a page as non-swappable. For this embodiment we define a new ptrace( ) commands as follows:
In particular, the debugger maintains its own task-specific pagepoint table, which is in a similar format to the table described for the non-task-specific case (see
To activate a pagepoint, which occurs when the first watchpoint for the corresponding page is activated, the debugger (which is expected to have already attached itself to the debugee) performs the processing illustrated in
When a page fault is generated due to such a protection violation, the kernel generates a SIGSEGV signal, which the debugger can intercept through standard interfaces supplied for a debugger application. In this embodiment, the debugger does not use the index field of the PTE to locate the pagepoint entry since that would require modifications to page management. Instead, uses either the virtual address of the page as an index or it applies some convenient hashing algorithm to the page address.
Next, the modified PTE is written back to the debugee's page table using PTRACE_POKEPTE (step 1450), and then finally the swappable state of the debugee's page is restored using PTRACE_UNPINMM (step 1460). After setting up the watchpoints, the debugee may be allowed to continue execution (it will have been halted when the debugger intercepted the SIGSEGV signal and also when the debugger was initially attached to the debugee).
Note that the Linux page-fault handler currently does not distinguish a page-fault caused by a write access to a read-only page from one caused by a user privilege program storing into a supervisor privilege page. However, this may be readily determined from the page-fault error code, which is presented to the operating system in Control Register 2 (CR2) at the time of interrupt. A minor extension to the page-fault handler therefore allows a distinction to be made between these two reasons for access violation.
In this embodiment, when any location within a page with an active pagepoint is accessed by the debugee task, a segmentation fault (SIGSEGV) is generated by the kernel. This happens because a page-fault is generated on access by the debugee which the kernel intercepts. The page fault occurs because the page is flagged as a supervisor access only, which prohibits user access. As a result of this the kernel sends a SIGSEGV signal to the debugee. This causes execution of the debugee to be suspended, and the debugger process, which is attached itself to the debugee, to receive notification of the SIGSEGV event.
The processing performed by the debugger on receipt of this notification is illustrated in
A test is now performed to see if the faulting address is a watchpoint (step 1540), and if so, the watchpoint handler is called (step 1550). Once this has completed, or if there is no watchpoint, the original PTE protection flag is restored using PTRACE_POKEPTE (step 1560). Following this, the swappable state of the debugee's page is restored using PTRACE_UNPINMM (step 1570). Single step operation is now set up in the debugee, using PTRACE_PEEKUSR and PTRACE_POKEUSR to set the TRACE flag in the debugee's EFLAGS register after saving the original value (step 1580). Finally, the debugee is allowed to continue using PTRACE_CONT (step 1590).
When the instruction completes executing, a single step interrupt is generated, and the debugee receives a SIGTRAP signal. This again causes the debugee to be stopped and the debugger to receive a notification. The debugger now proceeds as illustrated in
Once the watchpoint has been processed, or directly if there is no watchpoint, the debuggee page is marked as temporarily marked as non-swappable (step 1630), and the pagepoint is reinstated (step 1640), and then the swappable status of the page is restored (step 1650). These steps use calls PTRACE_PINMM, PTRACE_POKEPTE, and PTRACE_UNPINMM respectively. These steps modify the PTE appropriately, as described above in relation to initial activation of the pagepoint.
Next the debuggee is reset from single-step (step 1660), more particularly by resetting the TRACE flag for the EFLAGS register using PTRACE_PEEKUSR and PTRACE_POKEUSR. Finally, the debugee is allowed to continue execution (step 1670) using PTRACE_CONT
The approach described above can be modified (optimised) for pagepoint pages that have very few watchpoints, if there are sufficient numbers of hardware watchpoint registers available to implement the watchpoints in one such page. Note that the mechanism assumes the existence of a mechanism for tracking and managing the number of available hardware watchpoint registers and for assigning them for use by various facilities.
The optimisation helps to reduce the number of extraneous page faults that would otherwise occur with data accesses to regions of the pagepoint page where no watchpoints are set. In particular, for sequential data, references have a high probability of being clustered within a region of same page, and a sequence of extraneous page-faults could be generated. Thus the facility to be able to delay reinstating a pagepoint can significantly improve performance in these circumstances. This is especially relevant for systems where larger page sizes are in use, in which the probability of generating extraneous page-fault interrupts is correspondingly increased. For example, this becomes an important consideration in an embodiment where Linux is running under IA32 and employs 4 Mb page sizes.
Note that pagepoint tracking itself is not affected by such an extension, but additional pagepoint manager structures are required to manage the assignment of hardware debugging registers. In addition, the pseudo-page-fault handler would perform the following additional steps prior to restoring the PTE:
When a debug exception occurs due to such a hardware watchpoint, which under IA32 may be distinguished from other debug exceptions using the DR6 register, then (optionally) watchpoint commit actions can be performed, followed by a return to the interrupted program.
Note that on a multiprocessor system, the watchpoint register settings need to be propagated to all processors that share the same page table entries. This can be achieved by sending an inter-processor interrupt (IPI) to those other processors.
Thus the techniques described herein provide a generic method for creating an unlimited number of watchpoints on a processor that supports a paging mechanism and a single-stepping mechanism. Although the preferred embodiment of the invention has largely been described in relation to the IA32 architecture in conjunction with the Linux operating system (and also the OS/2 operating system), it will be appreciated that the skilled person will be aware of how to extend the functionality taught herein to other architectures and platforms.
|Cited Patent||Filing date||Publication date||Applicant||Title|
|US5598553 *||May 18, 1995||Jan 28, 1997||Exponential Technology, Inc.||Program watchpoint checking using paging with sub-page validity|
|US5611043||Mar 18, 1994||Mar 11, 1997||Borland International, Inc.||Debugger system and method for controlling child processes|
|Citing Patent||Filing date||Publication date||Applicant||Title|
|US7162666 *||Mar 26, 2004||Jan 9, 2007||Emc Corporation||Multi-processor system having a watchdog for interrupting the multiple processors and deferring preemption until release of spinlocks|
|US7447942 *||Jul 19, 2005||Nov 4, 2008||Microsoft Corporation||Fast data breakpoint emulation|
|US7484069 *||Sep 28, 2006||Jan 27, 2009||Arm Limited||Watchpointing unaligned data accesses|
|US7650482 *||Sep 4, 2007||Jan 19, 2010||Microsoft Corporation||Enhanced shadow page table algorithms|
|US7689868 *||Jun 22, 2007||Mar 30, 2010||Sony Computer Entertainment Inc.||Memory handling techniques to facilitate debugging|
|US7711988 *||Jun 14, 2006||May 4, 2010||The Board Of Trustees Of The University Of Illinois||Architecture support system and method for memory monitoring|
|US7765526 *||Sep 30, 2005||Jul 27, 2010||Intel Corporation||Management of watchpoints in debuggers|
|US7783865 *||Aug 1, 2007||Aug 24, 2010||International Business Machines Corporation||Conditional data watchpoint management|
|US7783867 *||Feb 1, 2007||Aug 24, 2010||International Business Machines Corporation||Controlling instruction execution in a processing environment|
|US8132159||Jul 23, 2004||Mar 6, 2012||Green Hills Software, Inc.||Post-execution software debugger with event display|
|US8136096 *||Jul 23, 2004||Mar 13, 2012||Green Hills Software, Inc.||Backward post-execution software debugger|
|US8261047 *||Sep 4, 2012||Freescale Semiconductor, Inc.||Qualification of conditional debug instructions based on address|
|US8271955||Sep 18, 2012||Green Hille Software, Inc.||Forward post-execution software debugger|
|US8285958||Aug 10, 2007||Oct 9, 2012||Mcafee, Inc.||System, method, and computer program product for copying a modified page table entry to a translation look aside buffer|
|US8307346 *||Oct 25, 2006||Nov 6, 2012||Oracle America, Inc.||Atomic groups for debugging|
|US8584097||Feb 13, 2012||Nov 12, 2013||Green Hills Software, Inc.||Post-execution software debugger with event display|
|US8677321 *||Jun 13, 2011||Mar 18, 2014||Red Hat, Inc.||User-space probe based debugging|
|US8789023 *||Mar 7, 2012||Jul 22, 2014||Green Hills Software, Inc.||Backward post-execution software debugger|
|US8914777||Aug 20, 2012||Dec 16, 2014||Green Hills Software||Forward post-execution software debugger|
|US9128837 *||Sep 15, 2008||Sep 8, 2015||International Business Machines Corporation||Providing customizable, process-specific just-in-time debugging in an operating system|
|US9158660||Mar 16, 2012||Oct 13, 2015||International Business Machines Corporation||Controlling operation of a run-time instrumentation facility|
|US9176821||Oct 30, 2013||Nov 3, 2015||Freescale Semiconductor, Inc.||Watchpoint support system for functional simulator|
|US9195461||Mar 16, 2012||Nov 24, 2015||International Business Machines Corporation||Run-time instrumentation reporting|
|US9250902||Mar 16, 2012||Feb 2, 2016||International Business Machines Corporation||Determining the status of run-time-instrumentation controls|
|US9250903||Mar 11, 2013||Feb 2, 2016||International Business Machinecs Corporation||Determining the status of run-time-instrumentation controls|
|US9280346||Mar 11, 2013||Mar 8, 2016||International Business Machines Corporation||Run-time instrumentation reporting|
|US9280447||Mar 16, 2012||Mar 8, 2016||International Business Machines Corporation||Modifying run-time-instrumentation controls from a lesser-privileged state|
|US9280448||Mar 11, 2013||Mar 8, 2016||International Business Machines Corporation||Controlling operation of a run-time instrumentation facility from a lesser-privileged state|
|US20050223302 *||Mar 26, 2004||Oct 6, 2005||Jean-Pierre Bono||Multi-processor system having a watchdog for interrupting the multiple processors and deferring preemption until release of spinlocks|
|US20070006047 *||Jun 14, 2006||Jan 4, 2007||The Board Of Trustees Of The University Of Illinois||Architecture support system and method for memory monitoring|
|US20070022322 *||Jul 19, 2005||Jan 25, 2007||Microsoft Corporation||Fast data breakpoint emulation|
|US20070079292 *||Sep 30, 2005||Apr 5, 2007||Chih-Ping Chen||Management of watchpoints in debuggers|
|US20070288900 *||Oct 25, 2006||Dec 13, 2007||Sun Microsystems, Inc.||Atomic groups for debugging|
|US20070294505 *||Sep 4, 2007||Dec 20, 2007||Microsoft Corporation||Enhanced Shadow Page Table Algorithms|
|US20080072009 *||Apr 17, 2007||Mar 20, 2008||Samsung Electronics Co., Ltd.||Apparatus and method for handling interrupt disabled section and page pinning apparatus and method|
|US20080082781 *||Sep 28, 2006||Apr 3, 2008||Arm Limited||Watchpointing unaligned data accesses|
|US20080098146 *||Oct 20, 2006||Apr 24, 2008||Jang-Ying Lee||Interrupt hooking method for a computing apparatus|
|US20080127113 *||Nov 26, 2007||May 29, 2008||International Business Machines Corporation||Method and system for implementing watchpoints|
|US20080189529 *||Feb 1, 2007||Aug 7, 2008||International Business Machines Corporation||Controlling instruction execution in a processing environment|
|US20080320333 *||Jun 22, 2007||Dec 25, 2008||Sony Computer Entertaintment Inc.||Memory Handling Techniques To Facilitate Debugging|
|US20090037703 *||Aug 1, 2007||Feb 5, 2009||Dean Joseph Burdick||Conditional data watchpoint management|
|US20090083716 *||Sep 15, 2008||Mar 26, 2009||Fujitsu Microelectronics Limited||Profiling method and program|
|US20090089622 *||Sep 15, 2008||Apr 2, 2009||International Business Machines Corporation||Providing Customizable, Process-Specific Just-In-Time Debugging in an Operating System|
|US20090235059 *||Mar 17, 2008||Sep 17, 2009||Freescale Semiconductor, Inc.||Qualification of conditional debug instructions based on address|
|US20100205477 *||Mar 17, 2010||Aug 12, 2010||Sony Computer Entertaintment Inc.||Memory Handling Techniques To Facilitate Debugging|
|US20110154111 *||Jun 23, 2011||International Business Machines Corporation||Memory Based Hardware Breakpoints|
|US20120174077 *||Jul 5, 2012||Green Hills Software, Inc||Backward post-execution software debugger|
|US20120317548 *||Jun 13, 2011||Dec 13, 2012||Jiri Olsa||User-space probe based debugging|
|US20130246774 *||Mar 7, 2013||Sep 19, 2013||International Business Machines Corporation||Run-time instrumentation sampling in transactional-execution mode|
|U.S. Classification||717/129, 714/34, 714/E11.214, 712/244, 710/266|
|International Classification||G06F11/36, G06F9/44|
|Apr 11, 2002||AS||Assignment|
Owner name: INTERNATIONAL BUSINESS MACHINES CORPORATION, NEW Y
Free format text: ASSIGNMENT OF ASSIGNORS INTEREST;ASSIGNORS:MOORE, RICHARD JOHN;BHATTACHARYA, SUPARNA;REEL/FRAME:012806/0431;SIGNING DATES FROM 20020123 TO 20020321
|Dec 21, 2009||REMI||Maintenance fee reminder mailed|
|May 16, 2010||LAPS||Lapse for failure to pay maintenance fees|
|Jul 6, 2010||FP||Expired due to failure to pay maintenance fee|
Effective date: 20100516