Systematic Debugging Techniques

This class is part of the PhD curriculum Advanced Development Techniques.


This class is aimed at researchers developing their own scientific software and intends to illustrate an approach to debugging in such a context that, on one hand, is guided by rational principles and systematic techniques rooted in theory, but, on the other hand, does not neglect concrete aspects and the use of practical tools of the trade.


The material is covered by these books (in decreasing order of relevance):

  1. Why Programs Fail: A Guide to Systematic Debugging, by Anderas Zeller

  2. The Developer’s Guide to Debugging, by Thorsten Grötker, Ulrich Holtmann, Holger Keding, and Markus Wloka,

  3. Test Driven Development: A Practical Guide, by Dave Astels,

  4. The Practice of Programming, by Brian W. Kernighan, and Rob Pike,

  5. Code Complete: A Practical Handbook of Software Construction, by Steve McConnell.

Outline of the lectures

The class is divided in four modules:

  • Introduction
    • What this class is not about

    • Automated debugging is impossible (Rice’s theorem)

    • Scientific method and debugging

    • Rerpoducibility [VAGRANT]

    • Keep track (version control) [HG]

  • Observing
  • Deducing and predicting
    • Code smells and static analysis [SPLINT], [FB]

    • Divide et impera: delta debugging [DD]

    • Static (contract) and dynamic assertions [DAIKON]

  • Experimenting
    • A testing taxonomy: unit testing [JUNIT], [NOSE]

    • The object and its double: dummy, fake, stub, and mock [LUDIBRIO] (dependency injection, monkey patching)

    • Coverage [EMMA], [CPY]

    • Mutation testing (fuzzing) [JAVALANCHE]

    • Test driven developement


Getting the credits for this class depends on having a bux-fix accepted in an open-source project of your choice.

Come talk to the teacher to define the detail.