SlideShare a Scribd company logo
Обратная отладка
Довгалюк П. М.
Отладка
Отладка
 Известно, что отладка в два раза сложнее написания
программы. Поэтому если вы были предельно
хитроумны при написании программы, то что же вы
будете делать при ее отладке?
 Брайан Керниган, Элементы стиля программирования
 35-75% времени программиста уходит на отладку
Почему отладка сложна?
 Недетерминировнные баги
 Отладчик влияет на работу программы
 Отладчик работает только в одном направлении
 Не всегда удается передать сценарий
воспроизведения ошибки от тестировщика к
разработчику
Гейзенбаги
 Для отладки программа запускается многократно
 Ошибки в одних и тех же сценариях проявляются не
всегда
 Многопоточность
 Случайные числа
 Изменчивое окружение
 Неинициализированные переменные
Недетерминированные ошибки
void do_nothing(int &a)
{
if (rand() == 42)
++a; // happy debugging
}
Еще более редко проявляющиеся ошибки
DWORD WINAPI printThread(LPVOID lpParam)
{
while (TRUE)
if (var % 10000 == 0)
do_some_work(var);
return 0;
}
DWORD WINAPI incThread(LPVOID lpParam)
{
while (TRUE)
++var;
return 0;
}
Попробуем отладить с помощью printf
DWORD WINAPI printThread(LPVOID lpParam)
{
while (TRUE)
if (var % 10000 == 0) {
printf("%dn", var);
do_some_work(var);
}
return 0;
}
DWORD WINAPI incThread(LPVOID lpParam)
{
while (TRUE)
++var;
return 0;
}
Попробуем отладить с помощью printf
DWORD WINAPI printThread(LPVOID lpParam)
{
while (TRUE)
if (var % 10000 == 0) {
do_some_work(var);
printf("%dn", var);
}
return 0;
}
DWORD WINAPI incThread(LPVOID lpParam)
{
while (TRUE)
++var;
return 0;
}
Испорченные переменные
#include <stdio.h>
void f(int *a) {
int i;
for (i = -1 ; i < 6 ; ++i)
a[i] = i;
}
int z = 1016;
int main() {
int a[5];
int *p = &z;
printf("%dn", *p);
f(a);
printf("%dn", *p);
}
Отладка сетевых протоколов
 Приложение чувствительно ко времени
 Удаленный сервер не знает, что идет отладка
 Остановка программы приведет к таймауту
соединения
Обратная отладка
 Попытка «вернуться в прошлое» и
узнать что произошло
Отладка с помощью трассировки
 Нужно вставить много вызовов printf
 Не всегда удобно обращаться к переменной (адрес
неизвестен)
 Замедляет работу
 Может изменить результат работы
 Нужно знать заранее что хочешь посмотреть
 Требуется перекомпиляция
 Требуется повторный запуск
Обратная отладка с помощью трассы
инструкций
 Для каждой инструкции сохранять изменившиеся
ячейки
 Можно перейти на любое расстояние вперед и назад
перезаписывая и восстанавливая сохраненные
данные
 Работает медленно
 Сохраняет очень много данных
 Несколько килобайт на 1000 инструкций
Можно ли сохранять меньше данных?
int a, s = 0;
scanf(“%d”, &a);
for (int i = 0 ; i < a ; ++i)
s += i;
printf(“%d”, s);
Запись и воспроизведение
Обратная отладка с помощью воспроизведения
 Ход выполнения программы в основном
детерминирован
 Можно сохранять только входные данные,
информацию от планировщика потоков, прерывания
 Сохраняется мало данных
 Несколько байт на 1000 инструкций
 Повторные выполнения всегда одинаковы
 Быстро вернуться на произвольное расстояние назад
нельзя
Отладка с воспроизведением
 Сначала записываем работу программы
 Для отладки работа воспроизводится
 Можно «перемещаться во времени»
Отладчик
Отладчик
Результаты
анализа
Фаза записи Фаза воспроизведения
Реальный
мир
Пошаговое выполнение
Пошаговое выполнение
Пошаговое выполнение
Пошаговое выполнение
Обратная отладка
23
int *p = malloc(sizeof(int));
………….
p = NULL;
………….
int a = *p;
Обратная отладка
24
int *p = malloc(sizeof(int));
………….
p = NULL;
………….
int a = *p;
gdb> watch p
gdb> reverse-continue
Обратная отладка
25
int *p = malloc(sizeof(int));
………….
p = NULL;
………….
int a = *p;
gdb> watch p
gdb> reverse-continue
1234
Команды обратной отладки
 step
 next
 finish
 continue
 reverse step
 reverse next
 reverse finish
 reverse continue
Запись и воспроизведение
 Всё нужное для воспроизведения ошибки
записывается
 Обычно нельзя изменить ход выполнения программы
