Time notation

The Undo Engine divides the execution history of a program into BBs, units of execution consisting of deterministic operations, and in which each program counter value appears at most once.

A time in execution history is specified as a bbcount (representing the start of the BB), or as bbcount:pc (representing a PC in the BB).

Note

UDB accepts commas in the bbcount, so you can insert them to make a bbcount more readable. For example, 1,234,567 and 1234567 represent the same bbcount.

This concept of time is unrelated to wall-clock time. For example, if a program is blocked in a call to sleep(), the bbcount does not increment as no instructions are being executed.

Time commands

Inspect the current time using the info time command, and jump to a time using the ugo time command. To help manage times, create bookmarks associating memorable names with times. To convert between time in execution history and wall-clock time, use the Log Jump feature.

info time [-a]

The current time in execution history.

This is the number of BBs that the program has executed (the bbcount).

-a

Append the program counter value.

For example:

4% 9,704> info time
Current time is: 9,704 (in recorded range: [1 - 231,025])
4% 9,704> info time -a
Current time is: 9,704:0x5555555552c5 (in recorded range: [1 - 231,025])

ugo time bbcount[:pc]

Jump to a time in the program’s execution history.

Specify the time as bbcount to jump to the start of a BB, or as bbcount:pc to jump to a program counter value in a BB.

If bbcount is beyond the end of execution history, the program switches to record mode if necesary and continues execution until the specified bbcount is reached, or the program finishes, or a breakpoint is hit.

If the program does not reach the specified pc in the given bbcount, the time-travel operation fails.

For example:

4% 9,704> ugo time 4
elf_get_dynamic_info (temp=0x0, l=0x7ffff7ffd9f0 <_rtld_global+2448>) at get-dynamic-info.h:50
50      get-dynamic-info.h: No such file or directory.
0% 4> ugo time 9,704:0x5555555552c5
main () at cache.c:71
71              if (i % 100 == 0)

ugo time +bbcounts|-bbcounts

Jump forwards or backwards in the program’s execution history by the specified number of bbcounts.

Technical design

The reasons for representing time using the bbcount:pc notation are:

  • Precision and unambiguity: each executed instruction in a program corresponds to a unique time in the program’s execution history.

  • Performance: it’s easy to determine the bbcount and program counter, without the need for an expensive system call.

  • Convenience: it’s easy to compare two times in bbcount:pc notation.

  • Concision: in most cases the bbcount alone is sufficient to identify a time of interest.

Warning

There is no guarantee that different runs of a program will execute the same sequence of BBs. Non-deterministic events such as address space layout randomization, signal delivery, thread switches, and so on, may cause the execution flow to be different from run to run.