Ru/api/kernel: Difference between revisions

From KolibriOS wiki
Jump to navigation Jump to search
Line 1,055: Line 1,055:
== Функция 69 - отладка. ==
== Функция 69 - отладка. ==


Процесс может загрузить другой процесс как отлаживаемый установкой
*Подфункция 0 - определить область данных для отладочных сообщений.
соответствующего бита при вызове подфункции 7 функции 70.
*Подфункция 1 - получить состояние регистров отлаживаемого потока.
У процесса может быть только один отладчик; один процесс может
*Подфункция 2 - установить состояние регистров отлаживаемого потока.
отлаживать несколько разных. Система уведомляет отладчик о событиях,
*Подфункция 3 - отключиться от отлаживаемого процесса.
происходящих с отлаживаемым процессом. Сообщения записываются в буфер,
*Подфункция 4 - приостановить поток.
определённый подфункцией 0.
*Подфункция 5 - возобновить выполнение потока.
Формат сообщения:
*Подфункция 6 - прочитать из памяти отлаживаемого процесса.
  * +0: dword: код сообщения
*Подфункция 7 - записать в память отлаживаемого процесса.
  * +4: dword: PID отлаживаемого процесса
*Подфункция 8 - завершить отлаживаемый поток.
  * +8: могут присутствовать дополнительные данные,
*Подфункция 9 - установить/снять аппаратную точку останова.
    определяемые кодом сообщения
Коды сообщений:
  * 1 = исключение
    * дополнительно передаётся dword-номер исключения
    * процесс приостановлен
  * 2 = процесс завершился
    * приходит при любом завершении: как через системную функцию -1,
      так и при "убийстве" любым другим процессом
      (в том числе самим отладчиком)
  * 3 = отладочное исключение int 1 = #DB
    * дополнительно передаётся dword-образ регистра DR6:
      * биты 0-3: выполнено условие соответствующей точки останова
        (установленной подфункцией 9)
      * бит 14: исключение произошло из-за режима
        пошаговой трассировки (установлен флаг TF)
    * процесс приостановлен
При завершении отладчика прибиваются все отлаживаемые процессы.
Если отладчик этого не хочет, он должен предварительно отключиться
подфункцией 3.
 
Все подфункции, кроме 4 и 5, применимы только к процессам/потокам,
запущенным из текущего функцией 70 с установленным флагом отладки.
Отладка многопоточных программ пока не поддерживается.
Полный список подфункций:
  * подфункция 0 - определить область данных для отладочных сообщений
  * подфункция 1 - получить состояние регистров отлаживаемого потока
  * подфункция 2 - установить состояние регистров отлаживаемого потока
  * подфункция 3 - отключиться от отлаживаемого процесса
  * подфункция 4 - приостановить отлаживаемый поток
  * подфункция 5 - возобновить выполнение отлаживаемого потока
  * подфункция 6 - прочитать из памяти отлаживаемого процесса
  * подфункция 7 - записать в память отлаживаемого процесса
  * подфункция 8 - завершить отлаживаемый поток
  * подфункция 9 - установить/снять аппаратную точку останова
 
 
=== Подфункция 0 - определить область данных для отладочных сообщений. ===
 
Параметры:
  * eax = 69 - номер функции
  * ebx = 0 - номер подфункции
  * ecx = указатель
Формат области данных:
  * +0: dword: N = размер буфера (не считая этого заголовка)
  * +4: dword: занято в буфере
  * +8: N*byte: буфер
Возвращаемое значение:
  * функция не возвращает значения
Замечания:
  * Если поле размера отрицательно, буфер считается заблокированным
    и при поступлении нового сообщения система будет ждать.
    Для синхронизации обрамляйте всю работу с буфером операциями
    блокировки/разблокировки
        neg    [bufsize]
  * Данные в буфере трактуются как массив элементов переменной длины -
    сообщений. Формат сообщения указан в общем описании.
 
 
=== Подфункция 1 - получить состояние регистров отлаживаемого потока. ===
 
Параметры:
  * eax = 69 - номер функции
  * ebx = 1 - номер подфункции
  * ecx = идентификатор потока
  * edx = длина структуры контекста, должно быть 0x28=40 байт
  * esi = указатель на структуру контекста
Возвращаемое значение:
  * функция не возвращает значения