во время воспроизведения
 Записывать сценарий нужно начать заранее
 Пошаговое перемещение назад работает медленно
Обратные отладчики native приложений
 Отдельные приложения
 GDB
 Mozilla RR
 TotalView
 UndoDB
 Виртуальные машины
 QEMU
 Wind River Simics
gdb
 Версия 7+
 Встроенная поддержка i386-linux, amd64-linux
 Буфер на 200000 инструкций
 set record insn-number-max
 Удаленная отладка (Simics, UndoDB и другие)
gdb
 break
 run
 target record-full
 continue
 reverse-continue
long do_fork(unsigned long clone_flags,
unsigned long stack_start,
unsigned long stack_size,
int __user *parent_tidptr,
int __user *child_tidptr)
{
struct task_struct *p;
int trace = 0;
long nr;
/*
* Determine whether and which event to report to ptracer. When
* called from kernel_thread or CLONE_UNTRACED is explicitly
* requested, no event is reported; otherwise, report if the event
* for the type of forking is enabled.
*/
if (!(clone_flags & CLONE_UNTRACED)) {
if (clone_flags & CLONE_VFORK)
trace = PTRACE_EVENT_VFORK;
else if ((clone_flags & CSIGNAL) != SIGCHLD)
trace = PTRACE_EVENT_CLONE;
else
trace = PTRACE_EVENT_FORK;
if (likely(!ptrace_event_enabled(current, trace)))
trace = 0;
}
p = copy_process(clone_flags, stack_start, stack_size,
child_tidptr, NULL, trace);
/*
* Do this prior waking up the new thread - the thread pointer
* might get invalid after that point, if the thread exits quickly.
*/
if (!IS_ERR(p)) {
struct completion vfork;
struct pid *pid;
trace_sched_process_fork(current, p);
pid = get_task_pid(p, PIDTYPE_PID);
nr = pid_vnr(pid);
if (clone_flags & CLONE_PARENT_SETTID)
put_user(nr, parent_tidptr);
if (clone_flags & CLONE_VFORK) {
p->vfork_done = &vfork;
init_completion(&vfork);
get_task_struct(p);
}
wake_up_new_task(p);
/* forking complete and child started to run, tell ptracer */
if (unlikely(trace))
ptrace_event_pid(trace, pid);
if (clone_flags & CLONE_VFORK) {
if (!wait_for_vfork_done(p, &vfork))
ptrace_event_pid(PTRACE_EVENT_VFORK_DONE, pid);
}
put_pid(pid);
} else {
nr = PTR_ERR(p);
}
return nr;
}
gdb
 Повторные запуски программы могут размещаться по
новым адресам
 checkpoint – сохраняет снимок программы
 restore id – восстанавливает указанный снимок
 Каждый снимок представлен отдельным процессом в
памяти
 Позволяет исследовать разные ветки выполнения
gdb
 Не отображает вывод на экран/консоль
 Поддерживает только x86 под Linux
 Длина буфера инструкций ограничена
 Медленно работает
 gzip замедляется в 50000 раз
Mozilla RR
 Используется для отладки Firefox
 Записывает меньше данных, чем GDB
 Сохраняются результаты выполнения системных вызовов,
переключение потоков и т.п.
 Работает относительно быстро
 20-40% overhead при записи обычных приложений
 В худшем случае ~300%
Mozilla RR
 Записывает недетерминированные входы
 clock_gettime(...&now);
 read(fd, buf, 4096);
 __asm__("rdtsc")
 ioctl(...)
 UNIX signals...
 Во время воспроизведения эмулирует эти вызовы
 Не записывает процессы и потоки параллельно
 Сериализует многопоточные приложения, чтобы всё
записалось корректно
 Каждому потоку по очереди выделяется интервал
времени для работы
Mozilla RR
 Автоматически запускает GDB при воспроизведении
 Поддерживает команды обратной отладки
 reverse-step
 reverse-next
 reverse-finish
 reverse-continue
 Поддерживает GDB checkpoint
Mozilla RR
 По умолчанию сохраняет сценарий в файл
 Поддерживает запись многопоточных приложений
 Работает не на всех процессорах из-за использования
аппаратных счетчиков
 Поддержки ARM в ближайшее время не будет
 Поддерживаются не все системные вызовы
 Не воспроизводит графический интерфейс
QEMU
 Эмулятор с открытым исходным кодом
 Эмулирует x86,ARM, MIPS, PowerPC и др.
Отладка драйверов и операционных систем
38
 Падение системы
 Замедление работы
 Изменение поведения из-за отладочных методов
Отладка ОС через gdbserver в симуляторе
39
 Не нужно сохранять дампы, чтобы их анализировать
 Можно подключиться в любой момент
 Даже при критическом сбое
 Даже до загрузки ОС
 Отладка без реального оборудования
 Отладка прошивки
 Отладка моделей оборудования
 Работает медленнее из-за виртуализации
 Ход работы может измениться из-за остановок
