Why Programs Fail is about bugs in computer programs, how to find them, how to reproduce them, and how to fix them in such a way that they do not occur anymore. This is the first comprehensive book on systematic debugging and covers a wide range of tools and techniques ranging from hands-on observation to fully automated diagnoses, and includes instructions for building automated debuggers. This discussion is built upon a solid theory of how failures occur, rather than relying on seat-of-the-pants techniques, which are of little help with large software systems or to those learning to program. The author, Andreas Zeller, is well known in the programming community for creating the GNU Data Display Debugger (DDD), a tool that visualizes the data structures of a program while it is running.
Немного странная книга. Это учебник по курсу, который исследователь в области автоматизированной отладки читает своим студентам.
Автор рассказывает про bleeding edge в автоматизированной отладке на 2009 год. Но, судя по отладчикам, которыми сейчас приходится пользоваться, ничего особо не поменялось. В книге есть всякие интересные идеи и примеры:
* Автоматическая минимизация входных данных, которые приводят к багу. Или минимизация разницы между failing run и passing run (т.н. delta debugging). При этом в качестве входных данных могут рассматриваться совсем разные вещи: - собственно входные данные (например, HTML-документ, который приводит к падению печати в FireFox) - записанные действия пользователя (куда мышку двигал, на какие кнопки нажимал) - расписание context switch в многопоточном приложении (так можно выделить, по сути, порядок выполнения каких-то частей, который приводит к ошибке) * Нахождение всяких static и dynamic backward/forward slices. Это выделение частей программы, которые могут как-то влиять на данную строчку, либо наоборот, на которые может влиять данная строчка. Если есть возможность удобно выделять такие куски, то можно сильно сократить количество кода, на которое нужно смотреть, чтобы понять, что происходит в конкретной строке. * Omniscient debugging. Возможность записывать полностью всё выполнение программы и потом во время отладки ходить не по текущему стеку вверх-вниз, а ходить по времени. Вот это должно быть очень-очень круто. Но в open-source отладчиках пока, похоже, нет ничего юзабельного (такая возможность в GDB вроде как замедляет выполнение в 50000 раз). * Поиск аномалий при нескольких прогонах кода (например, строки, которые запускаются только в failing runs и никогда в passing runs и наоборот). * Извлечение и сравнение "состояний" программы (memory-graphs) и выделение цепочек cause-effect из них. * Выявление проблемных мест/компонент в коде (на основании багов/фиксов из трекера), чтобы этим местам можно было уделять особенное внимание при QA, например.
Со всеми этими крутыми штуками есть только одна проблема. Вообще непонятно, как это применять в реальной жизни. Вот прям взять какой-нибудь известный баг и применить к нему полученную информацию. Чтобы использовать приведённые подходы, подойдёт совсем не любой язык программирования. И нужно в эти подходы вкладываться с самого начала. И не факт, что они вообще на конкретном проекте заработают. Поэтому почитать про это любопытно, но практической ценности немного.
Книгу можно рекомендовать, если хочется почитать "как оно там бывает". Она немаленькая (388 страниц), местами сухая, поэтому иногда хочется, чтобы она уже поскорее закончилась.
The book presents a lot of cutting-edge research studies on automated debugging techniques. I think this is the main strength of the book. It also has good chapters that formalize the general intuition of debugging and introduce the theory of these processes. The only reason, why I gave 4 stars and not 5 is that sometimes I was expecting more real-life guidelines for debugging and was tired (at some points) of cutting-edge automated prototype tools.