Crossing abstraction barriers when debugging in dynamic languages

Programmers use abstractions to reduce implementation effort and focus on domain-specifics. The resulting application often runs in a convenient guest runtime that is provided by an increasingly complex ecosystem of libraries, VMs, JIT-compilers, operating systems, and native machine architectures. While abstractions are designed to hide complexity, experience tells us that "All non-trivial abstractions, to some degree, are leaky."1 Leaky abstractions are problematic, for example, when the use of under-documented or unspecified behavior of a library or virtual machine causes a failure in domain-specific code. Users may need to understand whether the virtual machine is just under-documented but working as intended or faulty. At that point, the artificially created barrier that protects language users from domain-independent complexity becomes an obstacle. We call this crossing the abstraction barrier. Prior research has investigated how symbolic debuggers can work across language barriers. However, this resulted in dedicated workflows and UIs that differ substantially from traditional symbolic debugging. Users need to remember these rather elaborate workflows, and the learning effort is often larger than the perceived benefit of answering the given debugging questions. As a result, the value of these tools may not be immediately recognized and developers will only consider learning them after having spent much time with conventional debugging methods. We propose an interaction model that generalizes the conventional symbolic debugger so that the known workflow can be kept and users can opt-in to cross-abstraction debugging when necessary. By replacing the traditional list view on the active call chain with a tree model and adding perspective selection, we obtain an unobtrusive, minimal user interface that still offers powerful cross-language debugging features.

[1]  Robert Hirschfeld,et al.  Multi-level debugging for interpreter developers , 2016, MODULARITY.

[2]  Jack C. Wileden,et al.  High-level debugging of distributed systems: The behavioral abstraction approach , 1983, J. Syst. Softw..

[3]  Mark van den Brand,et al.  TIDE: A Generic Debugging Framework - Tool Demonstration , 2005, Electron. Notes Theor. Comput. Sci..

[4]  Richard H. Crawford,et al.  A dataflow approach to event‐based debugging , 1991, Softw. Pract. Exp..

[5]  Gerald J. Sussman,et al.  Structure and interpretation of computer programs , 1985, Proceedings of the IEEE.

[6]  Mireille Ducassé,et al.  Coca: an automated debugger for C , 1999, Proceedings of the 1999 International Conference on Software Engineering (IEEE Cat. No.99CB37002).

[7]  Kai Xu,et al.  Debugging object-oriented programs with behavior views , 2005, AADEBUG'05.

[8]  Bernd Mathiske The maxine virtual machine and inspector , 2008, OOPSLA Companion.

[9]  Andrei Chis,et al.  The Moldable Debugger: A Framework for Developing Domain-Specific Debuggers , 2014, SLE.

[10]  Albert Zündorf,et al.  Graph Based Debugging with Fujaba , 2002, Electron. Notes Theor. Comput. Sci..