Разница между 1.14 и текущей версией PtraceTuto.
@@ -1,39 +1,41 @@
-
-- Принципы работы отладчиков
+= Принципы работы отладчиков
 
 
 Часто для того, чтобы разобраться почему код работает не так, программист прибегает к помощи
-отладчиков, однако, то как они устроены и каким образом действуют, известно далеко не всем. В этой
-статье будет дано краткое описание механизма отладки, который используется операционной системой Linux и приведён короткий пример его использования.
+отладчиков, однако как они устроены и каким образом действуют, известно далеко не всем. В этой
+заметке будет дано краткое описание механизма отладки, который используется операционной системой Linux и приведён короткий пример его использования.
+
+Для начала дадим пару неформальных определений.
 
-Для начала дадим неформальное определение.
 Отладчик — программа, с помощью которой можно подробно 
 отслеживать и изменять статус выполнения другой программы.
 
+Точка останова — «место» в коде отлаживаемого процесса, при обращении к которому произойдёт прерывание
+и информация об этом передастся отладчику.
+
 Типы Отладчиков:
-	* отладчики уровня ядра ОС — компонент ядра ОС, позволяющий отлаживать ОС и процессы. Для работы отладчик использует функционал, заложенный в процессор.
-	* отладчики приложений — пользовательская программа, которая позволяет отлаживать другие процессы. Для работы используют API-интерфейс, который предоставляет ядро ОС.
+	1 Отладчик уровня ядра ОС — компонент ядра ОС, позволяющий отлаживать ОС и процессы. Для работы отладчик использует функционал, заложенный в процессор.
+	1 Отладчик приложений — пользовательская программа, которая позволяет отлаживать другие процессы. Для работы используют API-интерфейс, который предоставляет ядро ОС.
+
 
+Сейчас мы сосредоточнимся на втором типе отладчиков
+и перечислим основные функции, необходимые им для работы:
+	1 возможность стартовать и останавливать отлаживаемый процесс.
+	1 возможность пошагового исполнения кода.
+	1 возможность читать и писать в произвольную область памяти отлаживаемого процесса.
+	1 чтение и изменение содержимого регистров процессора.
 
-Подробно остановимся на втором типе отладчиков, и попробуем разобраться, какой функционал необходимо предоставлять ядро ОС для их работы. Перечислим основные функции, необходимые отладчику:
-	* возможность стартовать и останавливать отлаживаемый процесс.
-	* возможность пошагового исполнения кода.
-	* возможность читать и писать в произвольную область памяти отлаживаемого процесса.
-	* чтение и изменение содержимого регистров процессора.
 
--- Системный вызов ptrace(2)
+- Системный вызов ptrace(2)
 
 В OC Linux весь отладочный функционал доступен с использованием системного вызова ptrace(2).
 
 Интерфейс системного вызова:
 
-----
-===
+==={c}
 long
-ptrace(enum __ptrace_request request , pid_t pid , void ∗addr , void ∗data);
+ptrace(enum __ptrace_request request , pid_t pid , void *addr , void *data);
 ===
-----
-
 
 Аргумент ''request'' определяет тип операции:
 будет ли это попытка начать отладку процесса,
@@ -44,8 +46,7 @@
 Начать отладку процесса можно двумя способами:
 	* C помощью запроса '''PTRACE_TRACEME''' текущий процесс будет отлаживаться его родителем. Любой сигнал, полученный текущим процессом, вызовет его остановку, а родительский процесс может быть оповещён об этом сигналом SIGCHLD. Затем родитель при помощи системного вызова wait(2) или подобного узнаёт идентификатор остановленного процесса. Заметим, что для этого типа запроса все остальные аргументы игнорируются.
 
-	* С помощью запроса '''PTRACE_ATTACH''' можно подключиться к уже существующему процессу,
-передав в ''pid'' его идентификатор.
+	* С помощью запроса '''PTRACE_ATTACH''' можно подключиться к уже существующему процессу, передав в ''pid'' его идентификатор.
 
 При успешном завершении всех типов запросов,
 за исключением '''PTRACE_PEEK*''',
@@ -55,7 +56,7 @@
 
 Кратко опишем некоторые типы запросов.
 
---- PTRACE_GETREGS, PTRACE_SETREGS, PTRACE_GETFPREGS , PTRACE_SETFPREGS
+-- PTRACE_GETREGS, PTRACE_SETREGS, PTRACE_GETFPREGS , PTRACE_SETFPREGS
 
 Получаем или изменяем основные регистры или регистры FPU.
 Указатель на структуру с регистрами передаётся в