Детерминированное воспроизведение и
обратная отладка
40
 Должна работать на всех платформах QEMU
 Протестирована для x86, x64,ARM, MIPS
 Отладка и анализ всей системы
 Ядро и BIOS
 Виртуальные устройства
 Во время воспроизведения можно переключиться на
обычную работу
 Работает медленнее из-за виртуализации
QEMU
41
 Опубликованы все патчи для обратной отладки
 около 6000 LOC
 В QEMU 2.5 включено ядро воспроизведения
 Без блочных устройств, gdb, сети, USB
 Патчи для дисковых устройств в работе
Почему же люди не используют обратную
отладку? © Stackexchange, 2013
 В GDB появилась в 2009 году
 Historical debugging в MSVS
 Нужен специальный отладчик
 Работает медленно (в GDB)
 Люди думают, что она не работает
Обратная отладка
 Использование обратной отладки на 26% снижает
время, затрачиваемое на поиск ошибок
 Cambridge’s Judge Business School
 Бесплатный отладчик Mozilla RR
 Бесплатный отладчик GDB

More Related Content

What's hot

Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Platonov Sergey
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Sergey Platonov
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибки
Platonov Sergey
 
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияЕвгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Platonov Sergey
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о Boost
Sergey Platonov
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Sergey Platonov
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
corehard_by
 
C++ refelection and cats
C++ refelection and catsC++ refelection and cats
C++ refelection and cats
corehard_by
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines
Sergey Zubkov
 
хитрости выведения типов
хитрости выведения типовхитрости выведения типов
хитрости выведения типов
corehard_by
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1
m2rus
 
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Yandex
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Yandex
 
Parallel STL
Parallel STLParallel STL
Parallel STL
Evgeny Krutko
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
Platonov Sergey
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
Python Meetup
 
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
corehard_by
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
victor-yastrebov
 
Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++
Yauheni Akhotnikau
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6
Dima Dzuba
 

What's hot (20)

Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибки
 
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияЕвгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализация
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о Boost
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
 
C++ refelection and cats
C++ refelection and catsC++ refelection and cats
C++ refelection and cats
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines
 
хитрости выведения типов
хитрости выведения типовхитрости выведения типов
хитрости выведения типов
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1
 
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
 
Parallel STL
Parallel STLParallel STL
Parallel STL
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
 
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
 
Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6
 

Viewers also liked

Антон Нонко, Классические строки в C++
Антон Нонко, Классические строки в C++Антон Нонко, Классические строки в C++
Антон Нонко, Классические строки в C++
Sergey Platonov
 
Антон Полухин. C++17
Антон Полухин. C++17Антон Полухин. C++17
Антон Полухин. C++17
Sergey Platonov
 
Михаил Матросов, Повседневный С++: boost и STL
Михаил Матросов, Повседневный С++: boost и STLМихаил Матросов, Повседневный С++: boost и STL
Михаил Матросов, Повседневный С++: boost и STL
Sergey Platonov
 
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...
Sergey Platonov
 
Concepts lite
Concepts liteConcepts lite
Concepts lite
Platonov Sergey
 
Антон Бикинеев, Reflection in C++Next
Антон Бикинеев,  Reflection in C++NextАнтон Бикинеев,  Reflection in C++Next
Антон Бикинеев, Reflection in C++Next
Sergey Platonov
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптер
Sergey Platonov
 
Clang tidy
Clang tidyClang tidy
Clang tidy
Yury Yafimachau
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_cast
Roman Orlov
 
Алексей Кутумов, C++ без исключений, часть 3
Алексей Кутумов,  C++ без исключений, часть 3Алексей Кутумов,  C++ без исключений, часть 3
Алексей Кутумов, C++ без исключений, часть 3
Platonov Sergey
 
Фитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в формеФитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в форме
Ilia Shishkov
 
Evgeniy Muralev, Mark Vince, Working with the compiler, not against it
Evgeniy Muralev, Mark Vince, Working with the compiler, not against itEvgeniy Muralev, Mark Vince, Working with the compiler, not against it
Evgeniy Muralev, Mark Vince, Working with the compiler, not against it
Sergey Platonov
 
Quality assurance of large c++ projects
Quality assurance of large c++ projectsQuality assurance of large c++ projects
Quality assurance of large c++ projects
corehard_by
 
Fuzzing: The New Unit Testing
Fuzzing: The New Unit TestingFuzzing: The New Unit Testing
Fuzzing: The New Unit Testing
Dmitry Vyukov
 
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Mikhail Matrosov
 
Василий Сорокин, Простой REST сервер на Qt с рефлексией
Василий Сорокин, Простой REST сервер на Qt с рефлексиейВасилий Сорокин, Простой REST сервер на Qt с рефлексией
Василий Сорокин, Простой REST сервер на Qt с рефлексией
Sergey Platonov
 

