SysFn69/ru: Difference between revisions

From KolibriOS wiki
Jump to navigation Jump to search
 
(12 intermediate revisions by 3 users not shown)
Line 1: Line 1:
'''Функция 69 - отладка.'''
'''Функция 69''' - отладка.


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


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


* +0: dword: код сообщения
''Коды сообщений:''
* +4: dword: PID отлаживаемого процесса
:* 1 = исключение
* +8: могут присутствовать дополнительные данные, определяемые кодом сообщения
:** дополнительно передаётся dword-номер исключения
 
:** процесс приостановлен
''Коды сообщений'':
:* 2 = процесс завершился
 
:** приходит при любом завершении: как через системную функцию -1, так и при "убийстве" любым другим процессом (в том числе самим отладчиком)
* 1 = исключение
:* 3 = отладочное исключение int 1 = #DB
** дополнительно передаётся dword-номер исключения
:** дополнительно передаётся dword-образ регистра DR6:
** процесс приостановлен
:*** биты 0-3: выполнено условие соответствующей точки останова (установленной подфункцией 9)
 
:*** бит 14: исключение произошло из-за режима пошаговой трассировки (установлен флаг TF)
* 2 = процесс завершился
:** процесс приостановлен
** приходит при любом завершении: как через системную функцию -1, так и при "убийстве" любым другим процессом (в том числе самим отладчиком)
 
* 3 = отладочное исключение int 1 = #DB
** дополнительно передаётся dword-образ регистра DR6:
*** биты 0-3: выполнено условие соответствующей точки останова (установленной подфункцией 9)
*** бит 14: исключение произошло из-за режима пошаговой трассировки (установлен флаг TF)
** процесс приостановлен


При завершении отладчика прибиваются все отлаживаемые процессы.
При завершении отладчика прибиваются все отлаживаемые процессы.
Line 34: Line 30:


Все подфункции, кроме 4 и 5, применимы только к процессам/потокам,
Все подфункции, кроме 4 и 5, применимы только к процессам/потокам,
запущенным из текущего функцией 70 с установленным флагом отладки.
запущенным из текущего [[SysFn70/ru|функцией 70]] с установленным флагом отладки.
Отладка многопоточных программ пока не поддерживается.
Отладка многопоточных программ пока не поддерживается.


=== Подфункция 0 - определить область данных для отладочных сообщений. ===
=== Подфункция 0 - определить область данных для отладочных сообщений. ===


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


* eax = 69 - номер функции
''Формат области данных:''
* ebx = 0 - номер подфункции
:* +0: dword: N = размер буфера (не считая этого заголовка)
* ecx = указатель
:* +4: dword: занято в буфере
:* +8: N*byte: буфер


''Формат области данных'':
''Возвращаемое значение:''
:* функция не возвращает значения


* +0: dword: N = размер буфера (не считая этого заголовка)
''Замечания:''
* +4: dword: занято в буфере
:* Если поле размера отрицательно, буфер считается заблокированным и при поступлении нового сообщения система будет ждать. Для синхронизации обрамляйте всю работу с буфером операциями блокировки/разблокировки
* +8: N*byte: буфер
:neg [bufsize]
:* Данные в буфере трактуются как массив элементов переменной длины сообщений. Формат сообщения указан в общем описании.


''Возвращаемое значение'':
'''Константы для регистров:'''
 
::eax - SF_DEBUG (69)
* функция не возвращает значения
::ebx - SSF_SET_MESSAGE_AREA (0)
 
''Замечания'':
 
* Если поле размера отрицательно, буфер считается заблокированным и при поступлении нового сообщения система будет ждать. Для синхронизации обрамляйте всю работу с буфером операциями блокировки/разблокировки neg    [bufsize]
* Данные в буфере трактуются как массив элементов переменной длины сообщений. Формат сообщения указан в общем описании.


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


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


''Возвращаемое значение:''
''Возвращаемое значение:''
 
:* функция не возвращает значения
* функция не возвращает значения


''Формат структуры контекста: (FPU пока не поддерживается):''
''Формат структуры контекста: (FPU пока не поддерживается):''
 
:* +0: dword: eip
* +0: dword: eip
:* +4: dword: eflags
* +4: dword: eflags
:* +8: dword: eax
* +8: dword: eax
:* +12 = +0xC: dword: ecx
* +12 = +0xC: dword: ecx
:* +16 = +0x10: dword: edx
* +16 = +0x10: dword: edx
:* +20 = +0x14: dword: ebx
* +20 = +0x14: dword: ebx
:* +24 = +0x18: dword: esp
* +24 = +0x18: dword: esp
:* +28 = +0x1C: dword: ebp
* +28 = +0x1C: dword: ebp
:* +32 = +0x20: dword: esi
* +32 = +0x20: dword: esi
:* +36 = +0x24: dword: edi
* +36 = +0x24: dword: edi


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


