Difference between revisions of "SysFn69/ru"

From KolibriOS wiki
Jump to navigation Jump to search
 
(11 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]
 
+
:* Данные в буфере трактуются как массив элементов переменной длины сообщений. Формат сообщения указан в общем описании.
''Возвращаемое значение'':
 
 
 
* функция не возвращает значения
 
 
 
''Замечания'':
 
  
* Если поле размера отрицательно, буфер считается заблокированным и при поступлении нового сообщения система будет ждать. Для синхронизации обрамляйте всю работу с буфером операциями блокировки/разблокировки neg    [bufsize]
+
'''Константы для регистров:'''
* Данные в буфере трактуются как массив элементов переменной длины сообщений. Формат сообщения указан в общем описании.
+
::eax - SF_DEBUG (69)
 +
::ebx - SSF_SET_MESSAGE_AREA (0)
  
 
=== Подфункция 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,
+
:* eax = -1 при ошибке (неверный PID или буфер)
    если в esi слишком большое значение)
+
:* иначе 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 слишком большое значение)
Замечания:
+
 
  * Процесс должен быть загружен для отладки (как указано в
+
''Замечания:''
    общем описании).
+
:* Процесс должен быть загружен для отладки (как указано в общем описании).