Viewers also liked (16)

Антон Нонко, Классические строки в C++
Антон Нонко, Классические строки в C++Антон Нонко, Классические строки в C++
Антон Нонко, Классические строки в C++
 
Антон Полухин. C++17
Антон Полухин. C++17Антон Полухин. C++17
Антон Полухин. C++17
 
Михаил Матросов, Повседневный С++: boost и STL
Михаил Матросов, Повседневный С++: boost и STLМихаил Матросов, Повседневный С++: boost и STL
Михаил Матросов, Повседневный С++: boost и STL
 
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...
 
Concepts lite
Concepts liteConcepts lite
Concepts lite
 
Антон Бикинеев, Reflection in C++Next
Антон Бикинеев,  Reflection in C++NextАнтон Бикинеев,  Reflection in C++Next
Антон Бикинеев, Reflection in C++Next
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптер
 
Clang tidy
Clang tidyClang tidy
Clang tidy
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_cast
 
Алексей Кутумов, C++ без исключений, часть 3
Алексей Кутумов,  C++ без исключений, часть 3Алексей Кутумов,  C++ без исключений, часть 3
Алексей Кутумов, C++ без исключений, часть 3
 
Фитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в формеФитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в форме
 
Evgeniy Muralev, Mark Vince, Working with the compiler, not against it
Evgeniy Muralev, Mark Vince, Working with the compiler, not against itEvgeniy Muralev, Mark Vince, Working with the compiler, not against it
Evgeniy Muralev, Mark Vince, Working with the compiler, not against it
 
Quality assurance of large c++ projects
Quality assurance of large c++ projectsQuality assurance of large c++ projects
Quality assurance of large c++ projects
 
Fuzzing: The New Unit Testing
Fuzzing: The New Unit TestingFuzzing: The New Unit Testing
Fuzzing: The New Unit Testing
 
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
 
Василий Сорокин, Простой REST сервер на Qt с рефлексией
Василий Сорокин, Простой REST сервер на Qt с рефлексиейВасилий Сорокин, Простой REST сервер на Qt с рефлексией
Василий Сорокин, Простой REST сервер на Qt с рефлексией
 

Similar to Павел Довгалюк, Обратная отладка

TMPA-2015: Multi-Platform Approach to Reverse Debugging of Virtual Machines
TMPA-2015: Multi-Platform Approach to Reverse Debugging of Virtual MachinesTMPA-2015: Multi-Platform Approach to Reverse Debugging of Virtual Machines
TMPA-2015: Multi-Platform Approach to Reverse Debugging of Virtual Machines
Iosif Itkin
 
Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The Grinder
Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The GrinderИлья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The Grinder
Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The Grinder
SQALab
 
Методики и инструменты для самостоятельного решения проблем в сети
Методики и инструменты для самостоятельного решения проблем в сетиМетодики и инструменты для самостоятельного решения проблем в сети
Методики и инструменты для самостоятельного решения проблем в сети
Cisco Russia
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
Mikhail Kurnosov
 
Windbg: когда у нас не воспроизводится. Александр Головач ➠ CoreHard Autumn ...
Windbg: когда у нас не воспроизводится. Александр Головач ➠  CoreHard Autumn ...Windbg: когда у нас не воспроизводится. Александр Головач ➠  CoreHard Autumn ...
Windbg: когда у нас не воспроизводится. Александр Головач ➠ CoreHard Autumn ...
corehard_by
 
Распределённое нагрузочное тестирование на Java
Распределённое нагрузочное тестирование на JavaРаспределённое нагрузочное тестирование на Java
Распределённое нагрузочное тестирование на Java
aragozin
 
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)Mikhail Kurnosov
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Mikhail Kurnosov
 
static - defcon russia 20
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20
DefconRussia
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonovComputer Science Club
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
Mikhail Kurnosov
 
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)Vadim Kosov
 
Низкоуровневая Оптимизация (Андрей Аксенов)
Низкоуровневая Оптимизация (Андрей Аксенов)Низкоуровневая Оптимизация (Андрей Аксенов)
Низкоуровневая Оптимизация (Андрей Аксенов)Ontico
 
20090720 hpc exercise1
20090720 hpc exercise120090720 hpc exercise1
20090720 hpc exercise1Michael Karpov
 
Пакетное ядро мобильного оператора: ASR5k, поиски устранение неисправностей
Пакетное ядро мобильного оператора: ASR5k, поиски устранение неисправностейПакетное ядро мобильного оператора: ASR5k, поиски устранение неисправностей
Пакетное ядро мобильного оператора: ASR5k, поиски устранение неисправностей
Cisco Russia
 
Контроль качества и сопровождение программ в реальном времени
Контроль качества и сопровождение программ в реальном времениКонтроль качества и сопровождение программ в реальном времени
Контроль качества и сопровождение программ в реальном времени
SQALab
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
Roman Dvornov
 
