SysFn69/ru

From KolibriOS wiki
Revision as of 16:53, 9 April 2010 by Kogemyaka (talk | contribs) (Created page with ''''Функция 69 - отладка.''' Процесс может загрузить другой процесс как отлаживаемый установкой соот...')
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Функция 69 - отладка.

Процесс может загрузить другой процесс как отлаживаемый установкой соответствующего бита при вызове подфункции 7 функции 70. У процесса может быть только один отладчик; один процесс может отлаживать несколько разных. Система уведомляет отладчик о событиях, происходящих с отлаживаемым процессом. Сообщения записываются в буфер, определённый подфункцией 0.

Формат сообщения:

  • +0: dword: код сообщения
  • +4: dword: PID отлаживаемого процесса
  • +8: могут присутствовать дополнительные данные, определяемые кодом сообщения

Коды сообщений:

  • 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, в противном случае одно из
       * 00 = байт
       * 01 = слово
       * 11 = двойное слово
     * esi = адрес точки останова; должен быть выровнен
       соответственно длине (т.е. должен быть чётным для
       точек останова на слово, кратен 4 для двойного слова)
   * если старший бит установлен - сбросить точку останова

Возвращаемое значение:

 * eax = 0 - успешно
 * eax = 1 - ошибка во входных данных
 * eax = 2 - (зарезервировано, никогда не возвращается
   в текущей реализации) с этим индексом уже установлена
   глобальная точка останова

Замечания:

 * Процесс должен быть загружен для отладки (как указано в
   общем описании).
 * Аппаратные точки останова реализуются через DRx-регистры
   процессора, отсюда все ограничения.
 * Функция может переустановить ранее установленную ей же
   точку останова (никак не сообщая об этом).
   Ведите список установленных точек останова в отладчике.
 * Срабатывание точки останова заключается в генерировании
   отладочного исключения #DB, о котором система сообщает отладчику.
 * Точка останова на запись и чтение/запись срабатывает после
   выполнения вызвавшей её инструкции.