DynaMine: Finding Common Error Patterns by Mining Software Revision Histories

Thomas Zimmermann
Thomas ZimmermannResearcher at Microsoft Research
DynaMine
   Finding Common Error Patterns by
   Mining Software Revision Histories




 Benjamin Livshits    Thomas Zimmermann
Stanford University    Saarland University
Error Pattern Iceberg
                                    null dereferences,
                                    buffer overruns, ...
The usual suspects


                                     J2EE servlets
  Application
   specific



           Device drivers   Linux code
Co-changed items = patterns
Co-added Method Calls

public void createPartControl(Composite parent) {
    ...
    // add listener for editor page activation
    getSite().getPage().addPartListener(partListener);
}

public void dispose() {
    ...
    getSite().getPage().removePartListener(partListener);
}
Co-added Method Calls

public void createPartControl(Composite parent) {
    ...
    // add listener for editor page activation
    getSite().getPage().addPartListener(partListener);
}

public void dispose() {
    ...
    getSite().getPage().removePartListener(partListener);
}
Co-added Method Calls

public void createPartControl(Composite parent) {
    ...
    // add listener for editor page activation
    getSite().getPage().addPartListener(partListener);
}

                                co-added
public void dispose() {
    ...
    getSite().getPage().removePartListener(partListener);
}
How DynaMine Works
                  mine CVS                        rank and
    revision
                                  patterns
history mining    histories                         filter

                                              instrument relevant
                                                  method calls

                                              run the application
           dynamic
           analysis
                                                post-process


                                    usage           error           unlikely
                                   patterns        patterns         patterns


                                   report           report
                      reporting
                                  patterns           bugs
Mining Patterns
                  mine CVS                        rank and
    revision
                                  patterns
history mining    histories                         filter

                                              instrument relevant
                                                  method calls

                                              run the application
           dynamic
           analysis
                                                post-process


                                    usage           error           unlikely
                                   patterns        patterns         patterns


                                   report           report
                      reporting
                                  patterns           bugs
Mining Method Calls
           o1.addListener()
Foo.java
    1.12
           o1.removeListener()
Bar.java   o2.addListener()
    1.47
           o2.removeListener()
           System.out.println()
Baz.java   o3.addListener()
    1.23
           o3.removeListener()
           list.iterator()
           iter.hasNext()
           iter.next()
           o4.addListener()
Qux.java
    1.41
           System.out.println()

           o4.removeListener()
    1.42
Finding Pairs
                                  1 Pair
           o1.addListener()
Foo.java
    1.12
           o1.removeListener()
Bar.java   o2.addListener()
                                  1 Pair
    1.47
           o2.removeListener()
           System.out.println()
Baz.java   o3.addListener()
    1.23
           o3.removeListener()
                                  2 Pairs
           list.iterator()
           iter.hasNext()
           iter.next()

                                  0 Pairs
           o4.addListener()
Qux.java
    1.41
           System.out.println()

                                  0 Pairs
           o4.removeListener()
    1.42
Finding Patterns
Find “frequent itemsets” (with Apriori)
              o.enterAlignment()
             o.enterAlignment()
            o.enterAlignment()
           o.enterAlignment()
              o.exitAlignment()
             o.exitAlignment()
            o.exitAlignment()
           o.exitAlignment()
              o.redoAlignment()
             o.redoAlignment()
            o.redoAlignment()
           o.redoAlignment()
              iter.hasNext()
             iter.hasNext()
            iter.hasNext()
           iter.hasNext()
              iter.next()
             iter.next()
            iter.next()
           iter.next()




 {enterAlignment(), exitAlignment(),
          redoAlignment()}
Ranking Patterns
           o1.addListener()
Foo.java
    1.12
           o1.removeListener()
Bar.java   o2.addListener()
    1.47
           o2.removeListener()
                                  Support count =
           System.out.println()
                                  #occurrences of a pattern
