39
Дебаггинг Software Testing 101 Марат Ахин Санкт-Петербургский государственный политехнический университет 2015 Марат Ахин (СПбГПУ) DBG 2015 315 / 349

Дебаггинг

Embed Size (px)

Citation preview

Page 1: Дебаггинг

ДебаггингSoftware Testing 101

Марат Ахин

Санкт-Петербургский государственный политехнический университет

2015

Марат Ахин (СПбГПУ) DBG 2015 315 / 349

Page 2: Дебаггинг

Quiz

Марат Ахин (СПбГПУ) DBG 2015 316 / 349

Page 3: Дебаггинг

Recap

Марат Ахин (СПбГПУ) DBG 2015 317 / 349

Page 4: Дебаггинг

Debugging

Содержание

1 DebuggingПоиск ошибокПроцесс отладкиTime-traveling debuggingDelta debugging

Марат Ахин (СПбГПУ) DBG 2015 318 / 349

Page 5: Дебаггинг

Debugging Поиск ошибок

Поиск ошибок

DebuggingПроцесс поиска ошибок в программе

Edsger DijkstraIf debugging is the process of removing bugs, then programming must be

the process of putting them in.

Марат Ахин (СПбГПУ) DBG 2015 319 / 349

Page 6: Дебаггинг

Debugging Поиск ошибок

Поиск ошибок

Как найти ошибку?Запустить тестТест выполнит фрагмент кода с ошибкойЭто вызовет порчу состояния программыРезультат работы программы будет некорректным

Марат Ахин (СПбГПУ) DBG 2015 320 / 349

Page 7: Дебаггинг

Debugging Поиск ошибок

Поиск ошибок

Как найти ошибку?Запустить тестТест выполнит фрагмент кода с ошибкойЭто вызовет порчу состояния программыРезультат работы программы будет некорректным

Марат Ахин (СПбГПУ) DBG 2015 320 / 349

Page 8: Дебаггинг

Debugging Поиск ошибок

Поиск ошибок

Как найти ошибку?Запустить тестТест выполнит фрагмент кода с ошибкойЭто вызовет порчу состояния программыРезультат работы программы будет некорректным

Марат Ахин (СПбГПУ) DBG 2015 320 / 349

Page 9: Дебаггинг

Debugging Поиск ошибок

Поиск ошибок

Как найти ошибку?Запустить тестТест выполнит фрагмент кода с ошибкойЭто вызовет порчу состояния программыРезультат работы программы будет некорректным

Марат Ахин (СПбГПУ) DBG 2015 320 / 349

Page 10: Дебаггинг

Debugging Поиск ошибок

Поиск ошибок

Как найти ошибку?Запустить тестТест выполнит фрагмент кода с ошибкойЭто вызовет порчу состояния программыРезультат работы программы будет некорректным

Марат Ахин (СПбГПУ) DBG 2015 320 / 349

Page 11: Дебаггинг

Debugging Поиск ошибок

Поиск ошибок

Если мы решили проблему наблюдаемости...Debugging не нужен

AssertionsЖурнал выполнения

Если наблюдаемости не хватает???

Марат Ахин (СПбГПУ) DBG 2015 321 / 349

Page 12: Дебаггинг

Debugging Поиск ошибок

Основная проблема

Основная проблемаНаблюдение за состоянием программы

Марат Ахин (СПбГПУ) DBG 2015 322 / 349

Page 13: Дебаггинг

Debugging Поиск ошибок

Debuggers

Debugger to the rescue!

Две основные задачи отладчикаПошаговое выполнение программыНаблюдение за внутренним состоянием программы

Как они это делают?

Марат Ахин (СПбГПУ) DBG 2015 323 / 349

Page 14: Дебаггинг

Debugging Поиск ошибок

Debuggers

Тесная интеграция со средой выполнения

Понимание того, что такое инструкцияВозможность останавливать выполнение в произвольныемоменты времениЗнание модели памятиСпособность модифицировать выполняемый код...

