SysFn69/ru

From KolibriOS wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Функция 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 - определить область данных для отладочных сообщений.

Параметры:

  • eax = 69 - номер функции
  • ebx = 0 - номер подфункции
  • ecx = указатель

Формат области данных:

  • +0: dword: N = размер буфера (не считая этого заголовка)
  • +4: dword: занято в буфере
  • +8: N*byte: буфер

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

  • функция не возвращает значения

Замечания:

  • Если поле размера отрицательно, буфер считается заблокированным и при поступлении нового сообщения система будет ждать. Для синхронизации обрамляйте всю работу с буфером операциями блокировки/разблокировки
neg [bufsize]
  • Данные в буфере трактуются как массив элементов переменной длины сообщений. Формат сообщения указан в общем описании.

Константы для регистров:

eax - SF_DEBUG (69)
ebx - SSF_SET_MESSAGE_AREA (0)

Подфункция 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-кольца.
  • Процесс должен быть загружен для отладки (как указано в общем описании).

Константы для регистров:

eax - SF_DEBUG (69)
ebx - SSF_GET_REGISTERS (1)

Подфункция 2 - установить состояние регистров отлаживаемого потока.

Параметры:

  • eax = 69 - номер функции
  • ebx = 2 - номер подфункции
  • ecx = идентификатор потока
  • edx = длина структуры контекста, должно быть 0x28=40 байт
  • esi = указатель на структуру контекста

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

  • функция не возвращает значения

Формат структуры контекста указан в описании подфункции 1.

Замечания:

  • Если поток выполняет код 0-кольца, устанавливается состояние регистров 3-кольца.
  • Процесс должен быть загружен для отладки (как указано в общем описании).

Константы для регистров:

eax - SF_DEBUG (69)
ebx - SSF_SET_REGISTERS (2)

Подфункция 3 - отключиться от отлаживаемого процесса.

Параметры:

  • eax = 69 - номер функции
  • ebx = 3 - номер подфункции
  • ecx = идентификатор

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

  • функция не возвращает значения

Замечания:

  • Если процесс был приостановлен, он возобновляет выполнение.

Константы для регистров:

eax - SF_DEBUG (69)
ebx - SSF_DETACH (3)

Подфункция 4 - приостановить поток.

Параметры:

  • eax = 69 - номер процесса
  • ebx = 4 - номер подфункции
  • ecx = идентификатор

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

  • функция не возвращает значения

Замечания:

  • Приостановить можно только те потоки, которые были запущены как отлаживаемые

Константы для регистров:

eax - SF_DEBUG (69)
ebx - SSF_SUSPEND (4)

Подфункция 5 - возобновить выполнение потока.

Параметры:

  • eax = 69 - номер функции
  • ebx = 5 - номер подфункции
  • ecx = идентификатор

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

  • функция не возвращает значения

Константы для регистров:

eax - SF_DEBUG (69)
ebx - SSF_RESUME (5)

Подфункция 6 - прочитать из памяти отлаживаемого процесса.

Параметры:

  • eax = 69 - номер функции
  • ebx = 6 - номер подфункции
  • ecx = идентификатор
  • edx = сколько байт читать
  • esi = адрес памяти отлаживаемого процесса
  • edi = указатель на буфер для данных

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

  • eax = -1 при ошибке (неверный PID или буфер)
  • иначе eax = число прочитанных байт (возможно, 0, если в esi слишком большое значение)

Замечания:

  • Процесс должен быть загружен для отладки (как указано в общем описании).

Константы для регистров:

eax - SF_DEBUG (69)
ebx - SSF_READ_MEMORY (6)

Подфункция 7 - записать в память отлаживаемого процесса.

Параметры:

  • eax = 69 - номер функции
  • ebx = 7 - номер подфункции
  • ecx = идентификатор
  • edx = сколько байт писать
  • esi = адрес памяти в отлаживаемом процессе
  • edi = указатель на данные

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

  • eax = -1 при ошибке (неверный PID или буфер)
  • иначе eax = число записанных байт (возможно, 0, если в esi слишком большое значение)

Замечания:

  • Процесс должен быть загружен для отладки (как указано в общем описании).

Константы для регистров:

eax - SF_DEBUG (69)
ebx - SSF_WRITE_MEMORY (7)

Подфункция 8 - завершить отлаживаемый поток.

Параметры:

  • eax = 69 - номер функции
  • ebx = 8 - номер подфункции
  • ecx = идентификатор

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

  • функция не возвращает значения

Замечания:

  • Процесс должен быть загружен для отладки (как указано в общем описании).
  • Функция аналогична подфункции 2 функции 18 с двумя отличиями: требуется выполнение первого замечания и принимается PID, а не номер слота.

Константы для регистров:

eax - SF_DEBUG (69)
ebx - SSF_TERMINATE (8)

Подфункция 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, о котором система сообщает отладчику.
  • Точка останова на запись и чтение/запись срабатывает после выполнения вызвавшей её инструкции.

Константы для регистров:

eax - SF_DEBUG (69)
ebx - SSF_DEFINE_BREAKPOINT (9)