Baz.java   o3.addListener()
    1.23
           o3.removeListener()
                                  Confidence =
           list.iterator()
                                  strength of a pattern, P(A|B)
           iter.hasNext()
           iter.next()
           o4.addListener()
Qux.java
    1.41
           System.out.println()

           o4.removeListener()
    1.42
Ranking Patterns
           o1.addListener()
Foo.java
    1.12
           o1.removeListener()
Bar.java   o2.addListener()
    1.47
           o2.removeListener()
           System.out.println()
Baz.java   o3.addListener()
    1.23
           o3.removeListener()
           list.iterator()
           iter.hasNext()
           iter.next()
                                  This is a fix!
           o4.addListener()
Qux.java
    1.41
           System.out.println()   Rank removeListener()
                                  patterns higher
           o4.removeListener()
    1.42
Investigated Projects

                JEDIT     ECLIPSE
    since        2000       2001
 developers       92         112
lines of code   700,000   2,900,000
  revisions     40,000    400,000
Simple Method Pairs
         GUIs & Listener

                                            Usage pattern

               o.addWidget()    o.removeWidget()




o.addPropertyChangeListener()   o.removePropertyChangeListener()

                                             Error pattern
Simple Method Pairs
Locking of Resources




    o.HLock()      o.HUnlock()



                       Not hit at runtime
State Machines in Eclipse
  Pretty-printing                   Usage pattern

                o.redoAlignment()




    o.enterAlignment()     o.exitAlignment()
State Machines in Eclipse
      Memory context manupilation
                                    Not hit at runtime

                  OS.PmMemFlush()
OS.PmMemStart()                         OS.PmMemStop()




OS.PmMemCreateMC()            OS.PmMemReleaseMC()
State Machines in JEdit
      Compound edits (for undo/redo)
                                       Usage pattern



                        o.insert()



                        o.remove()
o.beginCompoundEdit()                o.endCompoundEdit()
Complex Patterns
try {
     monitor.beginTask(null, Policy.totalWork);
     int depth = -1;
     try {
        workspace.prepareOperation(null, monitor);
        workspace.beginOperation(true);
        depth = workspace.getWorkManager().beginUnprotected();
!       return runInWorkspace
                  (Policy.subMonitorFor(monitor, Policy.opWork,
                  SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK));
     } catch (OperationCanceledException e) {
        workspace.getWorkManager().operationCanceled();
        return Status.CANCEL_STATUS;
     } finally {
        if (depth >= 0)
            workspace.getWorkManager().endUnprotected(depth);
            workspace.endOperation(null, false,
                      Policy.subMonitorFor(monitor, Policy.endOpWork));
     }
  } catch (CoreException e) {
     return e.getStatus();
  } finally {
     monitor.done();
  }
Complex Patterns
try {
     monitor.beginTask(null, Policy.totalWork);
     int depth = -1;
     try {
        workspace.prepareOperation(null, monitor);
        workspace.beginOperation(true);
        depth = workspace.getWorkManager().beginUnprotected();
!       return runInWorkspace
                  (Policy.subMonitorFor(monitor, Policy.opWork,
                  SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK));
     } catch (OperationCanceledException e) {
        workspace.getWorkManager().operationCanceled();
        return Status.CANCEL_STATUS;
     } finally {
        if (depth >= 0)
            workspace.getWorkManager().endUnprotected(depth);
            workspace.endOperation(null, false,
                      Policy.subMonitorFor(monitor, Policy.endOpWork));
     }
  } catch (CoreException e) {
     return e.getStatus();
  } finally {
     monitor.done();
  }
