Дебаггинг
TRANSCRIPT
ДебаггингSoftware Testing 101
Марат Ахин
Санкт-Петербургский государственный политехнический университет
2015
Марат Ахин (СПбГПУ) DBG 2015 315 / 349
Quiz
Марат Ахин (СПбГПУ) DBG 2015 316 / 349
Recap
Марат Ахин (СПбГПУ) DBG 2015 317 / 349
Debugging
Содержание
1 DebuggingПоиск ошибокПроцесс отладкиTime-traveling debuggingDelta debugging
Марат Ахин (СПбГПУ) DBG 2015 318 / 349
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
Debugging Поиск ошибок
Поиск ошибок
Как найти ошибку?Запустить тестТест выполнит фрагмент кода с ошибкойЭто вызовет порчу состояния программыРезультат работы программы будет некорректным
Марат Ахин (СПбГПУ) DBG 2015 320 / 349
Debugging Поиск ошибок
Поиск ошибок
Как найти ошибку?Запустить тестТест выполнит фрагмент кода с ошибкойЭто вызовет порчу состояния программыРезультат работы программы будет некорректным
Марат Ахин (СПбГПУ) DBG 2015 320 / 349
Debugging Поиск ошибок
Поиск ошибок
Как найти ошибку?Запустить тестТест выполнит фрагмент кода с ошибкойЭто вызовет порчу состояния программыРезультат работы программы будет некорректным
Марат Ахин (СПбГПУ) DBG 2015 320 / 349
Debugging Поиск ошибок
Поиск ошибок
Как найти ошибку?Запустить тестТест выполнит фрагмент кода с ошибкойЭто вызовет порчу состояния программыРезультат работы программы будет некорректным
Марат Ахин (СПбГПУ) DBG 2015 320 / 349
Debugging Поиск ошибок
Поиск ошибок
Как найти ошибку?Запустить тестТест выполнит фрагмент кода с ошибкойЭто вызовет порчу состояния программыРезультат работы программы будет некорректным
Марат Ахин (СПбГПУ) DBG 2015 320 / 349
Debugging Поиск ошибок
Поиск ошибок
Если мы решили проблему наблюдаемости...Debugging не нужен
AssertionsЖурнал выполнения
Если наблюдаемости не хватает???
Марат Ахин (СПбГПУ) DBG 2015 321 / 349
Debugging Поиск ошибок
Основная проблема
Основная проблемаНаблюдение за состоянием программы
Марат Ахин (СПбГПУ) DBG 2015 322 / 349
Debugging Поиск ошибок
Debuggers
Debugger to the rescue!
Две основные задачи отладчикаПошаговое выполнение программыНаблюдение за внутренним состоянием программы
Как они это делают?
Марат Ахин (СПбГПУ) DBG 2015 323 / 349
Debugging Поиск ошибок
Debuggers
Тесная интеграция со средой выполнения
Понимание того, что такое инструкцияВозможность останавливать выполнение в произвольныемоменты времениЗнание модели памятиСпособность модифицировать выполняемый код...
Марат Ахин (СПбГПУ) DBG 2015 324 / 349
Debugging Процесс отладки
Процесс отладки
Дубль №11 Выдвигаем гипотезу о месте возникновения ошибки2 Настраиваем отладчик на анализ выбранного фрагмента кода3 Запускаем программу на выполнение4 Возможные варианты
1 Ошибка найдена ,2 Гипотеза не подтвердилась /
Если все же не нашли?
Марат Ахин (СПбГПУ) DBG 2015 325 / 349
Debugging Процесс отладки
Процесс отладки
Дубль №21 Выдвигаем другую гипотезу о месте возникновения ошибки2 Настраиваем отладчик на анализ выбранного фрагмента кода3 Запускаем программу на выполнение4 Возможные варианты
1 Ошибка найдена ,2 Гипотеза не подтвердилась /
Если все равно не нашли?
Марат Ахин (СПбГПУ) DBG 2015 326 / 349
Debugging Процесс отладки
Процесс отладки
Дубль №31 Выдвигаем еще одну гипотезу о месте возникновения ошибки2 Настраиваем отладчик на анализ выбранного фрагмента кода3 Запускаем программу на выполнение4 Возможные варианты
1 Ошибка найдена ,2 Гипотеза не подтвердилась /
А если...
Марат Ахин (СПбГПУ) DBG 2015 327 / 349
Debugging Процесс отладки
Процесс отладки
Марат Ахин (СПбГПУ) DBG 2015 328 / 349
Debugging Процесс отладки
Много ручного труда
Надо что-то с этим делать!
Марат Ахин (СПбГПУ) DBG 2015 329 / 349
Debugging Time-traveling debugging
One step forward, two steps back...
Гипотезы обычно раскручиваются в обратном порядке
vs
Выполнение программы идет в прямом порядке
Марат Ахин (СПбГПУ) DBG 2015 330 / 349
Debugging Time-traveling debugging
Step back
Марат Ахин (СПбГПУ) DBG 2015 331 / 349
Debugging Time-traveling debugging
Time-traveling debugging
Отладка с возможностью выполнения программы в обратную сторону
Возможность детального исследования поведения программыНет необходимости перезапускать программу
Как это можно сделать?
Марат Ахин (СПбГПУ) DBG 2015 332 / 349
Debugging Time-traveling debugging
Time-traveling debugging
Обратные функцииТрассировкаЗапись состояния памяти (memory snapshots)
Не все так просто...
Марат Ахин (СПбГПУ) DBG 2015 333 / 349
Debugging Time-traveling debugging
Неявные входные данные
Дата/времяВнешнее состояние (БД, сериализованные данные, и т.д.)Работа с аппаратуройВзаимодействие с другими программами
Чем больше неявных данных мы хотим учитывать, тем сложнее этосделать эффективно
Марат Ахин (СПбГПУ) DBG 2015 334 / 349
Debugging Time-traveling debugging
Time-traveling debugging
В самом плохом случае – полная запись всей трассы выполненияЗначение каждой переменной в каждый момент времени
Марат Ахин (СПбГПУ) DBG 2015 335 / 349
Debugging Time-traveling debugging
Time-traveling virtual machine
Что еще можно сделать?
Все то же самое, но на уровне виртуальной машины
Запись взаимодействия ПО с аппаратуройВозможность отладки целого ансамбля программНикаких проблем с неявными входными данными
Марат Ахин (СПбГПУ) DBG 2015 336 / 349
Debugging Time-traveling debugging
Time-traveling virtual machine
Memory snapshotsЗапись источников недетерминизма
Пользовательский вводСетевое взаимодействиеПрерывания
TTVM позволяют отладить ошибки даже в ОС
Марат Ахин (СПбГПУ) DBG 2015 337 / 349
Debugging Time-traveling debugging
Time travel
Марат Ахин (СПбГПУ) DBG 2015 338 / 349
Debugging Delta debugging
Дихотомия
Как поймать африканского льва?Разделить Африку на две части стенойЛев находится в одной из двух частейРазделить часть со львом на две новой стеной...PROFIT!
Марат Ахин (СПбГПУ) DBG 2015 339 / 349
Debugging Delta debugging
Дихотомия в отладке
А можно ли то же самое сделать с тестом?
А можно ли это сделать автоматически?
Марат Ахин (СПбГПУ) DBG 2015 340 / 349
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
Debugging Delta debugging
Delta debugging
Ci – это...Строка в файлеВызов методаТэг в XMLОдин байт данныхКоммит в VCS
Выбирается индивидуально в каждом конкретном случае
Марат Ахин (СПбГПУ) DBG 2015 342 / 349
Debugging Delta debugging
Delta debugging
DD = min{Cj} : ∀C ∈ DD P(DD \ C ) 7→ pass
Удаление любого компонента из минимального теста приводит кисчезновению ошибкиЧем меньше тест, тем проще его анализировать
Марат Ахин (СПбГПУ) DBG 2015 343 / 349
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
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
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
Debugging Delta debugging
Delta debugging на практике
Готовых средств для delta debugging над данными нет
Зависимость Ci от типа данныхРазные проекты могут накладывать дополнительные ограничения
git/hg bisect
Марат Ахин (СПбГПУ) DBG 2015 347 / 349
W.I.L.T. What I Learned Today?
W.I.L.T.
Марат Ахин (СПбГПУ) DBG 2015 348 / 349
Q&A
Q&A
Марат Ахин (СПбГПУ) DBG 2015 349 / 349