Марат Ахин (СПбГПУ) DBG 2015 324 / 349

Page 15: Дебаггинг

Debugging Процесс отладки

Процесс отладки

Дубль №11 Выдвигаем гипотезу о месте возникновения ошибки2 Настраиваем отладчик на анализ выбранного фрагмента кода3 Запускаем программу на выполнение4 Возможные варианты

1 Ошибка найдена ,2 Гипотеза не подтвердилась /

Если все же не нашли?

Марат Ахин (СПбГПУ) DBG 2015 325 / 349

Page 16: Дебаггинг

Debugging Процесс отладки

Процесс отладки

Дубль №21 Выдвигаем другую гипотезу о месте возникновения ошибки2 Настраиваем отладчик на анализ выбранного фрагмента кода3 Запускаем программу на выполнение4 Возможные варианты

1 Ошибка найдена ,2 Гипотеза не подтвердилась /

Если все равно не нашли?

Марат Ахин (СПбГПУ) DBG 2015 326 / 349

Page 17: Дебаггинг

Debugging Процесс отладки

Процесс отладки

Дубль №31 Выдвигаем еще одну гипотезу о месте возникновения ошибки2 Настраиваем отладчик на анализ выбранного фрагмента кода3 Запускаем программу на выполнение4 Возможные варианты

1 Ошибка найдена ,2 Гипотеза не подтвердилась /

А если...

Марат Ахин (СПбГПУ) DBG 2015 327 / 349

Page 18: Дебаггинг

Debugging Процесс отладки

Процесс отладки

Марат Ахин (СПбГПУ) DBG 2015 328 / 349

Page 19: Дебаггинг

Debugging Процесс отладки

Много ручного труда

Надо что-то с этим делать!

Марат Ахин (СПбГПУ) DBG 2015 329 / 349

Page 20: Дебаггинг

Debugging Time-traveling debugging

One step forward, two steps back...

Гипотезы обычно раскручиваются в обратном порядке

vs

Выполнение программы идет в прямом порядке

Марат Ахин (СПбГПУ) DBG 2015 330 / 349

Page 21: Дебаггинг

Debugging Time-traveling debugging

Step back

Марат Ахин (СПбГПУ) DBG 2015 331 / 349

Page 22: Дебаггинг

Debugging Time-traveling debugging

Time-traveling debugging

Отладка с возможностью выполнения программы в обратную сторону

Возможность детального исследования поведения программыНет необходимости перезапускать программу

Как это можно сделать?

Марат Ахин (СПбГПУ) DBG 2015 332 / 349

Page 23: Дебаггинг

Debugging Time-traveling debugging

Time-traveling debugging

Обратные функцииТрассировкаЗапись состояния памяти (memory snapshots)

Не все так просто...

Марат Ахин (СПбГПУ) DBG 2015 333 / 349

Page 24: Дебаггинг

Debugging Time-traveling debugging

Неявные входные данные

Дата/времяВнешнее состояние (БД, сериализованные данные, и т.д.)Работа с аппаратуройВзаимодействие с другими программами

Чем больше неявных данных мы хотим учитывать, тем сложнее этосделать эффективно

Марат Ахин (СПбГПУ) DBG 2015 334 / 349

Page 25: Дебаггинг

Debugging Time-traveling debugging

Time-traveling debugging

В самом плохом случае – полная запись всей трассы выполненияЗначение каждой переменной в каждый момент времени

Марат Ахин (СПбГПУ) DBG 2015 335 / 349

Page 26: Дебаггинг

Debugging Time-traveling debugging

Time-traveling virtual machine

Что еще можно сделать?

Все то же самое, но на уровне виртуальной машины

Запись взаимодействия ПО с аппаратуройВозможность отладки целого ансамбля программНикаких проблем с неявными входными данными

Марат Ахин (СПбГПУ) DBG 2015 336 / 349

Page 27: Дебаггинг

Debugging Time-traveling debugging

Time-traveling virtual machine

Memory snapshotsЗапись источников недетерминизма

Пользовательский вводСетевое взаимодействиеПрерывания