Complex Patterns
try {
     monitor.beginTask(null, Policy.totalWork);
     int depth = -1;
     try {
        workspace.prepareOperation(null, monitor);
        workspace.beginOperation(true);
        depth = workspace.getWorkManager().beginUnprotected();
!       return runInWorkspace
                  (Policy.subMonitorFor(monitor, Policy.opWork,
                  SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK));
     } catch (OperationCanceledException e) {
        workspace.getWorkManager().operationCanceled();
        return Status.CANCEL_STATUS;
     } finally {
        if (depth >= 0)
            workspace.getWorkManager().endUnprotected(depth);
            workspace.endOperation(null, false,
                      Policy.subMonitorFor(monitor, Policy.endOpWork));
     }
  } catch (CoreException e) {
     return e.getStatus();
  } finally {
     monitor.done();
  }
Workspace Transactions
                                   Usage pattern

S →  O*

O →  w.prepareOperation()
      w.beginOperation()
      U*
      w.endOperation()

U →  w.getWorkManager().beginUnprotected()
      S
      [w.getWorkManager().operationCanceled()]
      w.getWorkManager().beginUnprotected()
Dynamic Validation
                  mine CVS                        rank and
    revision
                                  patterns
history mining    histories                         filter

                                              instrument relevant
                                                  method calls

                                              run the application
           dynamic
           analysis
                                                post-process


                                    usage           error           unlikely
                                   patterns        patterns         patterns


                                   report           report
                      reporting
                                  patterns           bugs
Pattern classification

               post-process
           v validations, e violations



 usage              error                unlikely
patterns           patterns              patterns
ev/10           v/10=e=2v         otherwise
Experiments

                usage pattern
                     15
not hit
  24


                     error pattern
                           8
          unlikely
             11

                           total 56 patterns
Future Work

Automatically generate state machines
Additional patterns by textual matching
Programmer assist tools
Programmers who inserted a call to open()
inserted a call to close()

Aspect Mining
Contibutions

DynaMine learns usage patterns from
large version archives.
DynaMine ranks patterns effectively,
especially for finding error patterns.
DynaMine increases trust in patterns by
dynamic analysis
1 of 28

More Related Content

What's hot(20)

The definitive guide to java agentsThe definitive guide to java agents
The definitive guide to java agents
Rafael Winterhalter399 views
Js 单元测试框架介绍Js 单元测试框架介绍
Js 单元测试框架介绍
louieuser1.1K views
2012 JDays Bad Tests Good Tests2012 JDays Bad Tests Good Tests
2012 JDays Bad Tests Good Tests
Tomek Kaczanowski802 views
Java Concurrency by ExampleJava Concurrency by Example
Java Concurrency by Example
Ganesh Samarthyam1.1K views
Sam wd programsSam wd programs
Sam wd programs
Soumya Behera1K views
Java byte code in practiceJava byte code in practice
Java byte code in practice
Rafael Winterhalter9.4K views
Java serializationJava serialization
Java serialization
Ecommerce Solution Provider SysIQ1.1K views
eROSE: Guiding programmers in EclipseeROSE: Guiding programmers in Eclipse
eROSE: Guiding programmers in Eclipse
Thomas Zimmermann835 views

Similar to DynaMine: Finding Common Error Patterns by Mining Software Revision Histories

OSGi and Eclipse RCPOSGi and Eclipse RCP
OSGi and Eclipse RCPEric Jain
1.2K views42 slides

Similar to DynaMine: Finding Common Error Patterns by Mining Software Revision Histories(20)

