Pernosco displays a set of view panes, each showing some aspect of program execution across time.
Here Stdout/stderr shows what was written to the console during execution (technicially, every write to stdout/stderr of the root recorded process). Stack shows the function calls leading up to the current program point (that have not already returned). The basics-demo.cpp source view shows where the selected stack frame is executing. The source annotations show which lines were executed in this function call.
Highlighted elements in each view pane show the current point in time relative to the other elements of the view.
Traditional debuggers have an notion of "the current point in time" that is tied to heavyweight internal state (typically a set of running processes). In Pernosco, "the current point in time" is still a useful UI concept (we call it the focus), but it is merely a parameter to queries to our omniscient database, so we can change it freely and instantly. In the demo below, the user clicks on "Line A" in the stdout view to jump directly to the point where that output was produced.
The Pernosco focus is the current point in time, plus a stack frame and optionally some data inside the program, that the user is currently inspecting. Clicking an element of a view shifts the focus to that element.
Another key concept is that all interactions should respond instantly. Omniscient debugging means there is no excuse for making developers wait. This is a toy example, but even in complex applications with lengthy run times we can shift the focus anywhere in the history and display the state immediately.
"Sea of panes" interfaces are not very satisfying. We have introduced concepts such as the search box and toolbox to mitigate some of the problems, but ultimately window management is a hard problem and we don't claim to have a great solution to it.