@@ -64,9 +65,9 @@
 Для основных регистров используется структура
 ''struct user_regs_struct'',
 для регистров FPU ''struct user_fpregs_struct'' .
-Определения структур находятся в sys/user.h.
+Определения структур находятся в заголовке sys/user.h.
 
---- PTRACE_PEEK_DATA, PTRACE_PEEK_TEXT , PTRACE_POKE_DATA , PTRACE_POKE_TEXT
+-- PTRACE_PEEK_DATA, PTRACE_PEEK_TEXT , PTRACE_POKE_DATA , PTRACE_POKE_TEXT
 
 Получаем или изменяем данные в памяти исследуемого процесса
 по переданному в ''addr'' адресу.
@@ -75,14 +76,14 @@
 Так как -1 (0xffffffff)
 также может быть адресом,
 для проверки на ошибку необходимо дополнительно
-проверять значение '''errno''' .
+проверять значение errno(3) .
 
---- PTRACE_CONT
+-- PTRACE_CONT
 Продолжает выполнение остановленного процесса.
 Если ''data'' не ''NULL'' и не ''SIGSTOP'' ,
 значение интерпретируется как сигнал, который посылается процессу.
 
-* '''PTRACE_SINGLESTEP''' , '''PTRACE_SYSCALL'''
+-- PTRACE_SINGLESTEP, PTRACE_SYSCALL
 Продолжает выполнение остановленного процесса,
 как и в случае с 
 '''PTRACE_CONT''', но указывает,
@@ -92,7 +93,7 @@
 Аргумент ''data'' будет интерпретирован как и в случае с
 '''PTRACE_CONT'''.
 
---- PTRACE_DETACH
+-- PTRACE_DETACH
 
 Отменяет эффекты '''PTRACE_TRACEME''', '''PTRACE_ATTACH'''
 для процесса с указанным ''pid'',
@@ -107,9 +108,22 @@
 можно посмотреть в мануале ptrace(2).
 
 
--- Полезный софт, использующий ptrace(2)
+- Тестовая программа с использованием strace(2)
+
 
---- strace(1)
+Разберём простой пример использования ptrace(2). Наш тестовый отладчик будет следить за системными вызовами отлаживаемого приложения, печатать содержимое регистров перед системным вызовом и его возвращаемый статус.
+
+
+Код тестовой программы доступен [[https://vk.com/doc16487792_462035342?hash=de3c1b178a4a70c78e&dl=f3d2cb843ffdfd5657| по ссылке]].
+
+Содержимое архива:
+	* Makefile — мейкфайл, осуществляющий сборку всех исполняемых файлов.
+	* debugee.c — это код отлаживаемой программы,
+	* main.c — код тестового отладчика (собирается в исполняемый файл tracer).
+
+- Полезный cофт, использующий ptrace(2)
+
+-- strace(1)
 	
 Трассировщик системных вызовов,
 может быть очень полезен при первичной отладке чужого (или вашего) бинарника,
@@ -121,9 +135,9 @@
 $ strace ls
 ===
 
-В результате запуска программы на стандартный поток ошибок валится информация о системных вызовах, которые сделал ls
+В результате запуска программы на стандартный поток ошибок валится информация о системных вызовах, которые сделал ls.
 
-strace(1) позволяет осуществлять фильтрацию по типам системных вызовов или их именам с помощью опции -e, например:
+Strace(1) позволяет осуществлять фильтрацию по типам системных вызовов или их именам с помощью опции -e, например:
 
 ===
 $ strace -e trace=file sh -c ls
@@ -132,12 +146,21 @@
 отобразит все обращения к файлам, сделанные процессом sh
 
 
---- ltrace(1)
+-- ltrace(1)
 
 Трасировщик библиотечных функцкий.
 Программа работает аналогично strace(3).
 Однако помимо системных вызовов, показывает все вызовы функций из разделяемых библиотек.
 
---- gdb(1)
+-- gdb(1)
 
 Полноценный консольный отладчик.
+
+- Список литературы и помойка ссылок
+
+	1 [[https://blog.packagecloud.io/eng/2016/02/29/how-does-strace-work/ | Blogpost. How does strace works?]]
+	1 [[https://blog.packagecloud.io/eng/2016/03/14/how-does-ltrace-work/ | Blogpost. How does ltrace works?]]
+	1 [[https://wiki.osdev.org/Interrupt | OSDev interrupts info]]
+	1 [[https://wiki.osdev.org/Exceptions | OSDev exceptions list]]
+	1 [[https://wiki.osdev.org/System_Calls | OSDev. syscalls]]
+	1 Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3: System Programming Guide