Applications of static analysis and program structure in statistical debugging

  • Authors:
  • Benjamin R. Liblit;Piramanayagam Arumuga Nainar

  • Affiliations:
  • The University of Wisconsin - Madison;The University of Wisconsin - Madison

  • Venue:
  • Applications of static analysis and program structure in statistical debugging
  • Year:
  • 2012

Quantified Score

Hi-index 0.00

Visualization

Abstract

The Cooperative Bug Isolation (CBI) project uses post-deployment monitoring and statistical analyses to find program behaviors, called predicates, that are correlated with failures. Prior works use dynamic analysis, focusing solely on a program's runtime behavior. This dissertation demonstrates that static analyses, which discover program properties without running them, can improve statistical debugging.CBI's predicates test program state at particular locations. Predicates are useful if their true observations are correlated with failure. However, complex bugs usually manifest when multiple factors co-occur. We propose that propositional combinations of simple predicates could be better predictors of complex bugs. Such compound predicates are the best predictors of failure in 93% of our experiments. We use upper bounds on failure predictivity and program dependences to reduce average analysis time from 20 minutes to 1 minute. Statistical debugging searches for needles in a haystack: 99.996% of predicates are not failure predictive. We develop a technique that uses program dependences and prior feedback to ignore irrelevant predicates and selectively monitor those predicates that are likely to be useful. Irrelevant predicates are never instrumented, or are removed after their relevance is ascertained. Our approach produces the same results as complete instrumentation after instrumenting just 40% of the program locations. Very few locations are instrumented at any time, yielding imperceptibly low overheads.While debugging, a developer uses CBI's output to identify root causes of failures. We aid this task by augmenting CBI's output with source-level changes that are likely causes of failures. We compute conditional coverage profiles that capture the likelihood that a source-level change impacts a predicate. Our technique uses symbolic evaluation, control-flow graphs, and runtime profiles to narrow the scope of impacted sets by an order of magnitude compared to prior work. It identifies failure-inducing changes with a precision of 89% and a recall of 55%.Our contributions, while seemingly orthogonal, are unified by their use of static analysis to connect dynamic behavior. Static program structure is used to prune useless compound predicates, adaptively instrument likely bug predictors, and associate predicates with failure-inducing changes. Overall, this dissertation improves the monitoring efficiency and fault localization of CBI.