Формат структуры контекста: (FPU пока не поддерживается)
  * +0: dword: eip
  * +4: dword: eflags
  * +8: dword: eax
  * +12 = +0xC: dword: ecx
  * +16 = +0x10: dword: edx
  * +20 = +0x14: dword: ebx
  * +24 = +0x18: dword: esp
  * +28 = +0x1C: dword: ebp
  * +32 = +0x20: dword: esi
  * +36 = +0x24: dword: edi
Замечания:
  * Если поток выполняет код 0-кольца, возвращается
    состояние регистров 3-кольца.
  * Процесс должен быть загружен для отладки (как указано в
    общем описании).
 
 
=== Подфункция 2 - установить состояние регистров отлаживаемого потока. ===
 
Параметры:
  * eax = 69 - номер функции
  * ebx = 2 - номер подфункции
  * ecx = идентификатор потока
  * edx = длина структуры контекста, должно быть 0x28=40 байт
  * esi = указатель на структуру контекста
Возвращаемое значение:
  * функция не возвращает значения
Формат структуры контекста указан в описании подфункции 1.
Замечания:
  * Если поток выполняет код 0-кольца, устанавливается
    состояние регистров 3-кольца.
  * Процесс должен быть загружен для отладки (как указано в
    общем описании).
 
 
=== Подфункция 3 - отключиться от отлаживаемого процесса. ===
 
Параметры:
  * eax = 69 - номер функции
  * ebx = 3 - номер подфункции
  * ecx = идентификатор
Возвращаемое значение:
  * функция не возвращает значения
Замечания:
  * Если процесс был приостановлен, он возобновляет выполнение.
 
 
=== Подфункция 4 - приостановить поток. ===
 
Параметры:
  * eax = 69 - номер процесса
  * ebx = 4 - номер подфункции
  * ecx = идентификатор
Возвращаемое значение:
  * функция не возвращает значения
 
 
=== Подфункция 5 - возобновить выполнение потока. ===
 
Параметры:
  * eax = 69 - номер функции
  * ebx = 5 - номер подфункции
  * ecx = идентификатор
Возвращаемое значение:
  * функция не возвращает значения
 
 
=== Подфункция 6 - прочитать из памяти отлаживаемого процесса. ===
 
Параметры:
  * eax = 69 - номер функции
  * ebx = 6 - номер подфункции
  * ecx = идентификатор
  * edx = сколько байт читать
  * esi = адрес памяти отлаживаемого процесса
  * edi = указатель на буфер для данных
Возвращаемое значение:
  * eax = -1 при ошибке (неверный PID или буфер)
  * иначе eax = число прочитанных байт (возможно, 0,
    если в esi слишком большое значение)
Замечания:
  * Процесс должен быть загружен для отладки (как указано в
    общем описании).
 
 
=== Подфункция 7 - записать в память отлаживаемого процесса. ===
 
Параметры:
  * eax = 69 - номер функции
  * ebx = 7 - номер подфункции
  * ecx = идентификатор
  * edx = сколько байт писать
  * esi = адрес памяти в отлаживаемом процессе
  * edi = указатель на данные
Возвращаемое значение:
  * eax = -1 при ошибке (неверный PID или буфер)
  * иначе eax = число записанных байт (возможно, 0,
    если в esi слишком большое значение)
Замечания:
  * Процесс должен быть загружен для отладки (как указано в
    общем описании).
 
 
=== Подфункция 8 - завершить отлаживаемый поток. ===
 
Параметры:
  * eax = 69 - номер функции
  * ebx = 8 - номер подфункции
  * ecx = идентификатор
Возвращаемое значение:
  * функция не возвращает значения
Замечания:
  * Процесс должен быть загружен для отладки (как указано в
    общем описании).
  * Функция аналогична подфункции 2 функции 18 с двумя отличиями:
    требуется выполнение первого замечания и принимается PID,
    а не номер слота.
 
 
=== Подфункция 9 - установить/снять аппаратную точку останова. ===
 
Параметры:
  * eax = 69 - номер функции
  * ebx = 9 - номер подфункции
  * ecx = идентификатор потока
  * dl = индекс точки останова, от 0 до 3 включительно
  * dh = флаги:
    * если старший бит сброшен - установить точку останова:
      * биты 0-1 - условие:
        * 00 = точка останова на выполнение
        * 01 = точка останова на запись
        * 11 = точка останова на чтение/запись
      * биты 2-3 - длина; для точек останова на исполнение должно быть
        00,