<p>You could have a look on the <code>Omniscient Debugging</code> which is refereed as the ODB by the author Bil Lewis <a href="http://arxiv.org/abs/cs/0310016" rel="nofollow noreferrer">paper</a>. ODB is an implementation of the <strong>offline log</strong> and <strong>replay</strong> way to make reverse debugging in <strong>Java</strong> come true.</p>
Reverse debugging for languages other than C/C++
<p>Recently, I started to use <a href="http://sourceware.org/gdb/wiki/ReverseDebug" rel="nofollow noreferrer">reverse debugging with gdb</a> in C++ and it works pretty well for certain types of problems (e.g., loops and recursive algorithms). Besides gdb, there are other commercial debuggers for C/C++ (e.g., <a href="http://undo-software.com/product/undodb-overview" rel="nofollow noreferrer">UndoDB</a>).</p>

<p>I wonder if there are good reversible debuggers for other languages?
I'm especially interested in Java and Ruby but the question is open to any language.</p>

<p>An alternative that I found is to run your application on a virtual machine and connect to it. The only implementation that I know of (but never tested) is <a href="http://www.replaydebugging.com/2008/08/vmware-workstation-65-reverse-and." rel="nofollow noreferrer">VMware's Replay Debugging</a>. I wonder for which types of debugging tasks it is suitable. Seems to be overkill for most common problems but it may be useful to debug communication or synchronization issues, which are generally hard to reproduce.</p>

<p>Background information:</p>

<ul>
<li>The term "Reverse Debugging" is used by gdb. However, there are many synonyms:

<ul>
<li>"Reversible Debugging"</li>
<li>Microsoft calls it IntelliTrace or "Historical Debugging"</li>
<li>In Java, such debuggers are sometimes known as an "Ominiscient Debugger"</li>
</ul></li>
<li>(on programmers.stackexchange) <a href="https://softwareengineering.stackexchange.com/questions/181527/why-is-reverse-debugging-rarely-used">Why is reverse debugging rarely used?</a></li>
</ul>