TTVM позволяют отладить ошибки даже в ОС

Марат Ахин (СПбГПУ) DBG 2015 337 / 349

Page 28: Дебаггинг

Debugging Time-traveling debugging

Time travel

Марат Ахин (СПбГПУ) DBG 2015 338 / 349

Page 29: Дебаггинг

Debugging Delta debugging

Дихотомия

Как поймать африканского льва?Разделить Африку на две части стенойЛев находится в одной из двух частейРазделить часть со львом на две новой стеной...PROFIT!

Марат Ахин (СПбГПУ) DBG 2015 339 / 349

Page 30: Дебаггинг

Debugging Delta debugging

Дихотомия в отладке

А можно ли то же самое сделать с тестом?

А можно ли это сделать автоматически?

Марат Ахин (СПбГПУ) DBG 2015 340 / 349

Page 31: Дебаггинг

Debugging Delta debugging

Delta debugging

Способ автоматической минимизации теста

Дано: T = {Ci} : P(T ) 7→ fail

Найти: DD = min{Cj} ⊂ T : P(DD) 7→ fail

Что такое Ci?Что такое min{Cj}?

Марат Ахин (СПбГПУ) DBG 2015 341 / 349

Page 32: Дебаггинг

Debugging Delta debugging

Delta debugging

Ci – это...Строка в файлеВызов методаТэг в XMLОдин байт данныхКоммит в VCS

Выбирается индивидуально в каждом конкретном случае

Марат Ахин (СПбГПУ) DBG 2015 342 / 349

Page 33: Дебаггинг

Debugging Delta debugging

Delta debugging

DD = min{Cj} : ∀C ∈ DD P(DD \ C ) 7→ pass

Удаление любого компонента из минимального теста приводит кисчезновению ошибкиЧем меньше тест, тем проще его анализировать

Марат Ахин (СПбГПУ) DBG 2015 343 / 349

Page 34: Дебаггинг

Debugging Delta debugging

Минимизация теста

Субоптимальный способДихотомия

1: function DD(CC)2: L = {CC1, . . . ,CC|CC |/2}3: R = {CC|CC |/2+1, . . . ,CC|CC |}4: if only P(L) 7→ fail then5: return DD(L)6: else if only P(R) 7→ fail then7: return DD(R)8: else9: return CC

10: end if11: end function

Марат Ахин (СПбГПУ) DBG 2015 344 / 349

Page 35: Дебаггинг

Debugging Delta debugging

Минимизация теста

«Оптимальный» способПолный перебор

1: function DD(CC)2: CC

′= CC \ {CCi}

3: if P(CC′) 7→ fail then

4: return DD(CC′)

5: else if P(CC′) 7→ pass then

6: return CCi ∪ DD(CC′)

7: end if8: end function

Марат Ахин (СПбГПУ) DBG 2015 345 / 349

Page 36: Дебаггинг

Debugging Delta debugging

Минимизация теста

Оптимальный способУмный перебор

1: function DD(CC, N)2: CC = CC 1 ∪ . . . ∪ CCN

3: for all CC i do4: if P(CC i ) 7→ fail then5: return DD(CC i )6: else if P(CC \ CC i ) 7→ fail then7: return DD(CC \ CC i )8: end if9: end for

10: return DD(CC , 2× N)11: end function

Марат Ахин (СПбГПУ) DBG 2015 346 / 349

Page 37: Дебаггинг

Debugging Delta debugging

Delta debugging на практике

Готовых средств для delta debugging над данными нет

Зависимость Ci от типа данныхРазные проекты могут накладывать дополнительные ограничения

git/hg bisect

Марат Ахин (СПбГПУ) DBG 2015 347 / 349

Page 38: Дебаггинг

W.I.L.T. What I Learned Today?

W.I.L.T.

Марат Ахин (СПбГПУ) DBG 2015 348 / 349

Page 39: Дебаггинг

Q&A

Q&A

Марат Ахин (СПбГПУ) DBG 2015 349 / 349