Lambda Functions in Java 8Lambda Functions in Java 8
Lambda Functions in Java 8
Ganesh Samarthyam1.4K views
New Functional Features of Java 8New Functional Features of Java 8
New Functional Features of Java 8
franciscoortin2.7K views
OSGi and Eclipse RCPOSGi and Eclipse RCP
OSGi and Eclipse RCP
Eric Jain1.2K views
Java Quiz - MeetupJava Quiz - Meetup
Java Quiz - Meetup
CodeOps Technologies LLP204 views
JavaOne 2012 - JVM JIT for DummiesJavaOne 2012 - JVM JIT for Dummies
JavaOne 2012 - JVM JIT for Dummies
Charles Nutter11K views
Java 8 lambda expressionsJava 8 lambda expressions
Java 8 lambda expressions
Logan Chien2.6K views
Event driven javascriptEvent driven javascript
Event driven javascript
Francesca1980438 views
Event driven javascriptEvent driven javascript
Event driven javascript
Francesca1980494 views
Java设置环境变量Java设置环境变量
Java设置环境变量
Zianed Hou1.9K views
E:\Plp 2009 2\Plp 9E:\Plp 2009 2\Plp 9
E:\Plp 2009 2\Plp 9
Ismar Silveira487 views
JavaZone 2014 - goto java;JavaZone 2014 - goto java;
JavaZone 2014 - goto java;
Martin (高馬丁) Skarsaune991 views
Java Language fundamentalJava Language fundamental
Java Language fundamental
Infoviaan Technologies115 views
Rx workshopRx workshop
Rx workshop
Ryan Riley2.4K views
Java Profiling ToolsJava Profiling Tools
Java Profiling Tools
SEA Tecnologia2K views

More from Thomas Zimmermann(20)

MSR 2013 PreviewMSR 2013 Preview
MSR 2013 Preview
Thomas Zimmermann21.8K views
Analytics for smarter software development Analytics for smarter software development
Analytics for smarter software development
Thomas Zimmermann2.6K views
Klingon Countdown TimerKlingon Countdown Timer
Klingon Countdown Timer
Thomas Zimmermann1.3K views
Data driven games user researchData driven games user research
Data driven games user research
Thomas Zimmermann1.5K views
Analytics for software developmentAnalytics for software development
Analytics for software development
Thomas Zimmermann4.6K views
Cross-project defect predictionCross-project defect prediction
Cross-project defect prediction
Thomas Zimmermann1.9K views
Meet Tom and his FishMeet Tom and his Fish
Meet Tom and his Fish
Thomas Zimmermann1.5K views
Got Myth? Myths in Software EngineeringGot Myth? Myths in Software Engineering
Got Myth? Myths in Software Engineering
Thomas Zimmermann5.9K views
Mining Workspace Updates in CVSMining Workspace Updates in CVS
Mining Workspace Updates in CVS
Thomas Zimmermann632 views
Unit testing with JUnitUnit testing with JUnit
Unit testing with JUnit
Thomas Zimmermann16.1K views
esolang: Esoterische Programmiersprachenesolang: Esoterische Programmiersprachen
esolang: Esoterische Programmiersprachen
Thomas Zimmermann1.5K views

Recently uploaded(20)

Web Dev - 1 PPT.pdfWeb Dev - 1 PPT.pdf
Web Dev - 1 PPT.pdf
gdsczhcet48 views
The Research Portal of Catalonia: Growing more (information) & more (services)The Research Portal of Catalonia: Growing more (information) & more (services)
The Research Portal of Catalonia: Growing more (information) & more (services)
CSUC - Consorci de Serveis Universitaris de Catalunya51 views
ChatGPT and AI for Web DevelopersChatGPT and AI for Web Developers
ChatGPT and AI for Web Developers
Maximiliano Firtman152 views
ThroughputThroughput
Throughput
Moisés Armani Ramírez28 views
Liqid: Composable CXL PreviewLiqid: Composable CXL Preview
Liqid: Composable CXL Preview
CXL Forum118 views
METHOD AND SYSTEM FOR PREDICTING OPTIMAL LOAD FOR WHICH THE YIELD IS MAXIMUM ...METHOD AND SYSTEM FOR PREDICTING OPTIMAL LOAD FOR WHICH THE YIELD IS MAXIMUM ...
METHOD AND SYSTEM FOR PREDICTING OPTIMAL LOAD FOR WHICH THE YIELD IS MAXIMUM ...
Prity Khastgir IPR Strategic India Patent Attorney Amplify Innovation23 views

