    <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/">
     <channel>
        <title>ACCU  :: Debuggers Should Go Backwards</title>
        <link>https://members.accu.org/index.php/articles/849</link>
        <description>Professionalism in Programming</description>
        <dc:language>en-us</dc:language> 
        <dc:creator>Administrator</dc:creator> 
        <admin:generatorAgent rdf:resource="http://www.xaraya.org" /> 
        <admin:errorReportsTo rdf:resource="mailto:webeditor@accu.org" />
       <sy:updatePeriod>hourly</sy:updatePeriod>
       <sy:updateFrequency>1</sy:updateFrequency>
       <docs>http://backend.userland.com/rss</docs>




<div class="xar-mod-head"><span class="xar-mod-title">Design of applications and programs + CVu Journal Vol 17, #6 - Dec 2005</span></div>

<table border="0" cellpadding="1" cellspacing="0">
    <tbody>
    <tr>
        <td valign="top">
            Browse in :
       </td>
       <td valign="top">

                                            <a href="https://members.accu.org/index.php/articles/">All</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c13/">Topics</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c67/">Design</a>
<br />

                                            <a href="https://members.accu.org/index.php/articles/">All</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c76/">Journals</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c77/">CVu</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c93/">176</a>
<br />

                                            <a href="https://members.accu.org/index.php/articles/c67-93/">Any of these categories</a>

                    -                        <a href="https://members.accu.org/index.php/articles/c67+93/">All of these categories</a>
<br />
</td>
   </tr>
   </tbody>
</table>




<div class="xar-error">
   <p>
 <strong>Note:</strong> when you create a new publication type,
the articles module will automatically use the templates
<em>user-display-[publicationtype].xt</em>
and <em>user-summary-[publicationtype].xt</em>.
If those templates do not exist when you try to preview or display a new article,
you'll get this warning :-)  Please place your own templates in themes/<em>yourtheme</em>/modules/articles . The templates will get the extension .xt there. </p>
</div>
<div class="xar-norm xar-standard-box-padding">
   <h1><strong>Title:</strong>&nbsp;Debuggers Should Go Backwards</h1>