Вечный вопрос измерения времени
Вечный вопрос измерения времениВечный вопрос измерения времени
Вечный вопрос измерения времени
Tatyanazaxarova
 
Continuous monitoring
Continuous monitoringContinuous monitoring
Continuous monitoring
Dmitry Yackevich
 

Similar to Павел Довгалюк, Обратная отладка (20)

TMPA-2015: Multi-Platform Approach to Reverse Debugging of Virtual Machines
TMPA-2015: Multi-Platform Approach to Reverse Debugging of Virtual MachinesTMPA-2015: Multi-Platform Approach to Reverse Debugging of Virtual Machines
TMPA-2015: Multi-Platform Approach to Reverse Debugging of Virtual Machines
 
Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The Grinder
Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The GrinderИлья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The Grinder
Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The Grinder
 
Методики и инструменты для самостоятельного решения проблем в сети
Методики и инструменты для самостоятельного решения проблем в сетиМетодики и инструменты для самостоятельного решения проблем в сети
Методики и инструменты для самостоятельного решения проблем в сети
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Windbg: когда у нас не воспроизводится. Александр Головач ➠ CoreHard Autumn ...
Windbg: когда у нас не воспроизводится. Александр Головач ➠  CoreHard Autumn ...Windbg: когда у нас не воспроизводится. Александр Головач ➠  CoreHard Autumn ...
Windbg: когда у нас не воспроизводится. Александр Головач ➠ CoreHard Autumn ...
 
Распределённое нагрузочное тестирование на Java
Распределённое нагрузочное тестирование на JavaРаспределённое нагрузочное тестирование на Java
Распределённое нагрузочное тестирование на Java
 
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
 
static - defcon russia 20
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
 
Низкоуровневая Оптимизация (Андрей Аксенов)
Низкоуровневая Оптимизация (Андрей Аксенов)Низкоуровневая Оптимизация (Андрей Аксенов)
Низкоуровневая Оптимизация (Андрей Аксенов)
 
Cpp
CppCpp
Cpp
 
20090720 hpc exercise1
20090720 hpc exercise120090720 hpc exercise1
20090720 hpc exercise1
 
Пакетное ядро мобильного оператора: ASR5k, поиски устранение неисправностей
Пакетное ядро мобильного оператора: ASR5k, поиски устранение неисправностейПакетное ядро мобильного оператора: ASR5k, поиски устранение неисправностей
Пакетное ядро мобильного оператора: ASR5k, поиски устранение неисправностей
 
Контроль качества и сопровождение программ в реальном времени
Контроль качества и сопровождение программ в реальном времениКонтроль качества и сопровождение программ в реальном времени
Контроль качества и сопровождение программ в реальном времени
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
Вечный вопрос измерения времени
Вечный вопрос измерения времениВечный вопрос измерения времени
Вечный вопрос измерения времени
 
Continuous monitoring
Continuous monitoringContinuous monitoring
Continuous monitoring
 

More from Sergey Platonov

Лев Казаркин, Удивительные приключения регистров SSE или в поисках одного бага
Лев Казаркин, Удивительные приключения регистров SSE или в поисках одного багаЛев Казаркин, Удивительные приключения регистров SSE или в поисках одного бага
Лев Казаркин, Удивительные приключения регистров SSE или в поисках одного бага
Sergey Platonov
 
Антон Бикинеев, Writing good std::future&lt; C++ >
Антон Бикинеев, Writing good std::future&lt; C++ >Антон Бикинеев, Writing good std::future&lt; C++ >
Антон Бикинеев, Writing good std::future&lt; C++ >
Sergey Platonov
 
Павел Филонов, Разделяй и управляй вместе с Conan.io
Павел Филонов, Разделяй и управляй вместе с Conan.ioПавел Филонов, Разделяй и управляй вместе с Conan.io
Павел Филонов, Разделяй и управляй вместе с Conan.io
Sergey Platonov
 
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Sergey Platonov
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++
Sergey Platonov
 
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на QtДенис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt
Sergey Platonov
 
Алексей Кутумов, Coroutines everywhere
Алексей Кутумов, Coroutines everywhereАлексей Кутумов, Coroutines everywhere
Алексей Кутумов, Coroutines everywhere
Sergey Platonov
 
Дмитрий Нестерук, Паттерны проектирования в XXI веке
Дмитрий Нестерук, Паттерны проектирования в XXI векеДмитрий Нестерук, Паттерны проектирования в XXI веке
Дмитрий Нестерук, Паттерны проектирования в XXI веке
Sergey Platonov
 
Dori Exterman, Considerations for choosing the parallel computing strategy th...
Dori Exterman, Considerations for choosing the parallel computing strategy th...Dori Exterman, Considerations for choosing the parallel computing strategy th...
Dori Exterman, Considerations for choosing the parallel computing strategy th...
Sergey Platonov
 
