53
For each universe there are a dozen others; one must lack my bug?

A Partial Multiverse Model of Time Travel for Debugging

  • Upload
    awwaiid

  • View
    117

  • Download
    2

Embed Size (px)

DESCRIPTION

As presented at RubyConf 2014 (San Diego). Lots of live coding, I'll link the video eventually. ABSTRACT: Ever type 'next' into your debugger and then realize you should have used 'step'? Or perhaps invoked a method that you wish you could take back? Regret no more! Just turn the clock back a few ticks and begin again! With only a few restrictions and side-effects we will learn how to construct and use a time machine. WARNING: Time travel may cause zombies. Github: https://github.com/awwaiid/pry-timetravel RubyGems: https://rubygems.org/gems/pry-timetravel

Citation preview

Page 1: A Partial Multiverse Model of Time Travel for Debugging

For each universethere are a dozen others;one must lack my bug?

Page 2: A Partial Multiverse Model of Time Travel for Debugging

A Partial-Multiverse Modelof Time Travelfor Debugging

RubyConf 2014

Brock [email protected]@optoro.com

Page 3: A Partial Multiverse Model of Time Travel for Debugging

awwaiid@rbconf:~$ whoami

Page 4: A Partial Multiverse Model of Time Travel for Debugging

Debuggers

Page 5: A Partial Multiverse Model of Time Travel for Debugging

pry-byebug

Page 6: A Partial Multiverse Model of Time Travel for Debugging

How does THAT work‽

Page 7: A Partial Multiverse Model of Time Travel for Debugging

Sweet

Page 8: A Partial Multiverse Model of Time Travel for Debugging

OK. What could be better?

Page 9: A Partial Multiverse Model of Time Travel for Debugging

MAD SCIENCE

Page 10: A Partial Multiverse Model of Time Travel for Debugging

pry-timetravel

Page 11: A Partial Multiverse Model of Time Travel for Debugging

And we're done!

Page 12: A Partial Multiverse Model of Time Travel for Debugging

The Idea

(nothing new under the sun)

Page 13: A Partial Multiverse Model of Time Travel for Debugging

fork() the universe during 'next'

Page 14: A Partial Multiverse Model of Time Travel for Debugging

Suspend the child fork

Page 15: A Partial Multiverse Model of Time Travel for Debugging

Keep track of all created child forks

Page 16: A Partial Multiverse Model of Time Travel for Debugging

Upon 'back', grab the most recent child fork

Page 17: A Partial Multiverse Model of Time Travel for Debugging

Resume (time-travel!) the previous child fork

Page 18: A Partial Multiverse Model of Time Travel for Debugging

Wha?

Page 19: A Partial Multiverse Model of Time Travel for Debugging

Two essential ingredients.

Page 20: A Partial Multiverse Model of Time Travel for Debugging

Unix fork()

Page 21: A Partial Multiverse Model of Time Travel for Debugging

New child process:

new (child) PIDcopy of memoryshare file handles (sockets)... other stuffruns separately

Page 22: A Partial Multiverse Model of Time Travel for Debugging

Copy-On-Write!

Page 23: A Partial Multiverse Model of Time Travel for Debugging

Signals

Page 24: A Partial Multiverse Model of Time Travel for Debugging

Registered OS callbacks

Page 25: A Partial Multiverse Model of Time Travel for Debugging

SIGINT

SIGTERM

SIGKILL

SIGHUP

SIGUSR1

SIGALRM

SIGTSTP

Page 26: A Partial Multiverse Model of Time Travel for Debugging

SIGINT (^C)

SIGTERM (kill)

SIGKILL (kill -9)

SIGHUP (daemon reload)

SIGUSR1 (... things ...)

SIGALRM (just another 5 minutes!)

Page 27: A Partial Multiverse Model of Time Travel for Debugging

Signal handling / sending in Ruby

Page 28: A Partial Multiverse Model of Time Travel for Debugging

SIGTSTP (^Z)

SIGSTOP

SIGCONT

Page 29: A Partial Multiverse Model of Time Travel for Debugging
Page 30: A Partial Multiverse Model of Time Travel for Debugging

def snap if child_pid = fork # I am the parent! Process.kill 'SIGSTOP', $$ else # I am the child! @snap_pid.push child_pid endend

Page 31: A Partial Multiverse Model of Time Travel for Debugging

def restore Process.kill 'SIGCONT', @snap_pid[-1] Process.kill 'SIGSTOP', $$end

Page 32: A Partial Multiverse Model of Time Travel for Debugging

Limitation:

Shared file handles (inc. sockets!)

Page 33: A Partial Multiverse Model of Time Travel for Debugging

Limitation:

External state.

Page 34: A Partial Multiverse Model of Time Travel for Debugging

Limitation:

Threads. Not so much.

Page 35: A Partial Multiverse Model of Time Travel for Debugging

Limitation:

Can only travel back to checkpoints

(see also: Primer)

Page 36: A Partial Multiverse Model of Time Travel for Debugging

Limitation:

Might crash the multiverse throughmemory exhaustion. I guess.

Page 37: A Partial Multiverse Model of Time Travel for Debugging

Wrap in a pry pluginand we're done, right?

Page 38: A Partial Multiverse Model of Time Travel for Debugging

Complication:

Shell detects STOP

Page 39: A Partial Multiverse Model of Time Travel for Debugging

awwaiid@floyd:~$ pry[1] pry(main)>zsh: suspended (signal) pry

Page 40: A Partial Multiverse Model of Time Travel for Debugging

Fix:

Make a dummy parent processthat just sleeps (or sig-pause)

Page 41: A Partial Multiverse Model of Time Travel for Debugging

Complication:

Killing parent snapshots

Page 42: A Partial Multiverse Model of Time Travel for Debugging

Fix:

Let the One True (parent) snapshotkill all of its children (via SIGUSR1).

(also: nope. totally wrong.)

Page 43: A Partial Multiverse Model of Time Travel for Debugging

Complication:

Every snapshot wants to clean up

Page 44: A Partial Multiverse Model of Time Travel for Debugging

Fix:

If you are not the current snapshot,terminate yourself without cleanup!

Page 45: A Partial Multiverse Model of Time Travel for Debugging

Complication:

ZOMBIES

Page 46: A Partial Multiverse Model of Time Travel for Debugging

Zombie:

Child process that has exited nicelybut then the parent exited not-nicely.

The process is dead, yet remains.

Page 47: A Partial Multiverse Model of Time Travel for Debugging

Great. Now we can go back!

Page 48: A Partial Multiverse Model of Time Travel for Debugging

I WANT MOAR

Page 49: A Partial Multiverse Model of Time Travel for Debugging

Tree of snapshots

Page 50: A Partial Multiverse Model of Time Travel for Debugging

TODO: auto-snapshot

Page 51: A Partial Multiverse Model of Time Travel for Debugging

References:

https://github.com/TomOnTime/timetravelpdb

http://programmers.stackexchange.com /questions/181527 /why-is-reverse-debugging-rarely-used

http://debug.elm-lang.org/

Page 52: A Partial Multiverse Model of Time Travel for Debugging

If I had the chanceI'd write a better haikuoh wait, I HAVE A TIME MACHINE

Page 53: A Partial Multiverse Model of Time Travel for Debugging

THE END