Professional Documents
Culture Documents
Slides For MzTake at ASE
Slides For MzTake at ASE
Guillaume Marceau,
Greg Cooper,
Shriram Krishnamurthi,
Steven Reiss
Brown University
1
pltscheme.org
The Bug
2 1 1 1
class ShortestPathSolver {
2 2
public HashMap backtrace = new HashMap();
private PriorityQueue q = new PriorityQueue();
public ShortestPathSolver(DirectedGraph graph,
Node source) {
source.weight = 0.0;
q.addAll(graph.getNodes());
while(!q.isEmpty()) {
Node node = (Node)q.extractMin();
List successors = graph.getSuccsOf(node);
for(Iterator succIt = successors.iterator();
succIt.hasNext(); )
relax(node, (Node)succIt.next());
}
System.out.println("Result backtrace:\n" +
backtrace.keySet());
}
public void relax(Node origin, Node dest) {
double candidateWeight =
origin.weight + origin.distanceTo(dest);
if (candidateWeight < dest.weight) {
dest.weight = candidateWeight;
backtrace.put(dest, origin);
}
}
}
2
pltscheme.org
The Bug
2 1 1 1
class ShortestPathSolver {
2 2
public HashMap backtrace = new HashMap();
private PriorityQueue q = new PriorityQueue();
public ShortestPathSolver(DirectedGraph graph,
Node source) {
source.weight = 0.0;
q.addAll(graph.getNodes());
while(!q.isEmpty()) {
Node node = (Node)q.extractMin();
List successors = graph.getSuccsOf(node);
for(Iterator succIt = successors.iterator();
succIt.hasNext(); )
relax(node, (Node)succIt.next());
}
System.out.println("Result backtrace:\n" +
backtrace.keySet());
}
public void relax(Node origin, Node dest) {
double candidateWeight =
origin.weight + origin.distanceTo(dest);
if (candidateWeight < dest.weight) {
dest.weight = candidateWeight;
backtrace.put(dest, origin);
}
}
}
3
pltscheme.org
The Bug
2 1 1 1
class ShortestPathSolver {
2 2
public HashMap backtrace = new HashMap();
private PriorityQueue q = new PriorityQueue();
public ShortestPathSolver(DirectedGraph graph,
Node source) {
source.weight = 0.0; Result backtrace:
q.addAll(graph.getNodes());
[[node 1 : distance 2],
while(!q.isEmpty()) { [node 2 : distance 2],
Node node = (Node)q.extractMin(); [node 3 : distance 3]
List successors = graph.getSuccsOf(node);
for(Iterator succIt = successors.iterator(); [node 4 : distance inf],
succIt.hasNext(); ) [node 5 : distance inf],
relax(node, (Node)succIt.next()); [node 6 : distance inf]]
}
System.out.println("Result backtrace:\n" +
backtrace.keySet());
}
public void relax(Node origin, Node dest) {
double candidateWeight =
origin.weight + origin.distanceTo(dest);
if (candidateWeight < dest.weight) {
dest.weight = candidateWeight;
backtrace.put(dest, origin);
}
}
}
4
pltscheme.org
The Bug
class ShortestPathSolver {
public HashMap backtrace = new HashMap();
private PriorityQueue q = new PriorityQueue();
public ShortestPathSolver(DirectedGraph graph,
Node source) {
source.weight = 0.0;
q.addAll(graph.getNodes());
while(!q.isEmpty()) {
Node node = (Node)q.extractMin();
List successors = graph.getSuccsOf(node);
for(Iterator succIt = successors.iterator();
succIt.hasNext(); )
relax(node, (Node)succIt.next());
}
System.out.println("Result backtrace:\n" +
backtrace.keySet());
}
public void relax(Node origin, Node dest) {
double candidateWeight =
origin.weight + origin.distanceTo(dest);
if (candidateWeight < dest.weight) {
dest.weight = candidateWeight;
backtrace.put(dest, origin);
}
}
}
5
pltscheme.org
The Bug
class ShortestPathSolver {
public HashMap backtrace = new HashMap();
private PriorityQueue q = new PriorityQueue();
public ShortestPathSolver(DirectedGraph graph,
Node source) {
source.weight = 0.0;
q.addAll(graph.getNodes());
while(!q.isEmpty()) {
Node node = (Node)q.extractMin();
List successors = graph.getSuccsOf(node);
for(Iterator succIt = successors.iterator();
succIt.hasNext(); )
relax(node, (Node)succIt.next());
}
System.out.println("Result backtrace:\n" +
backtrace.keySet());
}
public void relax(Node origin, Node dest) {
double candidateWeight =
origin.weight + origin.distanceTo(dest);
if (candidateWeight < dest.weight) {
dest.weight = candidateWeight;
backtrace.put(dest, origin);
}
}
}
6
pltscheme.org
The Bug
class ShortestPathSolver {
public HashMap backtrace = new HashMap();
private PriorityQueue q = new PriorityQueue();
public ShortestPathSolver(DirectedGraph graph,
Node source) {
source.weight = 0.0;
q.addAll(graph.getNodes());
while(!q.isEmpty()) {
Node node = (Node)q.extractMin();
List successors = graph.getSuccsOf(node);
for(Iterator succIt = successors.iterator();
succIt.hasNext(); )
relax(node, (Node)succIt.next());
}
System.out.println("Result backtrace:\n" +
backtrace.keySet());
}
public void relax(Node origin, Node dest) {
double candidateWeight =
origin.weight + origin.distanceTo(dest);
if (candidateWeight < dest.weight) {
dest.weight = candidateWeight;
backtrace.put(dest, origin);
}
}
}
7
pltscheme.org
2 10 7 12 1 50
insert
time
8
pltscheme.org
2 10 7 12 1 50
insert
time
extractMin
2 7 10 1 50 12
9
pltscheme.org
2 10 7 12 1 50
insert
time
extractMin
2 7 10 1 50 12
10
pltscheme.org
2 10 7 12 1 50
insert
time
extractMin
2
11
pltscheme.org
2 10 7 12 1 50
insert
time
extractMin
2 7
12
pltscheme.org
2 10 7 12 1 50
insert
time
extractMin
2 7 10
13
pltscheme.org
2 10 7 12 1 50
insert
time
extractMin
2 7 10 1
14
pltscheme.org
2 10 7 12 1 50
insert
time
extractMin
2 7 10 1 50
15
pltscheme.org
2 10 7 12 1 50
insert
time
extractMin
2 7 10 1 50 12
16
pltscheme.org
2 10 7 12 1 50
insert
time
extractMin
2 7 10 1 50 12
> break extractMin
17
pltscheme.org
2 10 7 12 1 50
insert
time
extractMin
2 7 10 1 50 12
> break extractMin {
stop()
}
18
pltscheme.org
2 10 7 12 1 50
insert
time
extractMin
2 7 10 1 50 12
> break extractMin {
if (hasPrevious && previous > current)
stop()
else
hasPrevious = true
previous = current
resume()
}
19
pltscheme.org
2 10 7 12 1 50
insert
time
extractMin
2 7 10 1 50 12
> break extractMin {
if (hasPrevious && previous > current)
for each L in listeners
notify(L)
hasPrevious = true
previous = current
resume()
}
> add_listener extractMin {
stop()
}
20
pltscheme.org
2 10 7 12 1 50
insert
time
extractMin
2 7 10 1 50 12
> break extractMin {
if (hasPrevious && previous > current)
for each L in listeners
notify(L)
hasPrevious = true
previous = current
resume()
}
> add_listener extractMin {
stop()
}
21
pltscheme.org
2 10 7 12 1 50
insert
time
extractMin
2 7 10 1 50 12
> break extractMin {
if (hasPrevious && previous > current)
for each L in listeners
notify(L)
hasPrevious = true
previous = current
resume()
}
> add_listener extractMin {
stop()
}
22
pltscheme.org
2 10 7 12 1 50
insert
time
extractMin
2 7 10 1 50 12
> break extractMin {
if (hasPrevious && previous > current)
for each L in listeners
notify(L)
hasPrevious = true
previous = current
resume()
}
> add_listener extractMin {
stop()
}
23
pltscheme.org
2 10 7 12 1 50
insert
time
extractMin
2 7 10 1 50 12
> break extractMin {
if (hasPrevious && previous > current)
for each L in listeners
notify(L)
hasPrevious = true break extractMin {
previous = current count++
resume() print count
}
}
> add_listener extractMin {
stop()
}
24
pltscheme.org
Shortcomings of callbacks
25
pltscheme.org
Another point of view
2 10 7 12 1 50
insert
time
extractMin
2 7 10 1 50 12
26
pltscheme.org
1 50 12
(define extractions
(trace extractMin
(bind (node) (node . jdot . weight))))
27
pltscheme.org
1 50 12
(define extractions
(trace extractMin
(bind (node) (node . jdot . weight))))
(1, 50) (50, 12)
(define pairs (historye 2 extractions))
28
pltscheme.org
1 50 12
(define extractions
(trace extractMin
(bind (node) (node . jdot . weight))))
(1, 50) (50, 12)
(define pairs (historye 2 extractions))
(50, 12)
(define violations
(filtere
(matchlambda [(previous current)
(previous . > . current)])
pairs))
29
pltscheme.org
1 50 12
(define extractions
(trace extractMin
(bind (node) (node . jdot . weight))))
(1, 50) (50, 12)
(define pairs (historye 2 extractions))
(50, 12)
(define violations
(filtere
(matchlambda [(previous current)
(previous . > . current)])
pairs))
30
pltscheme.org
Architecture
Debugger
Target FrTime
Java VM
tcp/ip DrScheme
jdwp server jdwp client
31
pltscheme.org
1) FrTime : Define debugging operations
(define (nv violations)
(setrunning!
(hold true
(violations . => . false))))
32
pltscheme.org
1) FrTime : Define debugging operations
(define (nv violations)
(setrunning!
(hold true
(violations . => . false))))
(define (notinorder e)
(filtere
(matchlambda [(previous current)
(previous . > . current)])
e))
33
pltscheme.org
2) DrScheme : Interactive IDE
34
pltscheme.org
2) DrScheme : Interactive IDE
35
pltscheme.org
3) Scheme Libraries: Access to I/O and Graphics
36
pltscheme.org
3) Scheme Libraries: Access to I/O and Graphics
37
pltscheme.org
3) Scheme Libraries: Access to I/O and Graphics
(define treestart
(trace ((tsp . jdot . mst) . jloc . entry)
(bind () true)))
38
pltscheme.org
3) Scheme Libraries: Access to I/O and Graphics
(define treestart
(trace ((tsp . jdot . mst) . jloc . entry)
(bind () true)))
(define treenewedge
(trace ((tsp . jdot . mst) . jloc . 80)
(bind (e) e)))
39
pltscheme.org
3) Scheme Libraries: Access to I/O and Graphics
(define treestart
(trace ((tsp . jdot . mst) . jloc . entry)
(bind () true)))
(define treenewedge
(trace ((tsp . jdot . mst) . jloc . 80)
(bind (e) e))
(define tree
(eventloopb ([currenttree empty])
[treenewedge
=>
(lambda (e)
(cons (makeedge (e . jdot . v1)
(e . jdot . v2))
currenttree))]
[treestart empty]))
40
pltscheme.org
3) Scheme Libraries: Access to I/O and Graphics
(define treestart
(trace ((tsp . jdot . mst) . jloc . entry)
(bind () true)))
(define treenewedge
(trace ((tsp . jdot . mst) . jloc . 80)
(bind (e) e)))
(define tree
(eventloopb ([currenttree empty])
[treenewedge
=>
(lambda (e)
(cons (makeedge (e . jdot . v1)
(e . jdot . v2))
currenttree))]
[treestart empty]))
(displaylines tree)
41
pltscheme.org
Performance
Debugger
Target FrTime
Java VM
tcp/ip DrScheme
jdwp server jdwp client
Time per event
Total response time 2.217 msec
42
pltscheme.org
Related work
43
pltscheme.org
Future work
(define treestart
(trace ((tsp . jdot . mst) . jloc . entry)
(bind () true)))
(define treenewedge
(trace ((tsp . jdot . mst) . jloc . 80)
(bind (e) e)))
44
pltscheme.org
Future work
45
pltscheme.org
Future work
46
pltscheme.org
Future work
Replay debugging
47
pltscheme.org
In Summary
48
pltscheme.org
In Summary
49
pltscheme.org
In Summary
50
pltscheme.org
Software
http://www.cs.brown.edu/research/plt/software/mztake/
51
pltscheme.org