Алексей Кутумов, Вектор с нуля
Алексей Кутумов, Вектор с нуляАлексей Кутумов, Вектор с нуля
Алексей Кутумов, Вектор с нуля
Sergey Platonov
 
Kirk Shoop, Reactive programming in C++
Kirk Shoop, Reactive programming in C++Kirk Shoop, Reactive programming in C++
Kirk Shoop, Reactive programming in C++
Sergey Platonov
 
Дмитрий Демчук. Кроссплатформенный краш-репорт
Дмитрий Демчук. Кроссплатформенный краш-репортДмитрий Демчук. Кроссплатформенный краш-репорт
Дмитрий Демчук. Кроссплатформенный краш-репорт
Sergey Platonov
 
Илья Шишков, Принципы создания тестируемого кода
Илья Шишков, Принципы создания тестируемого кодаИлья Шишков, Принципы создания тестируемого кода
Илья Шишков, Принципы создания тестируемого кода
Sergey Platonov
 
Антон Наумович, Система автоматической крэш-аналитики своими средствами
Антон Наумович, Система автоматической крэш-аналитики своими средствамиАнтон Наумович, Система автоматической крэш-аналитики своими средствами
Антон Наумович, Система автоматической крэш-аналитики своими средствами
Sergey Platonov
 

More from Sergey Platonov (14)

Лев Казаркин, Удивительные приключения регистров SSE или в поисках одного бага
Лев Казаркин, Удивительные приключения регистров SSE или в поисках одного багаЛев Казаркин, Удивительные приключения регистров SSE или в поисках одного бага
Лев Казаркин, Удивительные приключения регистров SSE или в поисках одного бага
 
Антон Бикинеев, Writing good std::future&lt; C++ >
Антон Бикинеев, Writing good std::future&lt; C++ >Антон Бикинеев, Writing good std::future&lt; C++ >
Антон Бикинеев, Writing good std::future&lt; C++ >
 
Павел Филонов, Разделяй и управляй вместе с Conan.io
Павел Филонов, Разделяй и управляй вместе с Conan.ioПавел Филонов, Разделяй и управляй вместе с Conan.io
Павел Филонов, Разделяй и управляй вместе с Conan.io
 
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизация
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++
 
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на QtДенис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt
 
Алексей Кутумов, Coroutines everywhere
Алексей Кутумов, Coroutines everywhereАлексей Кутумов, Coroutines everywhere
Алексей Кутумов, Coroutines everywhere
 
Дмитрий Нестерук, Паттерны проектирования в XXI веке
Дмитрий Нестерук, Паттерны проектирования в XXI векеДмитрий Нестерук, Паттерны проектирования в XXI веке
Дмитрий Нестерук, Паттерны проектирования в XXI веке
 
Dori Exterman, Considerations for choosing the parallel computing strategy th...
Dori Exterman, Considerations for choosing the parallel computing strategy th...Dori Exterman, Considerations for choosing the parallel computing strategy th...
Dori Exterman, Considerations for choosing the parallel computing strategy th...
 
Алексей Кутумов, Вектор с нуля
Алексей Кутумов, Вектор с нуляАлексей Кутумов, Вектор с нуля
Алексей Кутумов, Вектор с нуля
 
Kirk Shoop, Reactive programming in C++
Kirk Shoop, Reactive programming in C++Kirk Shoop, Reactive programming in C++
Kirk Shoop, Reactive programming in C++
 
Дмитрий Демчук. Кроссплатформенный краш-репорт
Дмитрий Демчук. Кроссплатформенный краш-репортДмитрий Демчук. Кроссплатформенный краш-репорт
Дмитрий Демчук. Кроссплатформенный краш-репорт
 
Илья Шишков, Принципы создания тестируемого кода
Илья Шишков, Принципы создания тестируемого кодаИлья Шишков, Принципы создания тестируемого кода
Илья Шишков, Принципы создания тестируемого кода
 
Антон Наумович, Система автоматической крэш-аналитики своими средствами
Антон Наумович, Система автоматической крэш-аналитики своими средствамиАнтон Наумович, Система автоматической крэш-аналитики своими средствами
Антон Наумович, Система автоматической крэш-аналитики своими средствами
 

