Omniscient Debugging(lambdacs.com)
lambdacs.com
Omniscient Debugging
http://www.lambdacs.com/debugger/
12 comments
Feedback -- not of the 'comments and criticism' variety.
Think of any successful project like a nuclear chain reaction. If you are not familiar with nuclei, some of them are "too heavy" and want to fall apart, spraying neutrons everywhere; they especially do this when they get absorb an extra neutron flying around, but quantum mechanics always gives you a spare neutron eventually.
The system transitions from negative feedback (no chain reaction) to positive feedback (chain reaction) according to a very simple principle: the number of free neutrons that a free neutron creates (call it N) must be more than one. (N=1 is the replacement rate; it's a metastable state of reaction. If you like, the reason why some nuclear reactors have been risky is that horrible accidents kill the safeguards which are simply designed to force N ≤ 1.)
This principle is so fundamental -- it's why there's a 'meme' analogue to the 'genes' in the modern theory of evolution, why countries become bureaucracies, and why nuclear reactors are hard -- that I hope everyone working in startups starts thinking about their products this way. It's not signups which you need to have a successful product. It's that every free customer must convert, on average, greater than or equal to one new free customer. Even if you cannot get all the way to one, you boost your marketing effects by a factor of 1/(1 - N), so if you can increase N from converting 0.25 people per person to 0.30 people per person, it's as good as spending 10% more on marketing.
And it applies, yes, to any open-source project too. The open-source projects which succeed are those which help hackers to help those projects, just like the genes which succeed are the ones which help their species to spread that gene. I'm not even sure that this particular project is open-source. (I believe it falls into a special case where the GPL is used as a closed-source license. That is, GPL requires me to provide a copy of the source code when I distribute the code -- but I do not have the source code, and I cannot coerce the author into giving it to me, so I am not actually free to distribute the binary either until they give me permission to do so one way or another.) The author's claimed reason for not providing a way to "Fork me on GitHub" is, "I have not made a major effort to put its code on any of the open source repositories as it does not currently seem the right thing to do. Just not worth the effort." And that's probably the deepest reason why it's fallen into neglect.
Think of any successful project like a nuclear chain reaction. If you are not familiar with nuclei, some of them are "too heavy" and want to fall apart, spraying neutrons everywhere; they especially do this when they get absorb an extra neutron flying around, but quantum mechanics always gives you a spare neutron eventually.
The system transitions from negative feedback (no chain reaction) to positive feedback (chain reaction) according to a very simple principle: the number of free neutrons that a free neutron creates (call it N) must be more than one. (N=1 is the replacement rate; it's a metastable state of reaction. If you like, the reason why some nuclear reactors have been risky is that horrible accidents kill the safeguards which are simply designed to force N ≤ 1.)
This principle is so fundamental -- it's why there's a 'meme' analogue to the 'genes' in the modern theory of evolution, why countries become bureaucracies, and why nuclear reactors are hard -- that I hope everyone working in startups starts thinking about their products this way. It's not signups which you need to have a successful product. It's that every free customer must convert, on average, greater than or equal to one new free customer. Even if you cannot get all the way to one, you boost your marketing effects by a factor of 1/(1 - N), so if you can increase N from converting 0.25 people per person to 0.30 people per person, it's as good as spending 10% more on marketing.
And it applies, yes, to any open-source project too. The open-source projects which succeed are those which help hackers to help those projects, just like the genes which succeed are the ones which help their species to spread that gene. I'm not even sure that this particular project is open-source. (I believe it falls into a special case where the GPL is used as a closed-source license. That is, GPL requires me to provide a copy of the source code when I distribute the code -- but I do not have the source code, and I cannot coerce the author into giving it to me, so I am not actually free to distribute the binary either until they give me permission to do so one way or another.) The author's claimed reason for not providing a way to "Fork me on GitHub" is, "I have not made a major effort to put its code on any of the open source repositories as it does not currently seem the right thing to do. Just not worth the effort." And that's probably the deepest reason why it's fallen into neglect.
Yes, I found this bit about not setting up a public repository strange, too, but the reason there is no "Fork me on GitHub" seems to be just that the project predates Github by a year :)
You're hinting at licensing as (one of) a reason that this project was abandoned, but I think the author just wasn't sure what to do with his code - I think he wanted to get some money out of the project and didn't know or couldn't decide how to do it. If enough users told him they wanted the source, I think he would comply - it's just that there never was enough users (seems so).
Your analysis is interesting and a good one (thanks!), but it doesn't answer the more fundamental question: why the project failed to get another user out from every user it already had? That's assuming somebody was actually using ODB - maybe it failed at even lower level: everyone said it's cool and stuff, but nobody really gave it a chance and actually started using it.
I'd like to know which one it is and why? If something like this was available for Python (btw: is there something similar?) I think I would use it instead of ipdb without hesitation (assuming that I would know about it).
From what the author writes he did his best to inform the Java world about his and his project existence. So why aren't we all using this and similar tools today?
I think this can be an interesting case for every developer who wants to change something with his software. This debugger failed; LightTable seems to have a high chance of succeeding - what's the difference between them? (Not having Bret Victor talks as an inspiration seems an obvious one :))
You're hinting at licensing as (one of) a reason that this project was abandoned, but I think the author just wasn't sure what to do with his code - I think he wanted to get some money out of the project and didn't know or couldn't decide how to do it. If enough users told him they wanted the source, I think he would comply - it's just that there never was enough users (seems so).
Your analysis is interesting and a good one (thanks!), but it doesn't answer the more fundamental question: why the project failed to get another user out from every user it already had? That's assuming somebody was actually using ODB - maybe it failed at even lower level: everyone said it's cool and stuff, but nobody really gave it a chance and actually started using it.
I'd like to know which one it is and why? If something like this was available for Python (btw: is there something similar?) I think I would use it instead of ipdb without hesitation (assuming that I would know about it).
From what the author writes he did his best to inform the Java world about his and his project existence. So why aren't we all using this and similar tools today?
I think this can be an interesting case for every developer who wants to change something with his software. This debugger failed; LightTable seems to have a high chance of succeeding - what's the difference between them? (Not having Bret Victor talks as an inspiration seems an obvious one :))
Well, I have used it, and it works, but I only use it in very specific cases. First of all, it's a bit of a bother to run; for one, it's not integrated with the IDE. So for bugs in simple areas of the code, I just don't bother and use the integrated debugger.
Then, the really hard problems (for me) usually involve a concurrency bug that manifests itself after a while. When ODB runs out of memory, it will discard the earlier part of the recording (it uses a circular buffer), and so I've found that some vital information is lost.
So I've found that ODB is great for complex algorithm bugs that are easy to reproduce in a controlled fashion. For other use-cases, it's either lacking in power or too much of a hassle.
Then, the really hard problems (for me) usually involve a concurrency bug that manifests itself after a while. When ODB runs out of memory, it will discard the earlier part of the recording (it uses a circular buffer), and so I've found that some vital information is lost.
So I've found that ODB is great for complex algorithm bugs that are easy to reproduce in a controlled fashion. For other use-cases, it's either lacking in power or too much of a hassle.
I take a different standpoint than other people. I think that the problem is that debugging is a central task to people's work. They know the ins and outs of debugging with their current system. In order to switch to something new, they would need some guarantees, the most important being that the system will continue and improve for the foreseeable future. There is no point in learning a new system which will vanish in a few months. The leading indicator for this is the number of people who currently use the technology. Therefore, you have a chicken and an egg problem.
Very cool. A C/C++ version (also mildly abandoned around the same time) was done by Robert O'Callahan, a very smart guy...
Worth checking out and it would be nice if someone could pick it up and develop it more actively.
http://code.google.com/p/chronomancer/
Worth checking out and it would be nice if someone could pick it up and develop it more actively.
http://code.google.com/p/chronomancer/
For C/C++, the reverse execution support in gdb may be good enough (http://sourceware.org/gdb/current/onlinedocs/gdb/Reverse-Exe...)
"The Chronicle framework provides complete register and memory-level recording of Linux processes and efficient queries over the recorded traces."
Wow, I was looking for something exactly like this a while ago, but was unable to find it. I notice that these days with Google it's really hard to find a tool or project when you're looking for it especially if it's more obscure. Might be a consequence of the ranking rules that crowd lesser known pages out.
Wow, I was looking for something exactly like this a while ago, but was unable to find it. I notice that these days with Google it's really hard to find a tool or project when you're looking for it especially if it's more obscure. Might be a consequence of the ranking rules that crowd lesser known pages out.
BTW I looked around a bit and found another similar system, based on QEMU instead of Valgrind, claiming to be faster, ie less runtime overhead while tracing, and also supporting kernel mode:
http://wiki.nss.cs.ubc.ca/Tralfamadore
Edit: never mind, the program does not seem to be publicly available, just papers
Edit: never mind, the program does not seem to be publicly available, just papers
I occasionally use the omniscient debugger to debug some particularly tricky bugs, and it's always proved quite useful.
There is also a more modern-looking, commercial implementation of the same concept, but I've never used it: http://www.chrononsystems.com/
There is also a more modern-looking, commercial implementation of the same concept, but I've never used it: http://www.chrononsystems.com/
you don't have to wonder which threads ran when
How does that work? Does it really record every single assignment to every variable in every thread? Wouldn't that potentially slow everything down sufficiently that some classes of multithreaded bugs wouldn't show up under ODB?
How does that work? Does it really record every single assignment to every variable in every thread? Wouldn't that potentially slow everything down sufficiently that some classes of multithreaded bugs wouldn't show up under ODB?
Interesting concept (one that i actually stumbled upon a couple of years ago).
If i would venture to guess why people don't use it more often i would say that it's because the marginal win (ease of debugging for a certain class of hard bugs) is smaller then the hassle of changing the complete toolset (current debugger and tools).
My guess this kind of tool is really good at a small class of hard bugs (which in general are pretty rare). For all the other the current tools are good enough so a switch would be costly for no immediate gain.
If i would venture to guess why people don't use it more often i would say that it's because the marginal win (ease of debugging for a certain class of hard bugs) is smaller then the hassle of changing the complete toolset (current debugger and tools).
My guess this kind of tool is really good at a small class of hard bugs (which in general are pretty rare). For all the other the current tools are good enough so a switch would be costly for no immediate gain.
How does this compare with the tools mentioned here: http://stackoverflow.com/a/4561350/388928
I believe Visual Studio 201x Intellitrace feature is very similar, it "lets developers step back in time to see what happened in an application without having to restart the debugger".
http://msdn.microsoft.com/en-us/library/vstudio/dd264915.asp...
http://msdn.microsoft.com/en-us/library/vstudio/dd264915.asp...
There is an open-source (but Linux only) project called FReD which does reversible debugging for C and C++ programs: https://github.com/fred-dbg/fred
It works without modifying the program (e.g. no recompilation step necessary) or the debugger (like gdb).
It works without modifying the program (e.g. no recompilation step necessary) or the debugger (like gdb).
The OCaml debugger also has time travel (http://caml.inria.fr/pub/docs/manual-ocaml-4.00/manual030.ht...).
Such an advanced debugger would make me miss the hours spent debugging a bug just to jump over and/or press the wrong key on the line of code revealing the real problem. That'd be unacceptable.
Try Chronon. While Omniscent is a research project, Chronon is a full blown product http://www.chrononsystems.com/
"Everybody loves it! They clearly understand the concept. They ask great questions, they make suggestions. But do they use it afterwards??
The ODB is as close to a silver bullet as you can get. Why don't people use it?
I don't get it. :-("
"Needed
More than anything else, I need people to use the ODB."
Now, this tool is not for me personally - I don't see myself writing for JVM anytime soon - but it seems really good. I wanted to ask you, as the author is asking, why don't you, Java and other JVM programmers, use this tool?
Is it that there are better tools? You're not allowed to use this? You don't think it is worth it? The tool itself proved to be somehow lacking? Or are you actually using it heavily and the page is outdated?
I know nothing about Java ecosystem, Java programming or about ODB - I just felt that, if what the author writes is true, it's truly sad situation and would like to know why it happened.