КС:2015:Проект:debuger
Содержание
Что это за проект
Введение
Часто лучший способ понять, каким образом процесс пришёл в какое-то интересное состояние (например, в которое не должен был прийти никогда), - это проследить по шагам за его выполнением. Типичные способы, которые используются на практике:
- К процессу можно присоединиться при помощи gdb и отследить его выполнение по шагам. Неудобства: во-первых, не всегда есть возможность присоединиться gdb в интерактивном режиме. Во-вторых, проблема может быть тяжело воспроизводимой, и шагов придётся делать очень много.
- В программу можно добавить отладочную печать, и процесс в процессе работы будет записывать в поток своё состояние.
Как можно добавить отладочную печать?
- Например, можно модифицировать исходный код и пересобрать программу. Можно это сделать руками. Можно при помощи кодогенерации, так это делает, например, etrace. Недостаток: не всегда есть возможность пересобрать программу.
- Можно воспользоваться системным вызовом ptrace и добавить software breakpoints в интересующие места, как это делает strace или gdb. Или даже ещё проще - написать скрипт для gdb. Недостаток этого подхода: это может быть очень медленно, если мы хотим трассировать большое количество событий.
- Можно воспользоваться динамической линковкой через LD_PRELOAD или ld --wrap, как это делает ltrace. Ограничение - нужна динамическая линковка.
- И, наконец, мы можем на лету изменить код программы (это называется инструментированием). Так делает, например, callgrind.
Что требуется
Вам предлагается написать менее функциональный, но существенно более быстрый аналог callgrind с использованием инструментирования бинарного кода, воспользовавшись библиотекой DynInst или аналогичной (можно даже взять callgrind и отрезать от него всё лишнее). Ваша программа должна будет выводить в поток все вызовы функций в исследуемом процессе.
Слайды
Чему вы научитесь
1. Узнаете, как устроены отладчики.
2. Узнаете, как устроена память процесса.
3. Подружитесь с эльфом и дварфом.
Начальные требования
1. Технический английский язык.
2. Знание C++.
3. Любознательность.
Критерии оценивания
Требования на зачет в конце 1-го модуля
Нужно будет реализовать программу (трейсер), которая умеет логировать все события вызова функций и возврата из них.
Итоговая оценка
- 4 балла. Реализованы требования на зачёт в конце первого модуля.
- 8 баллов. Трейсер, используя отладочную информацию, выводит номер строки в файле, из которого было скомпилировано место вызова, а также значения аргументов и возвращаемое значение.
- +2 балла. Поддерживаются многопоточные приложения.
- +2 балла. Поддерживаются заинлайненные функции.
- +N баллов. N = 4 * max(0, aver(1 - Ttracer / Tcallgrind)) за обгон callgrind на предложенных тестах (постараемся выбрать максимально приближенные к реальности).