* Если поток выполняет код 0-кольца, возвращается состояние регистров 3-кольца.
'''Константы для регистров:'''
* Процесс должен быть загружен для отладки (как указано в общем описании).
::eax - SF_DEBUG (69)
::ebx - SSF_GET_REGISTERS (1)


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


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


''Возвращаемое значение:''
''Возвращаемое значение:''
 
:* функция не возвращает значения
* функция не возвращает значения


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


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


* Если поток выполняет код 0-кольца, устанавливается состояние регистров 3-кольца.
'''Константы для регистров:'''
* Процесс должен быть загружен для отладки (как указано в общем описании).
::eax - SF_DEBUG (69)
::ebx - SSF_SET_REGISTERS (2)


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


Параметры:
''Параметры:''
  * eax = 69 - номер функции
:* eax = 69 - номер функции
  * ebx = 3 - номер подфункции
:* ebx = 3 - номер подфункции
  * ecx = идентификатор
:* ecx = идентификатор
Возвращаемое значение:
 
  * функция не возвращает значения
''Возвращаемое значение:''
Замечания:
:* функция не возвращает значения
  * Если процесс был приостановлен, он возобновляет выполнение.
 
''Замечания:''
:* Если процесс был приостановлен, он возобновляет выполнение.


'''Константы для регистров:'''
::eax - SF_DEBUG (69)
::ebx - SSF_DETACH (3)


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


Параметры:
''Параметры:''
  * eax = 69 - номер процесса
:* eax = 69 - номер процесса
  * ebx = 4 - номер подфункции
:* ebx = 4 - номер подфункции
  * ecx = идентификатор
:* ecx = идентификатор
Возвращаемое значение:
 
  * функция не возвращает значения
''Возвращаемое значение:''
:* функция не возвращает значения
 
''Замечания:''
:* Приостановить можно только те потоки, которые были запущены как отлаживаемые


'''Константы для регистров:'''
::eax - SF_DEBUG (69)
::ebx - SSF_SUSPEND (4)


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


Параметры:
''Параметры:''
  * eax = 69 - номер функции
:* eax = 69 - номер функции
  * ebx = 5 - номер подфункции
:* ebx = 5 - номер подфункции
  * ecx = идентификатор
:* ecx = идентификатор
Возвращаемое значение:
 
  * функция не возвращает значения
''Возвращаемое значение:''
:* функция не возвращает значения


'''Константы для регистров:'''
::eax - SF_DEBUG (69)
::ebx - SSF_RESUME (5)


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


Параметры:
''Параметры:''
  * eax = 69 - номер функции
:* eax = 69 - номер функции
  * ebx = 6 - номер подфункции
:* ebx = 6 - номер подфункции
  * ecx = идентификатор
:* ecx = идентификатор
  * edx = сколько байт читать
:* edx = сколько байт читать
  * esi = адрес памяти отлаживаемого процесса
:* esi = адрес памяти отлаживаемого процесса
  * edi = указатель на буфер для данных
:* edi = указатель на буфер для данных
Возвращаемое значение:
  * eax = -1 при ошибке (неверный PID или буфер)
  * иначе eax = число прочитанных байт (возможно, 0,
    если в esi слишком большое значение)
Замечания:
  * Процесс должен быть загружен для отладки (как указано в
    общем описании).


''Возвращаемое значение:''
:* eax = -1 при ошибке (неверный PID или буфер)
:* иначе eax = число прочитанных байт (возможно, 0, если в esi слишком большое значение)
''Замечания:''
:* Процесс должен быть загружен для отладки (как указано в общем описании).
'''Константы для регистров:'''
::eax - SF_DEBUG (69)
::ebx - SSF_READ_MEMORY (6)


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


Параметры:
''Параметры:''
  * eax = 69 - номер функции
:* eax = 69 - номер функции
  * ebx = 7 - номер подфункции
:* ebx = 7 - номер подфункции
  * ecx = идентификатор
:* ecx = идентификатор
  * edx = сколько байт писать
:* edx = сколько байт писать
  * esi = адрес памяти в отлаживаемом процессе
:* esi = адрес памяти в отлаживаемом процессе
  * edi = указатель на данные
:* edi = указатель на данные
Возвращаемое значение:
 
  * eax = -1 при ошибке (неверный PID или буфер)
''Возвращаемое значение:''
  * иначе eax = число записанных байт (возможно, 0,
:* eax = -1 при ошибке (неверный PID или буфер)
    если в esi слишком большое значение)
:* иначе eax = число записанных байт (возможно, 0, если в esi слишком большое значение)
Замечания:
  * Процесс должен быть загружен для отладки (как указано в
    общем описании).


