Вы находитесь на странице: 1из 39

Дебаггинг

Software Testing 101

Марат Ахин

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

2018

Марат Ахин (СПбПУ) DBG 2018 313 / 347


Quiz

Марат Ахин (СПбПУ) DBG 2018 314 / 347


Recap

Марат Ахин (СПбПУ) DBG 2018 315 / 347


Содержание

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

Марат Ахин (СПбПУ) DBG 2018 316 / 347


Поиск ошибок

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

Edsger Dijkstra
If debugging is the process of removing bugs, then programming must be
the process of putting them in.

Марат Ахин (СПбПУ) DBG 2018 317 / 347


Поиск ошибок

Как найти ошибку?


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

Марат Ахин (СПбПУ) DBG 2018 318 / 347


Поиск ошибок

Как найти ошибку?


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

Марат Ахин (СПбПУ) DBG 2018 318 / 347


Поиск ошибок

Как найти ошибку?


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

Марат Ахин (СПбПУ) DBG 2018 318 / 347


Поиск ошибок

Как найти ошибку?


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

Марат Ахин (СПбПУ) DBG 2018 318 / 347


Поиск ошибок

Как найти ошибку?


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

Марат Ахин (СПбПУ) DBG 2018 318 / 347


Поиск ошибок

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


Debugging не нужен

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

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

Марат Ахин (СПбПУ) DBG 2018 319 / 347


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

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

Марат Ахин (СПбПУ) DBG 2018 320 / 347


Debuggers

Debugger to the rescue!

Две основные задачи отладчика


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

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

Марат Ахин (СПбПУ) DBG 2018 321 / 347


Debuggers

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

Понимание того, что такое инструкция


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

Марат Ахин (СПбПУ) DBG 2018 322 / 347


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

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

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

Марат Ахин (СПбПУ) DBG 2018 323 / 347


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

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

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

Марат Ахин (СПбПУ) DBG 2018 324 / 347


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

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

А если...

Марат Ахин (СПбПУ) DBG 2018 325 / 347


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

Марат Ахин (СПбПУ) DBG 2018 326 / 347


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

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

Марат Ахин (СПбПУ) DBG 2018 327 / 347


One step forward, two steps back...

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

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

Марат Ахин (СПбПУ) DBG 2018 328 / 347


Step back

Марат Ахин (СПбПУ) DBG 2018 329 / 347


Time-traveling debugging

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

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


Нет необходимости перезапускать программу

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

Марат Ахин (СПбПУ) DBG 2018 330 / 347


Time-traveling debugging

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

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

Марат Ахин (СПбПУ) DBG 2018 331 / 347


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

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

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


сделать эффективно

Марат Ахин (СПбПУ) DBG 2018 332 / 347


Time-traveling debugging

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


Значение каждой переменной в каждый момент времени

Марат Ахин (СПбПУ) DBG 2018 333 / 347


Time-traveling virtual machine

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

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

Запись взаимодействия ПО с аппаратурой


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

Марат Ахин (СПбПУ) DBG 2018 334 / 347


Time-traveling virtual machine

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

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

Марат Ахин (СПбПУ) DBG 2018 335 / 347


Time travel

Марат Ахин (СПбПУ) DBG 2018 336 / 347


Дихотомия

Как поймать африканского льва?


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

Марат Ахин (СПбПУ) DBG 2018 337 / 347


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

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

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

Марат Ахин (СПбПУ) DBG 2018 338 / 347


Delta debugging

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

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


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

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

Марат Ахин (СПбПУ) DBG 2018 339 / 347


Delta debugging

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

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

Марат Ахин (СПбПУ) DBG 2018 340 / 347


Delta debugging

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

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


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

Марат Ахин (СПбПУ) DBG 2018 341 / 347


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

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

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 then
5: return DD(L)
6: else if only P(R) 7→ fail then
7: return DD(R)
8: else
9: return CC
10: end if
11: end function

Марат Ахин (СПбПУ) DBG 2018 342 / 347


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

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

1: function DD(CC)
0
2: CC = CC \ {CCi }
0
3: if P(CC ) 7→ fail then
0
4: return DD(CC )
0
5: else if P(CC ) 7→ pass then
0
6: return CCi ∪ DD(CC )
7: end if
8: end function

Марат Ахин (СПбПУ) DBG 2018 343 / 347


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

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

1: function DD(CC, N)
2: CC = CC 1 ∪ . . . ∪ CC N
3: for all CC i do
4: if P(CC i ) 7→ fail then
5: return DD(CC i )
6: else if P(CC \ CC i ) 7→ fail then
7: return DD(CC \ CC i )
8: end if
9: end for
10: return DD(CC , 2 × N)
11: end function

Марат Ахин (СПбПУ) DBG 2018 344 / 347


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

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

Зависимость Ci от типа данных


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

git/hg bisect

Марат Ахин (СПбПУ) DBG 2018 345 / 347


W.I.L.T.

Марат Ахин (СПбПУ) DBG 2018 346 / 347


Q&A

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