<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://www.wikicshse.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%9A%D0%A1%3A2015%3A%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82%3Adebuger</id>
	<title>КС:2015:Проект:debuger - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://www.wikicshse.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%9A%D0%A1%3A2015%3A%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82%3Adebuger"/>
	<link rel="alternate" type="text/html" href="https://www.wikicshse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:debuger&amp;action=history"/>
	<updated>2026-06-06T16:57:00Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://www.wikicshse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:debuger&amp;diff=1140&amp;oldid=prev</id>
		<title>imported&gt;Rkovalev: /* Что это за проект */</title>
		<link rel="alternate" type="text/html" href="https://www.wikicshse.ru/index.php?title=%D0%9A%D0%A1:2015:%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:debuger&amp;diff=1140&amp;oldid=prev"/>
		<updated>2015-09-25T14:18:04Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Что это за проект&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Что это за проект ==&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
Часто лучший способ понять, каким образом процесс пришёл в какое-то интересное состояние (например, в которое не должен был прийти никогда), - это проследить по шагам за его выполнением. Типичные способы, которые используются на практике: &lt;br /&gt;
&lt;br /&gt;
* К процессу можно присоединиться при помощи gdb и отследить его выполнение по шагам. Неудобства: во-первых, не всегда есть возможность присоединиться gdb в интерактивном режиме. Во-вторых, проблема может быть тяжело воспроизводимой, и шагов придётся делать очень много.&lt;br /&gt;
* В программу можно добавить отладочную печать, и процесс в процессе работы будет записывать в поток своё состояние.&lt;br /&gt;
&lt;br /&gt;
Как можно добавить отладочную печать?&lt;br /&gt;
* Например, можно модифицировать исходный код и пересобрать программу. Можно это сделать руками. Можно при помощи кодогенерации, так это делает, например, [http://ndevilla.free.fr/etrace/ etrace]. Недостаток: не всегда есть возможность пересобрать программу.&lt;br /&gt;
* Можно воспользоваться системным вызовом [http://man7.org/linux/man-pages/man2/ptrace.2.html ptrace] и добавить [https://en.wikipedia.org/wiki/INT_%28x86_instruction%29#INT_3 software breakpoints] в интересующие места, как это делает [http://man7.org/linux/man-pages/man1/strace.1.html strace] или [http://www.gnu.org/software/gdb/ gdb]. Или даже ещё проще - написать [http://ndevilla.free.fr/etrace/ скрипт] для gdb. Недостаток этого подхода: это может быть очень медленно, если мы хотим трассировать большое количество событий.&lt;br /&gt;
* Можно воспользоваться динамической линковкой через [http://samanbarghi.com/blog/2014/09/05/how-to-wrap-a-system-call-libc-function-in-linux/ LD_PRELOAD или ld --wrap], как это делает [http://man7.org/linux/man-pages/man1/ltrace.1.html ltrace]. Ограничение - нужна динамическая линковка.&lt;br /&gt;
* И, наконец, мы можем на лету изменить код программы (это называется [https://en.wikipedia.org/wiki/Instrumentation_%28computer_programming%29 инструментированием]). Так делает, например, [http://valgrind.org/docs/manual/cl-manual.html callgrind].&lt;br /&gt;
&lt;br /&gt;
=== Что требуется ===&lt;br /&gt;
Вам предлагается написать менее функциональный, но существенно более быстрый аналог callgrind с использованием инструментирования бинарного кода, воспользовавшись библиотекой [https://ru.wikipedia.org/wiki/DynInst DynInst] или аналогичной (можно даже взять callgrind и отрезать от него всё лишнее). Ваша программа должна будет выводить в поток все вызовы функций в исследуемом процессе.&lt;br /&gt;
&lt;br /&gt;
=== Слайды ===&lt;br /&gt;
[https://yadi.sk/i/O7AslJNLjKSw6 Лежат здесь.]&lt;br /&gt;
&lt;br /&gt;
== Чему вы научитесь ==&lt;br /&gt;
1. Узнаете, как устроены отладчики.&lt;br /&gt;
&lt;br /&gt;
2. Узнаете, как устроена память процесса.&lt;br /&gt;
&lt;br /&gt;
3. Подружитесь с эльфом и дварфом.&lt;br /&gt;
&lt;br /&gt;
== Начальные требования ==&lt;br /&gt;
1. Технический английский язык.&lt;br /&gt;
&lt;br /&gt;
2. Знание C++.&lt;br /&gt;
&lt;br /&gt;
3. Любознательность.&lt;br /&gt;
&lt;br /&gt;
== Критерии оценивания ==&lt;br /&gt;
&lt;br /&gt;
=== Требования на зачет в конце 1-го модуля ===&lt;br /&gt;
Нужно будет реализовать программу (трейсер), которая умеет логировать все события вызова функций и возврата из них.&lt;br /&gt;
&lt;br /&gt;
=== Итоговая оценка ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;4 балла&amp;#039;&amp;#039;&amp;#039;. Реализованы требования на зачёт в конце первого модуля.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;8 баллов&amp;#039;&amp;#039;&amp;#039;. Трейсер, используя отладочную информацию, выводит номер строки в файле, из которого было скомпилировано место вызова, а также значения аргументов и возвращаемое значение.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;+2 балла&amp;#039;&amp;#039;&amp;#039;. Поддерживаются многопоточные приложения.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;+2 балла&amp;#039;&amp;#039;&amp;#039;. Поддерживаются заинлайненные функции.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;+N баллов&amp;#039;&amp;#039;&amp;#039;. N = 4 * max(0, aver(1 - T&amp;lt;sub&amp;gt;tracer&amp;lt;/sub&amp;gt; / T&amp;lt;sub&amp;gt;callgrind&amp;lt;/sub&amp;gt;)) за обгон callgrind на предложенных тестах (постараемся выбрать максимально приближенные к реальности).&lt;/div&gt;</summary>
		<author><name>imported&gt;Rkovalev</name></author>
	</entry>
</feed>