DynaMine: Finding Common Error Patterns by Mining Software Revision Histories

  • 1. DynaMine Finding Common Error Patterns by Mining Software Revision Histories Benjamin Livshits Thomas Zimmermann Stanford University Saarland University
  • 2. Error Pattern Iceberg null dereferences, buffer overruns, ... The usual suspects J2EE servlets Application specific Device drivers Linux code
  • 4. Co-added Method Calls public void createPartControl(Composite parent) { ... // add listener for editor page activation getSite().getPage().addPartListener(partListener); } public void dispose() { ... getSite().getPage().removePartListener(partListener); }
  • 5. Co-added Method Calls public void createPartControl(Composite parent) { ... // add listener for editor page activation getSite().getPage().addPartListener(partListener); } public void dispose() { ... getSite().getPage().removePartListener(partListener); }
  • 6. Co-added Method Calls public void createPartControl(Composite parent) { ... // add listener for editor page activation getSite().getPage().addPartListener(partListener); } co-added public void dispose() { ... getSite().getPage().removePartListener(partListener); }
  • 7. How DynaMine Works mine CVS rank and revision patterns history mining histories filter instrument relevant method calls run the application dynamic analysis post-process usage error unlikely patterns patterns patterns report report reporting patterns bugs
  • 8. Mining Patterns mine CVS rank and revision patterns history mining histories filter instrument relevant method calls run the application dynamic analysis post-process usage error unlikely patterns patterns patterns report report reporting patterns bugs
  • 9. Mining Method Calls o1.addListener() Foo.java 1.12 o1.removeListener() Bar.java o2.addListener() 1.47 o2.removeListener() System.out.println() Baz.java o3.addListener() 1.23 o3.removeListener() list.iterator() iter.hasNext() iter.next() o4.addListener() Qux.java 1.41 System.out.println() o4.removeListener() 1.42
  • 10. Finding Pairs 1 Pair o1.addListener() Foo.java 1.12 o1.removeListener() Bar.java o2.addListener() 1 Pair 1.47 o2.removeListener() System.out.println() Baz.java o3.addListener() 1.23 o3.removeListener() 2 Pairs list.iterator() iter.hasNext() iter.next() 0 Pairs o4.addListener() Qux.java 1.41 System.out.println() 0 Pairs o4.removeListener() 1.42
  • 11. Finding Patterns Find “frequent itemsets” (with Apriori) o.enterAlignment() o.enterAlignment() o.enterAlignment() o.enterAlignment() o.exitAlignment() o.exitAlignment() o.exitAlignment() o.exitAlignment() o.redoAlignment() o.redoAlignment() o.redoAlignment() o.redoAlignment() iter.hasNext() iter.hasNext() iter.hasNext() iter.hasNext() iter.next() iter.next() iter.next() iter.next() {enterAlignment(), exitAlignment(), redoAlignment()}
  • 12. Ranking Patterns o1.addListener() Foo.java 1.12 o1.removeListener() Bar.java o2.addListener() 1.47 o2.removeListener() Support count = System.out.println() #occurrences of a pattern Baz.java o3.addListener() 1.23 o3.removeListener() Confidence = list.iterator() strength of a pattern, P(A|B) iter.hasNext() iter.next() o4.addListener() Qux.java 1.41 System.out.println() o4.removeListener() 1.42
  • 13. Ranking Patterns o1.addListener() Foo.java 1.12 o1.removeListener() Bar.java o2.addListener() 1.47 o2.removeListener() System.out.println() Baz.java o3.addListener() 1.23 o3.removeListener() list.iterator() iter.hasNext() iter.next() This is a fix! o4.addListener() Qux.java 1.41 System.out.println() Rank removeListener() patterns higher o4.removeListener() 1.42
  • 14. Investigated Projects JEDIT ECLIPSE since 2000 2001 developers 92 112 lines of code 700,000 2,900,000 revisions 40,000 400,000
  • 15. Simple Method Pairs GUIs & Listener Usage pattern o.addWidget() o.removeWidget() o.addPropertyChangeListener() o.removePropertyChangeListener() Error pattern
  • 16. Simple Method Pairs Locking of Resources o.HLock() o.HUnlock() Not hit at runtime
  • 17. State Machines in Eclipse Pretty-printing Usage pattern o.redoAlignment() o.enterAlignment() o.exitAlignment()
  • 18. State Machines in Eclipse Memory context manupilation Not hit at runtime OS.PmMemFlush() OS.PmMemStart() OS.PmMemStop() OS.PmMemCreateMC() OS.PmMemReleaseMC()
  • 19. State Machines in JEdit Compound edits (for undo/redo) Usage pattern o.insert() o.remove() o.beginCompoundEdit() o.endCompoundEdit()
  • 20. Complex Patterns try { monitor.beginTask(null, Policy.totalWork); int depth = -1; try { workspace.prepareOperation(null, monitor); workspace.beginOperation(true); depth = workspace.getWorkManager().beginUnprotected(); ! return runInWorkspace (Policy.subMonitorFor(monitor, Policy.opWork, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK)); } catch (OperationCanceledException e) { workspace.getWorkManager().operationCanceled(); return Status.CANCEL_STATUS; } finally { if (depth >= 0) workspace.getWorkManager().endUnprotected(depth); workspace.endOperation(null, false, Policy.subMonitorFor(monitor, Policy.endOpWork)); } } catch (CoreException e) { return e.getStatus(); } finally { monitor.done(); }
  • 21. Complex Patterns try { monitor.beginTask(null, Policy.totalWork); int depth = -1; try { workspace.prepareOperation(null, monitor); workspace.beginOperation(true); depth = workspace.getWorkManager().beginUnprotected(); ! return runInWorkspace (Policy.subMonitorFor(monitor, Policy.opWork, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK)); } catch (OperationCanceledException e) { workspace.getWorkManager().operationCanceled(); return Status.CANCEL_STATUS; } finally { if (depth >= 0) workspace.getWorkManager().endUnprotected(depth); workspace.endOperation(null, false, Policy.subMonitorFor(monitor, Policy.endOpWork)); } } catch (CoreException e) { return e.getStatus(); } finally { monitor.done(); }
  • 22. Complex Patterns try { monitor.beginTask(null, Policy.totalWork); int depth = -1; try { workspace.prepareOperation(null, monitor); workspace.beginOperation(true); depth = workspace.getWorkManager().beginUnprotected(); ! return runInWorkspace (Policy.subMonitorFor(monitor, Policy.opWork, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK)); } catch (OperationCanceledException e) { workspace.getWorkManager().operationCanceled(); return Status.CANCEL_STATUS; } finally { if (depth >= 0) workspace.getWorkManager().endUnprotected(depth); workspace.endOperation(null, false, Policy.subMonitorFor(monitor, Policy.endOpWork)); } } catch (CoreException e) { return e.getStatus(); } finally { monitor.done(); }
  • 23. Workspace Transactions Usage pattern S → O* O → w.prepareOperation() w.beginOperation() U* w.endOperation() U → w.getWorkManager().beginUnprotected() S [w.getWorkManager().operationCanceled()] w.getWorkManager().beginUnprotected()
  • 24. Dynamic Validation mine CVS rank and revision patterns history mining histories filter instrument relevant method calls run the application dynamic analysis post-process usage error unlikely patterns patterns patterns report report reporting patterns bugs
  • 25. Pattern classification post-process v validations, e violations usage error unlikely patterns patterns patterns ev/10 v/10=e=2v otherwise
  • 26. Experiments usage pattern 15 not hit 24 error pattern 8 unlikely 11 total 56 patterns
  • 27. Future Work Automatically generate state machines Additional patterns by textual matching Programmer assist tools Programmers who inserted a call to open() inserted a call to close() Aspect Mining
  • 28. Contibutions DynaMine learns usage patterns from large version archives. DynaMine ranks patterns effectively, especially for finding error patterns. DynaMine increases trust in patterns by dynamic analysis