Павел Довгалюк, Обратная отладка

  • 3. Отладка  Известно, что отладка в два раза сложнее написания программы. Поэтому если вы были предельно хитроумны при написании программы, то что же вы будете делать при ее отладке?  Брайан Керниган, Элементы стиля программирования  35-75% времени программиста уходит на отладку
  • 4. Почему отладка сложна?  Недетерминировнные баги  Отладчик влияет на работу программы  Отладчик работает только в одном направлении  Не всегда удается передать сценарий воспроизведения ошибки от тестировщика к разработчику
  • 5. Гейзенбаги  Для отладки программа запускается многократно  Ошибки в одних и тех же сценариях проявляются не всегда  Многопоточность  Случайные числа  Изменчивое окружение  Неинициализированные переменные
  • 6. Недетерминированные ошибки void do_nothing(int &a) { if (rand() == 42) ++a; // happy debugging }
  • 7. Еще более редко проявляющиеся ошибки DWORD WINAPI printThread(LPVOID lpParam) { while (TRUE) if (var % 10000 == 0) do_some_work(var); return 0; } DWORD WINAPI incThread(LPVOID lpParam) { while (TRUE) ++var; return 0; }
  • 8. Попробуем отладить с помощью printf DWORD WINAPI printThread(LPVOID lpParam) { while (TRUE) if (var % 10000 == 0) { printf("%dn", var); do_some_work(var); } return 0; } DWORD WINAPI incThread(LPVOID lpParam) { while (TRUE) ++var; return 0; }
  • 9. Попробуем отладить с помощью printf DWORD WINAPI printThread(LPVOID lpParam) { while (TRUE) if (var % 10000 == 0) { do_some_work(var); printf("%dn", var); } return 0; } DWORD WINAPI incThread(LPVOID lpParam) { while (TRUE) ++var; return 0; }
  • 10. Испорченные переменные #include <stdio.h> void f(int *a) { int i; for (i = -1 ; i < 6 ; ++i) a[i] = i; } int z = 1016; int main() { int a[5]; int *p = &z; printf("%dn", *p); f(a); printf("%dn", *p); }
  • 11. Отладка сетевых протоколов  Приложение чувствительно ко времени  Удаленный сервер не знает, что идет отладка  Остановка программы приведет к таймауту соединения
  • 12. Обратная отладка  Попытка «вернуться в прошлое» и узнать что произошло
  • 13. Отладка с помощью трассировки  Нужно вставить много вызовов printf  Не всегда удобно обращаться к переменной (адрес неизвестен)  Замедляет работу  Может изменить результат работы  Нужно знать заранее что хочешь посмотреть  Требуется перекомпиляция  Требуется повторный запуск
  • 14. Обратная отладка с помощью трассы инструкций  Для каждой инструкции сохранять изменившиеся ячейки  Можно перейти на любое расстояние вперед и назад перезаписывая и восстанавливая сохраненные данные  Работает медленно  Сохраняет очень много данных  Несколько килобайт на 1000 инструкций
  • 15. Можно ли сохранять меньше данных? int a, s = 0; scanf(“%d”, &a); for (int i = 0 ; i < a ; ++i) s += i; printf(“%d”, s);
  • 17. Обратная отладка с помощью воспроизведения  Ход выполнения программы в основном детерминирован  Можно сохранять только входные данные, информацию от планировщика потоков, прерывания  Сохраняется мало данных  Несколько байт на 1000 инструкций  Повторные выполнения всегда одинаковы  Быстро вернуться на произвольное расстояние назад нельзя
  • 18. Отладка с воспроизведением  Сначала записываем работу программы  Для отладки работа воспроизводится  Можно «перемещаться во времени» Отладчик Отладчик Результаты анализа Фаза записи Фаза воспроизведения Реальный мир
  • 23. Обратная отладка 23 int *p = malloc(sizeof(int)); …………. p = NULL; …………. int a = *p;
  • 24. Обратная отладка 24 int *p = malloc(sizeof(int)); …………. p = NULL; …………. int a = *p; gdb> watch p gdb> reverse-continue
  • 25. Обратная отладка 25 int *p = malloc(sizeof(int)); …………. p = NULL; …………. int a = *p; gdb> watch p gdb> reverse-continue 1234
  • 26. Команды обратной отладки  step  next  finish  continue  reverse step  reverse next  reverse finish  reverse continue
  • 27. Запись и воспроизведение  Всё нужное для воспроизведения ошибки записывается  Обычно нельзя изменить ход выполнения программы во время воспроизведения  Записывать сценарий нужно начать заранее  Пошаговое перемещение назад работает медленно
  • 28. Обратные отладчики native приложений  Отдельные приложения  GDB  Mozilla RR  TotalView  UndoDB  Виртуальные машины  QEMU  Wind River Simics
  • 29. gdb  Версия 7+  Встроенная поддержка i386-linux, amd64-linux  Буфер на 200000 инструкций  set record insn-number-max  Удаленная отладка (Simics, UndoDB и другие)
  • 30. gdb  break  run  target record-full  continue  reverse-continue long do_fork(unsigned long clone_flags, unsigned long stack_start, unsigned long stack_size, int __user *parent_tidptr, int __user *child_tidptr) { struct task_struct *p; int trace = 0; long nr; /* * Determine whether and which event to report to ptracer. When * called from kernel_thread or CLONE_UNTRACED is explicitly * requested, no event is reported; otherwise, report if the event * for the type of forking is enabled. */ if (!(clone_flags & CLONE_UNTRACED)) { if (clone_flags & CLONE_VFORK) trace = PTRACE_EVENT_VFORK; else if ((clone_flags & CSIGNAL) != SIGCHLD) trace = PTRACE_EVENT_CLONE; else trace = PTRACE_EVENT_FORK; if (likely(!ptrace_event_enabled(current, trace))) trace = 0; } p = copy_process(clone_flags, stack_start, stack_size, child_tidptr, NULL, trace); /* * Do this prior waking up the new thread - the thread pointer * might get invalid after that point, if the thread exits quickly. */ if (!IS_ERR(p)) { struct completion vfork; struct pid *pid; trace_sched_process_fork(current, p); pid = get_task_pid(p, PIDTYPE_PID); nr = pid_vnr(pid); if (clone_flags & CLONE_PARENT_SETTID) put_user(nr, parent_tidptr); if (clone_flags & CLONE_VFORK) { p->vfork_done = &vfork; init_completion(&vfork); get_task_struct(p); } wake_up_new_task(p); /* forking complete and child started to run, tell ptracer */ if (unlikely(trace)) ptrace_event_pid(trace, pid); if (clone_flags & CLONE_VFORK) { if (!wait_for_vfork_done(p, &vfork)) ptrace_event_pid(PTRACE_EVENT_VFORK_DONE, pid); } put_pid(pid); } else { nr = PTR_ERR(p); } return nr; }
  • 31. gdb  Повторные запуски программы могут размещаться по новым адресам  checkpoint – сохраняет снимок программы  restore id – восстанавливает указанный снимок  Каждый снимок представлен отдельным процессом в памяти  Позволяет исследовать разные ветки выполнения
  • 32. gdb  Не отображает вывод на экран/консоль  Поддерживает только x86 под Linux  Длина буфера инструкций ограничена  Медленно работает  gzip замедляется в 50000 раз
  • 33. Mozilla RR  Используется для отладки Firefox  Записывает меньше данных, чем GDB  Сохраняются результаты выполнения системных вызовов, переключение потоков и т.п.  Работает относительно быстро  20-40% overhead при записи обычных приложений  В худшем случае ~300%
  • 34. Mozilla RR  Записывает недетерминированные входы  clock_gettime(...&now);  read(fd, buf, 4096);  __asm__("rdtsc")  ioctl(...)  UNIX signals...  Во время воспроизведения эмулирует эти вызовы  Не записывает процессы и потоки параллельно  Сериализует многопоточные приложения, чтобы всё записалось корректно  Каждому потоку по очереди выделяется интервал времени для работы
  • 35. Mozilla RR  Автоматически запускает GDB при воспроизведении  Поддерживает команды обратной отладки  reverse-step  reverse-next  reverse-finish  reverse-continue  Поддерживает GDB checkpoint
  • 36. Mozilla RR  По умолчанию сохраняет сценарий в файл  Поддерживает запись многопоточных приложений  Работает не на всех процессорах из-за использования аппаратных счетчиков  Поддержки ARM в ближайшее время не будет  Поддерживаются не все системные вызовы  Не воспроизводит графический интерфейс
  • 37. QEMU  Эмулятор с открытым исходным кодом  Эмулирует x86,ARM, MIPS, PowerPC и др.
  • 38. Отладка драйверов и операционных систем 38  Падение системы  Замедление работы  Изменение поведения из-за отладочных методов
  • 39. Отладка ОС через gdbserver в симуляторе 39  Не нужно сохранять дампы, чтобы их анализировать  Можно подключиться в любой момент  Даже при критическом сбое  Даже до загрузки ОС  Отладка без реального оборудования  Отладка прошивки  Отладка моделей оборудования  Работает медленнее из-за виртуализации  Ход работы может измениться из-за остановок
  • 40. Детерминированное воспроизведение и обратная отладка 40  Должна работать на всех платформах QEMU  Протестирована для x86, x64,ARM, MIPS  Отладка и анализ всей системы  Ядро и BIOS  Виртуальные устройства  Во время воспроизведения можно переключиться на обычную работу  Работает медленнее из-за виртуализации
  • 41. QEMU 41  Опубликованы все патчи для обратной отладки  около 6000 LOC  В QEMU 2.5 включено ядро воспроизведения  Без блочных устройств, gdb, сети, USB  Патчи для дисковых устройств в работе
  • 42. Почему же люди не используют обратную отладку? © Stackexchange, 2013  В GDB появилась в 2009 году  Historical debugging в MSVS  Нужен специальный отладчик  Работает медленно (в GDB)  Люди думают, что она не работает
  • 43. Обратная отладка  Использование обратной отладки на 26% снижает время, затрачиваемое на поиск ошибок  Cambridge’s Judge Business School  Бесплатный отладчик Mozilla RR  Бесплатный отладчик GDB