''Замечания:''
:* Процесс должен быть загружен для отладки (как указано в общем описании).
'''Константы для регистров:'''
::eax - SF_DEBUG (69)
::ebx - SSF_WRITE_MEMORY (7)


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


Параметры:
''Параметры:''
  * eax = 69 - номер функции
:* eax = 69 - номер функции
  * ebx = 8 - номер подфункции
:* ebx = 8 - номер подфункции
  * ecx = идентификатор
:* ecx = идентификатор
Возвращаемое значение:
 
  * функция не возвращает значения
''Возвращаемое значение:''
Замечания:
:* функция не возвращает значения
  * Процесс должен быть загружен для отладки (как указано в
 
    общем описании).
''Замечания:''
  * Функция аналогична подфункции 2 функции 18 с двумя отличиями:
:* Процесс должен быть загружен для отладки (как указано в общем описании).
    требуется выполнение первого замечания и принимается PID,
:* Функция аналогична подфункции 2 [[SysFn18/ru|функции 18]] с двумя отличиями: требуется выполнение первого замечания и принимается PID, а не номер слота.
    а не номер слота.


'''Константы для регистров:'''
::eax - SF_DEBUG (69)
::ebx - SSF_TERMINATE (8)


=== Подфункция 9 - установить/снять аппаратную точку останова. ===
=== Подфункция 9 - установить/снять аппаратную точку останова. ===


Параметры:
''Параметры:''
  * eax = 69 - номер функции
:* eax = 69 - номер функции
  * ebx = 9 - номер подфункции
:* ebx = 9 - номер подфункции
  * ecx = идентификатор потока
:* ecx = идентификатор потока
  * dl = индекс точки останова, от 0 до 3 включительно
:* dl = индекс точки останова, от 0 до 3 включительно
  * dh = флаги:
:* dh = флаги:
    * если старший бит сброшен - установить точку останова:
:** если старший бит сброшен - установить точку останова:
      * биты 0-1 - условие:
:*** биты 0-1 - условие:
        * 00 = точка останова на выполнение
:**** 00 = точка останова на выполнение
        * 01 = точка останова на запись
:**** 01 = точка останова на запись
        * 11 = точка останова на чтение/запись
:**** 11 = точка останова на чтение/запись
      * биты 2-3 - длина; для точек останова на исполнение должно быть
:*** биты 2-3 - длина; для точек останова на исполнение должно быть 00, в противном случае одно из
        00, в противном случае одно из
:**** 00 = байт
        * 00 = байт
:**** 01 = слово
        * 01 = слово
:**** 11 = двойное слово
        * 11 = двойное слово
:*** esi = адрес точки останова; должен быть выровнен соответственно длине (т.е. должен быть чётным для точек останова на слово, кратен 4 для двойного слова)
      * esi = адрес точки останова; должен быть выровнен
:** если старший бит установлен - сбросить точку останова
        соответственно длине (т.е. должен быть чётным для
 
        точек останова на слово, кратен 4 для двойного слова)
''Возвращаемое значение:''
    * если старший бит установлен - сбросить точку останова
:* eax = 0 - успешно
Возвращаемое значение:
:* eax = 1 - ошибка во входных данных
  * eax = 0 - успешно
:* eax = 2 - (зарезервировано, никогда не возвращается в текущей реализации) с этим индексом уже установлена глобальная точка останова
  * eax = 1 - ошибка во входных данных
 
  * eax = 2 - (зарезервировано, никогда не возвращается
''Замечания:''
    в текущей реализации) с этим индексом уже установлена
:* Процесс должен быть загружен для отладки (как указано в общем описании).
    глобальная точка останова
:* Аппаратные точки останова реализуются через DRx-регистры процессора, отсюда все ограничения.
Замечания:
:* Функция может переустановить ранее установленную ей же точку останова (никак не сообщая об этом). Ведите список установленных точек останова в отладчике.
  * Процесс должен быть загружен для отладки (как указано в
:* Срабатывание точки останова заключается в генерировании отладочного исключения #DB, о котором система сообщает отладчику.
    общем описании).
:* Точка останова на запись и чтение/запись срабатывает после выполнения вызвавшей её инструкции.
  * Аппаратные точки останова реализуются через DRx-регистры
 
    процессора, отсюда все ограничения.
'''Константы для регистров:'''
  * Функция может переустановить ранее установленную ей же
::eax - SF_DEBUG (69)
    точку останова (никак не сообщая об этом).
::ebx - SSF_DEFINE_BREAKPOINT (9)
    Ведите список установленных точек останова в отладчике.
 
  * Срабатывание точки останова заключается в генерировании
{{System_functions}}
    отладочного исключения #DB, о котором система сообщает отладчику.
[[Category: SysCalls]]
  * Точка останова на запись и чтение/запись срабатывает после
    выполнения вызвавшей её инструкции.

Latest revision as of 17:27, 14 January 2021

Функция 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)