  Program errors are hard to find because of the cause-effect gap between the
time when an error occurs and the time when the error becomes apparent to the
programmer. Although debugging techniques such as conditional and data
breakpoints help to find error causes in simple cases, they fail to effectively
bridge the cause-effect gap in many situations. Query-based debuggers offer
programmers an effective tool that provides instant error alert by continuously
checking inter-object relationships while the debugged program is running. To
enable the query-based debugger in the middle of program execution in a
portable way, we propose efficient Java class file instrumentation and discuss
alternative techniques. Although the on-the-fly debugger has a higher overhead
than a dynamic query-based debugger, it offers additional interactive power and
flexibility while maintaining complete portability. To speed up dynamic query
evaluation, our debugger implemented in portable Java uses a combination of
program instrumentation, load-time code generation, query optimization, and
incremental reevaluation. This paper discusses on-the-fly debugging and
demonstrates the query-based debugger application for debugging Java gas tank
applet as well as SPECjvm98 suite applications.