<p><strong>Author:</strong>&nbsp;</p>
<p>
<strong>Date:</strong> 02 December 2005 06:00:00 +00:00 or Fri, 02 December 2005 06:00:00 +00:00</p>
<p><strong>Summary:</strong>&nbsp;<p>The computer science community has shown a woeful lack of interest in debugging, which given the huge economic cost of debugging is somewhat mysterious. However, there may be signs of &quot;green shoots&quot; in the desert landscape of debugging tools.</p></p>
<p><strong>Body:</strong>&nbsp;<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e27" id=
"d0e27"></a>Introduction</h2>
</div>
<p>The computer science community has shown a woeful lack of
interest in debugging, which given the huge economic cost of
debugging is somewhat mysterious. However, there may be signs of
&quot;green shoots&quot; in the desert landscape of debugging tools. There
are many tools and techniques that offer significant improvement
over the trusty <tt class="literal">printf</tt>, and over the past
year or two there have been some particularly noteworthy
developments, including analytical tools such as Valgrind [<a href=
"#Seward-">Seward-</a>], along with a new breed of debuggers:
<i class="firstterm">bidirectional debuggers</i>. These allow the
programmer to step their program backwards as well as forwards, and
so are much more helpful than traditional debuggers in taking the
programmer to the source of their bug.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e41" id="d0e41"></a>A Brief History
of Debugging</h2>
</div>
<p>Debugging is as old as programming itself. Maurice Wilkes said
[<a href="#Wilkes">Wilkes</a>] of his experiences writing some of
the world's first programs in 1949:</p>
<div class="blockquote">
<blockquote class="blockquote">
<p>As soon as we started programming, we found to our surprise that
it wasn't as easy to get programs right as we had thought.
Debugging had to be discovered. I can remember the exact instant
when I realized that a large part of my life from then on was going
to be spent in finding mistakes in my own programs.</p>
</blockquote>
</div>
<p>Despite high-level languages and other paradigm-shifting changes
since 1949, most programmers still spend most of their time
debugging. In his seminal book <i class="citetitle">The Mythical
Man Month</i> [<a href="#Brooks">Brooks</a>], Frederic Brooks
claimed that even the best programmers produce only ten lines of
debugged code per day. In the 1995 revised edition he says this
alarming statistic is as true as ever. The operative word here is
<span class="emphasis"><em>debugged</em></span>. A programmer may
write 50 lines of code on the first two hours of Monday morning -
the remainder of their week will be spent trying to get those 50
lines to work correctly.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e63" id="d0e63"></a>Computing's
Dirty Little Secret</h2>
</div>
<p>Henry Lieberman of MIT used his guest editorial of the <i class=
"citetitle">Communications of the ACM</i> [<a href=
"#Lieberman">Lieberman</a>] to talk about what he calls
&quot;<span class="quote">the dirty little secret of computer
science</span>&quot;. That month's publication is subtitled <i class=
"citetitle">The Debugging Scandal and What to Do About It</i>. In
his editorial he says:</p>
<div class="blockquote">
<blockquote class="blockquote">
<p>What borders on scandal is the fact that the computer science
community as a whole has largely ignored the debugging problem.
This is inexcusable, considering the vast economic cost of
debugging.</p>
</blockquote>
</div>
<p>If you were programming in 1997, you'll know that little has
changed since Lieberman's call to arms. Given the enormous economic
costs of debugging, and the size of the market this therefore
implies, the lack of attention on debugging aids is somewhat
puzzling. Sure, there are have been a few interesting projects
around debugging over the years, but not much relative to the
amount of research on operating systems, languages, or just about
anything else. One might suppose that part of the reason is that
these are difficult problems to solve, but then language or
operating system1 design and implementation isn't exactly easy. We
suspect the relative lack of effort spent on debugging is as much
due to the lack of 'glamour' associated with it, as it is to do
with the problems being difficult ones.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e85" id="d0e85"></a>Are Things
Getting Better or Worse?</h2>
</div>
<p>While there has been some recent progress in programming and
debugging tools (see sections 2 and 3), two trends in computer
science are threatening to offset these advances.</p>
<p>The first is multithreading. More and more modern applications
are multithreaded. And with SMP/multicore CPUs becoming mainstream
and clock frequencies flat-lining, if we want to exploit the power
in future generations of processors its likely our programs will
need to become more multithreaded still.</p>
<p>If multithreading is making debugging harder, today's security
concerns are &quot;raising the bar&quot; when it comes to the quality
standards that modern software must meet. Yesterday's
pathological/theoretical concerns that were never likely to bite in
real life are today's security vulnerabilities.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e94" id="d0e94"></a>Today's
Debugging Tools</h2>
</div>
<p>This section reviews some of the techniques commonly used to
debug today's code. It is by no means exhaustive; the intent is
merely to give examples of the more common techniques.</p>
<p>We classify the different debugging techniques into three
groups, listed below.</p>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e101" id="d0e101"></a>Programmatic
Techniques</h3>
</div>
<p>Here programmers modify or write their program in order to help
find the bugs.</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p><span class="bold"><b>Print Statements.</b></span> This classic
is still the most widely used technique. In some senses the
technique's wide use reflects its simplicity and convenience (it's
rare that this technique isn't an option). But in other ways the
fact that print statements remain our number-one way of debugging
code is a reflection on the inadequacy of mainstream debugging
tools.</p>
</li>
<li>
<p><span class="bold"><b>Assertions.</b></span> An invaluable tool;
most good programmers use assertions liberally.</p>
</li>
<li>
<p><span class="bold"><b>Language Support.</b></span> If you're
lucky enough to be using a 'safe language' (e.g. Java or Python)
then there are many classes of bugs that just can't happen (e.g.
memory corruption bugs). Sadly, there are still many jobs where
these languages just aren't an option, and one needs to use lower
level languages such as C/C++ (or even assembler).</p>
</li>
<li>
<p><span class="bold"><b>Test-suites.</b></span> There is no excuse
for not having a test-suite for programming projects of even modest
size. Not only do they help identify new bugs quickly, if used
properly they can be an excellent way of preventing
regressions.</p>
</li>
</ul>
</div>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e127" id="d0e127"></a>Special Case
Diagnosis/Analysis Tools</h3>
</div>
<p>Some of the most interesting developments in debugging in recent
years have come in the forms of tools that help programmers ?nd
particular classes of errors in their programs. Some notable
examples are:</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p><span class="bold"><b>Purify.</b></span> [<a href=
"#Hastings-">Hastings-</a>] This tool instruments a running process
and finds common memory access violations. The full version is
available for Solaris and sold as part of IBM's Rational tool-suite
for several thousand dollars.</p>
</li>
<li>
<p><span class="bold"><b>BoundsChecker.</b></span> [<a href=
"#boundschecker">boundschecker</a>] Plugs into VisualStudio and
finds many common errors in programs by instrumenting running
programs. In a broad sense this is your answer to Purify if you're
running on Microsoft Windows (although the details are quite
different).</p>
</li>
<li>
<p><span class="bold"><b>Valgrind.</b></span> [<a href=
"#Seward-">Seward-</a>, <a href="#Nethercote-">Nethercote-</a>]
Started life as a sort of open source version of Purify, but has
grown in to something much more generic. More recent versions of
Valgrind allow one to plug several different 'skins' into the
Valgrind core in order to check for many different classes of bug
(e.g. touching unallocated memory, or potential deadlock
conditions).</p>
</li>
<li>
<p><span class="bold"><b>Coverity.</b></span> [<a href=
"#Coverity">Coverity</a>] A commercial product born out of an
interesting research project [<a href="#Engler-">Engler-</a>] that
extended gcc to find common errors at source code level. Before
going commercial their tool found over 2,000 bugs in the Linux
kernel. Sadly, you can't buy the Coverity software - their
consultants come to your organisation and run their magic on your
source code (they don't advertise their prices, but it is
presumably a safe bet that they don't come cheap!).</p>
</li>
<li>
<p><span class="bold"><b>Code coverage tools.</b></span> Code
coverage tools such as gcov are (in our experience) woefully rarely
used. Most programmers are very surprised to see just how little of
their code is covered by their test-suite (if they even have
one).</p>
</li>
<li>
<p><span class="bold"><b>Hardware protection.</b></span> Most
modern computer systems have memory management hardware to catch
illegal memory access when they happen. Many CPUs have other
debugging features, such as the Intel's debug registers that can
generate a debug exception whenever a specific virtual address is
accessed. These can be particularly useful when faced with obscure
memory corruption bugs.</p>
</li>
</ul>
</div>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e181" id="d0e181"></a>General-Purpose
Debuggers</h3>
</div>
<p>Special-case tools can be very useful for debugging. However,
such tools are only useful if your bug is of a certain well-known
kind (e.g. accessing a variable from two threads without protecting
it with a mutex, or accessing unallocated memory). If your bug
doesn't fit neatly into one of these categories, such tools don't
offer any help.</p>
<p>That's one of the reasons why general-purposes debuggers tend to
be used more frequently than do the kinds of special-case tools
presented in section 2. However, today's general purposes debuggers
have a major flaw: they let the programmer single-step their
program forwards, but debugging involves thinking backwards. To
debug a program is to reason backwards from the point of failure to
determine the cause of that failure. On the first page of their
book, <i class="citetitle">The Practice of Programming</i>[<a href=
"#Kernighan-">Kernighan-</a>], Brian Kernighan and Rob Pike give
the following advice to programmers when debugging:</p>
<div class="blockquote">
<blockquote class="blockquote">
<p>Reason back from the state of the crashed program to determine
what could have caused this. Debugging involves backwards
reasoning, like solving murder mysteries. Something impossible
occurred, and the only solid information is that it really did
occur. So we must think backwards from the result to discover the
reasons.</p>
</blockquote>
</div>
<p>Many programmers use debuggers only to examine a program's
state, and then reason backwards from here. Most of a debugger's
intelligence is geared towards letting the programmer single-step
forwards, but that's of limited help. To be really useful, a
debugger needs to help the programmer walk through the program's
execution in reverse.</p>
</div>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e199" id="d0e199"></a>Bidirectional
Debuggers</h2>
</div>
<p>Bidirectional debuggers walk the programmer though their program
backwards as well as forwards. The ability to step backwards from a
fault to diagnose its cause massively eases the burden of debugging
- the programmer can now get straight to the source of the bug.</p>
<p>The aforementioned Kernighan and Pike go on to say in their
book:</p>
<div class="blockquote">
<blockquote class="blockquote">
<p>If it's a hard bug, you'll be making it happen over and over as
you track down the problem.</p>
</blockquote>
</div>
<p>Bidirectional debuggers herald an end to this running a program
again and again looking for the source of a bug; instead the
programmer can just rewind and play forwards the program, 'honing
in' on the source of their bug.</p>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e211" id="d0e211"></a>Bidirectional
Debuggers for Java</h3>
</div>
<p>Java programmers have had the benefit of bidirectional debugging
for a few years now. The first of these was a research tool by Bill
Lewis, known as ODB [<a href="#Lewis">Lewis</a>] (the Omniscient
Debugger). His research has demonstrated how programmers of varying
abilities were able quickly to track down bugs using ODB that
otherwise would have taken much longer. At this year's OOPSLA
conference, Bill offered $100 to anyone who could present a bug
that his debugger could not find - ODB passed the challenge.</p>
<p>There are now commercial bidirectional debuggers for Java:
Visicomp's RetroVue [<a href="#RetroVue">RetroVue</a>] and
Omnicore's CodeGuide [<a href="#Omnicore">Omnicore</a>] are
examples. Both have won many awards and accolades in the Java
community.</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e227" id="d0e227"></a>Bidirectional
Debugging of Entire Systems</h3>
</div>
<p>The GreenHills SuperTrace Probe records all state transitions a
computer system makes as it executes, and when used in conjunction
with their <span class="application">TimeMachine</span> debugger
[<a href="#timemachine">timemachine</a>] provides programmers with
bidirectional debugging of an entire computer system.</p>
<p>Likewise, the recently launched Hindsight [<a href=
"#Virtutech">Virtutech</a>] debugger from Virtutech allows
bidirectional debugging of a complete system by simulating the
hardware with software. Both of these systems are expensive (the
GreenHills SuperTrace Probe and TimeMachine debugger retail for
$20,000; Virtutech does not have standard pricing for Hindsight),
but if you want to debug a complete computer system (usually this
means an embedded system or possibly an operating system), then
they can be invaluable.</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e243" id="d0e243"></a>UndoDB:
Bidirectional Debugging for C/C++ Programs</h3>
</div>
<p><span class="application">UndoDB</span> has recently been
released for the GNU/Linux operating system on i386 PCs. It is
unique in that it allows bidirectional debugging of a
straightforward binary Linux process. No expensive hardware or
simulated hardware platform is necessary. Instead, UndoDB takes the
form of a wrapper around the widely used GNU debugger, gdb[<a href=
"#Gdb">Gdb</a>]. This means that programmers who are familiar with
gdb will feel right at home using UndoDB.</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e253" id="d0e253"></a>A Few Simple
Commands</h3>
</div>
<p>UndoDB works just like <span class="application">gdb</span>, but
adds a few new commands which revolutionise how <span class=
"application">gdb</span> can be used. There are the new commands
<tt class="literal">bnext</tt>, <tt class="literal">bstep</tt>,
<tt class="literal">bnexti</tt>, <tt class="literal">bstepi</tt>,
<tt class="literal">bfinish</tt> and <tt class=
"literal">buntil</tt>. These work exactly like their forwards
counterparts <tt class="literal">next</tt>, <tt class=
"literal">step</tt>, <tt class="literal">nexti</tt>, <tt class=
"literal">stepi</tt>, <tt class="literal">finish</tt> and
<tt class="literal">until</tt>, except that instead of stepping the
program forwards one or more instructions, the program is reversed.
For example, the <tt class="literal">step</tt> command moves the
program forward to the next source line, possibly stepping to the
first line of a different function if the current line includes a
function call. Its <tt class="literal">bstep</tt> counterpart moves
the program back one source line, possibly stepping to the last
line of a different function if the previous source line included a
function call.</p>
<p>See the UndoDB man page [<a href="#Undodb">Undodb</a>] for a
full description of these commands.</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e311" id="d0e311"></a>Time</h3>
</div>
<p>To say UndoDB lets one run programs backwards as well as
forwards is not quite accurate. Rather UndoDB allows one to rewind
a debugged program to any point in its history, and examine the
program's state at that point. In the case of commands such as
<tt class="literal">bstepi</tt> this means stepping back to the
most recent time a particular source line was executed; by using
the <tt class="literal">bgoton</tt> command the programmer can go
back to an arbitrary point in the program's history. From any point
in history, the user can issue the normal <span class=
"application">gdb</span> commands such as <tt class=
"literal">continue</tt> or <tt class="literal">next</tt> to move
forwards, as well as the backwards commands such as <tt class=
"literal">bnext</tt>.</p>
<p>UndoDB measures time using the notion of &quot;simulated
nanoseconds&quot;. A simulated nanosecond approximates a nanosecond were
the program to execute normally, although there is no strict
correlation between wall-clock time and simulated nanoseconds. The
user can rewind their program almost instantly to any time in its
history by passing the requisite simulated nanoseconds argument to
the <tt class="literal">bgoton</tt> command. The programmer can
find out how many simulated nanoseconds have elapsed in the current
debugging session using the <tt class="literal">bget</tt>
command.</p>
<p>Critically, no matter how many times the program is rewound and
replayed, each instruction happens at exactly the same simulated
nanosecond each time. More generally, the program is entirely
deterministic: each time the program is at any given simulated
nanosecond, it will be exactly the same state.</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e344" id="d0e344"></a>Where To
Next?</h3>
</div>
<p>The functionality of the current release of UndoDB is somewhat
limited. Most notably, it only works on GNU/Linux on i386 or i686,
and debugging of multithreaded programs or programs that use
signals is not supported. In recognition that this precludes
UndoDB's use with a large number of modern computer programs,
anyone who buys a commercial-use license before the end of 2005
will receive a free upgrade to UndoDB version 2.0 as soon as it is
released. Version 2.0 will include support for multithreaded
programs and programs that use signals. (We feel that bidirectional
debugging will be particularly effective when used with
multithreaded programs, especially given the way programs can be
rewound and replayed many times, all entirely
deterministically.)</p>
<p>There are many other features that are planned for releases
subsequent to 2.0. This includes support for other architectures
(such as x86-64, ARM or MIPS), and other operating systems (such as
Microsoft Windows, Apple's OS X, or the various flavours of
BSD).</p>
<p>Also planned are advanced debugging features, such as the
ability to change state at a point in the program's history and
then replay (thus &quot;rewriting history&quot;) or to find the most recent
time in a program's history that completely arbitrary criteria were
met (such as some expression evaluating to true).</p>
</div>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e353" id=
"d0e353"></a>Conclusion</h2>
</div>
<p>Debugging has for too long been computing's dirty little secret.
But things are beginning to change. Among a few new debugging
technologies to emerge over the past few years, bidirectional
debugging in particular promises to revolutionise the way programs
are debugged, drastically reducing development times and at the
same time improving software quality.</p>
<p>In the short time Java bidirectional debuggers have been
available they have already shown impressive results. Of particular
relevance to readers of this publication are new tools that bring
bidirectional debugging to C and C++ programmers. For programmers
who are writing code that controls the computer system directly
(i.e. low-level embedded programmers and operating system
programmers), the GreenHills TimeMachine debugger [<a href=
"#timemachine">timemachine</a>] and the Simics Hindsight [<a href=
"#Virtutech">Virtutech</a>] debuggers offer compelling (if
expensive) solutions. For programmers of C/C++2 on GNU/Linux,
UndoDB extends the familiar gdb with bidirectional debugging
capabilities.</p>
<p>Some have said that bidirectional debugging represents the
biggest change to the way we debug software since the first
symbolic debuggers appeared many decades ago. We agree.</p>
</div>
<div class="bibliography">
<div class="titlepage">
<h2><a name="d0e368" id="d0e368"></a>References</h2>
</div>
<div class="bibliomixed"><a name="Brooks" id="Brooks"></a>
<p class="bibliomixed">[Brooks] Frederic Brooks. The Mythical Man
Month: Essays on Software Engineering, Anniversary Edition.
Addison-Wesley, 1995.</p>
</div>
<div class="bibliomixed"><a name="RetroVue" id="RetroVue"></a>
<p class="bibliomixed">[RetroVue] Visicomp corp. RetroVue Java
Software Visualization Tool. <span class="bibliomisc"><a href=
"http://%20visicomp.com/product/retrovue/index.html" target=
"_top">http://
visicomp.com/product/retrovue/index.html</a></span>.</p>
</div>
<div class="bibliomixed"><a name="boundschecker" id=
"boundschecker"></a>
<p class="bibliomixed">[boundschecker] Compuware Corporation.
Compuware boundschecker for devpartner. <span class=
"bibliomisc"><a href=
"http://www.compuware.%20com/products/devpartner/bounds.%20htm"
target="_top">http://www.compuware. com/products/devpartner/bounds.
htm</a></span>.</p>
</div>
<div class="bibliomixed"><a name="Coverity" id="Coverity"></a>
<p class="bibliomixed">[Coverity] Coverity Corporation.
Breakthrough technology to find catastrohpic flaws in source code.
<span class="bibliomisc"><a href="http://coverity.com/" target=
"_top">http://coverity.com/</a></span>.</p>
</div>
<div class="bibliomixed"><a name="Engler-" id="Engler-"></a>
<p class="bibliomixed">[Engler-] Dawson R. Engler, David Yu Chen,
and Andy Chou. 'Bugs as inconsistent behavior: A general approach
to inferring errors in systems code' in Symposium on Operating
Systems Principles, pages 57-72, 2001.</p>
</div>
<div class="bibliomixed"><a name="Gdb" id="Gdb"></a>
<p class="bibliomixed">[Gdb] The Free Software Foundation. Gdb: The
gnu project debugger. <span class="bibliomisc"><a href=
"http://gnu.org/%20software/gdb" target="_top">http://gnu.org/
software/gdb</a></span>.</p>
</div>
<div class="bibliomixed"><a name="Hastings-" id="Hastings-"></a>
<p class="bibliomixed">[Hastings-] R. Hastings and B. Joyce.
'Purify: Fast detection of memory leaks and access errors' in
Proceedings of the Winter USENIX Conference, December 1992.</p>
</div>
<div class="bibliomixed"><a name="Kernighan-" id="Kernighan-"></a>
<p class="bibliomixed">[Kernighan-] Brian Kernighan and Rob Pike.
The Practice of Programming. Addison Wesley, 1999.</p>
</div>
<div class="bibliomixed"><a name="Lewis" id="Lewis"></a>
<p class="bibliomixed">[Lewis] Bill Lewis. Omniscient debugging.
<span class="bibliomisc"><a href=
"http://lambdacs.com/debugger/debugger.html" target=
"_top">http://lambdacs.com/debugger/debugger.html</a></span>.</p>
</div>
<div class="bibliomixed"><a name="Lieberman" id="Lieberman"></a>
<p class="bibliomixed">[Lieberman] Henry Lieberman. 'The debugging
scandal and what to do about it.' Communications of the ACM, April
1997.</p>
</div>
<div class="bibliomixed"><a name="Nethercote-" id=
"Nethercote-"></a>
<p class="bibliomixed">[Nethercote-] Nicholas Nethercote and Julian
Seward. 'Valgrind: A program supervision framework' in Proceedings
of the Third Workshop on Runtime Verification (RV'03), Boulder,
Colorado, USA, July 2003.</p>
</div>
<div class="bibliomixed"><a name="Pike" id="Pike"></a>
<p class="bibliomixed">[Pike] Rob Pike. Systems Software Research
is Irrelevant. <span class="bibliomisc"><a href=
"http://cm.bell-labs.com/%20who/rob/utah2000.ps" target=
"_top">http://cm.bell-labs.com/ who/rob/utah2000.ps</a></span>,
February 2000.</p>
</div>
<div class="bibliomixed"><a name="Seward-" id="Seward-"></a>
<p class="bibliomixed">[Seward-] Julian Seward, Nicholas
Nethercote, Jeremy Fitzhardinge, et al. Valgrind. <span class=
"bibliomisc"><a href="http://www.valgrind.org/" target=
"_top">http://www.valgrind.org/</a></span>.</p>
</div>
<div class="bibliomixed"><a name="timemachine" id=
"timemachine"></a>
<p class="bibliomixed">[timemachine] Green Hills Software. Green
hills timemachine. <span class="bibliomisc"><a href=
"http://www.ghs.com/products/%20timemachine.html" target=
"_top">http://www.ghs.com/products/
timemachine.html</a></span>.</p>
</div>
<div class="bibliomixed"><a name="Omnicore" id="Omnicore"></a>
<p class="bibliomixed">[Omnicore] Omnicore Software. Omnicore
website. <span class="bibliomisc"><a href="http://omnicore.com"
target="_top">http://omnicore.com</a></span>.</p>
</div>
<div class="bibliomixed"><a name="Undodb" id="Undodb"></a>
<p class="bibliomixed">[Undodb] Undo Software. Undodb man page.
<span class="bibliomisc"><a href=
"http://undo-software.com/%20undodb_man" target=
"_top">http://undo-software.com/ undodb_man</a></span>.</p>
</div>
<div class="bibliomixed"><a name="Virtutech" id="Virtutech"></a>
<p class="bibliomixed">[Virtutech] Virtutech. Simics hindsight.
<span class="bibliomisc"><a href=
"http://www.virtutech.com/%20products/simics-hindsight.html"
target="_top">http://www.virtutech.com/
products/simics-hindsight.html</a></span>.</p>
</div>
<div class="bibliomixed"><a name="Wilkes" id="Wilkes"></a>
<p class="bibliomixed">[Wilkes] Maurice Wilkes. Familiar and
unfamiliar quotations. <span class="bibliomisc"><a href=
"http://%20www.norvig.com/quotations.html" target="_top">http://
www.norvig.com/quotations.html</a></span>.</p>
</div>
</div>
</p>
<p><strong>Notes:</strong>&nbsp;</p>
<p><em>More fields may be available via dynamicdata ..</em></p>
</div>
</channel>
</rss>
