SObj = new p() myObj = SObj Thread 1 Thread 2 o = Q.dq o->use() Thread 3 Q.nq(myObj) Initially, Ready is false, SObj is an invalid pointer Intended Invariant: If Ready is true, SObj is a valid pointer Monday, May 28, 2012
SObj = new p() myObj = SObj Thread 1 Thread 2 o = Q.dq o->use() Thread 3 Q.nq(myObj) Initially, Ready is false, SObj is an invalid pointer Buggy Behavior: Ready can be true when SObj is invalid Monday, May 28, 2012
SObj = new p() myObj = SObj Thread 1 Thread 2 o = Q.dq o->use() Thread 3 Q.nq(myObj) Several days later... Initially, Ready is false, SObj is an invalid pointer Buggy Behavior: Ready can be true when SObj is invalid Monday, May 28, 2012
SObj = new p() myObj = SObj Thread 1 Thread 2 o = Q.dq o->use() Thread 3 Q.nq(myObj) Several days later... Symptom of bug is much later than cause and in different thread! ! Monday, May 28, 2012
Ready == true SObj = new p() myObj = SObj Thread 1 Thread 2 o = Q.dq o->use() Thread 3 Q.nq(myObj) Several days later... Bug-exposing test tools report buggy execution schedules Too much information! Monday, May 28, 2012
Ready == true SObj = new p() myObj = SObj Thread 1 Thread 2 o = Q.dq o->use() Thread 3 Q.nq(myObj) Bug isolation tools guide programmers to a code point or two Too little information! Monday, May 28, 2012
Ready == true SObj = new p() myObj = SObj Thread 1 Thread 2 o = Q.dq o->use() Thread 3 Q.nq(myObj) Bug isolation tools guide programmers to a code point or two Several days later... Too little information! Monday, May 28, 2012
new p() myObj = SObj Thread 1 Thread 2 o = Q.dq o->use() Thread 3 Q.nq(myObj) Programmers need focused information about bugs’ causes. Monday, May 28, 2012
new p() myObj = SObj Thread 1 Thread 2 o = Q.dq o->use() Thread 3 Q.nq(myObj) Several days later... Programmers need focused information about bugs’ causes. Monday, May 28, 2012
SObj = new p() myObj = SObj communication Reconstruction A reconstructions is a focused subset of the execution schedule around the root cause of a bug Monday, May 28, 2012
non Build and aggregate reconstructions : Crashes when I run it! Collect communication graphs from many executions Rank reconstructions and report 1 2 3 Monday, May 28, 2012
SObj = new p() myObj = SObj Thread 1 Thread 2 Nodes are static instructions Edges are inter-thread communication via shared memory Monday, May 28, 2012
Ready == true SObj = new p() myObj = SObj Rem Wr Rem Wr Loc Rd Loc Wr Rem Rd Rem Rd Communication context is a short history of recent communication events Nodes are instances of instructions within their context Monday, May 28, 2012
== true SObj = new p() myObj = SObj Rem Wr Rem Wr Loc Rd Loc Wr Rem Rd Rem Rd Timestamps encode ordering of non-communicating nodes T=5 T=7 T=15 T=16 Monday, May 28, 2012
Behavior differs across runs. Same edge, different reconstructions. Idea: Focus on common behavior by combining multiple executions = Monday, May 28, 2012
graphs as buggy or non-buggy buggy non Build and aggregate reconstructions : Rank reconstructions and report 1 Crashes when I run it! 2 3 Monday, May 28, 2012
graphs as buggy or non-buggy buggy non Build and aggregate reconstructions : Rank reconstructions and report 1 Crashes when I run it! 2 3 Monday, May 28, 2012
= new p() myObj = SObj Recon reconstructs execution fragments to help programmers understand their bugs BUG! Recon uses statistical inference to identify reconstructions useful to understanding bugs Monday, May 28, 2012