D3 Reference Manual

Index | Help

Поиск по страницам

Разделы / Unix / Использование отладчик монитора D3

Использование отладчик монитора D3

Инструмент восстановления системы после отказа, вызванного, например, отказом питания.

Отладчик монитора позволяет делать следующее:

  • Выводить на экран и изменять содержимое виртуальной памяти D3.
  • Выводить на экран и изменять содержимое "реальной" памяти (следует помнить о том, что "реальная" память - это, фактически, виртуальная память Unix).
  • Вызывать сброс (flush) памяти D3 на диск.
  • Выводить на экран и изменять состояние системных семафоров и устранять ситуации взаимоблокировки.
  • Получать доступ к блокированной системе.
  • Прекращать процессы, включая закрытие системы.
  • Отслеживать изменения области памяти.
  • Вставлять точки прерывания (break points) низкого уровня в виртуальный код.

Если вход в отладчик монитора происходит неожиданно, следует, прежде всего, попробовать ввести "g<return>", чтобы посмотреть, перезапускается ли система. Если нет, следует еще раз нажать на клавишу <BREAK> для изучения проблемы. Бывают случаи, когда вход в отладчик происходит по ошибке. Например, во время выполнения специальных продолжительных непрерываемых операций с лентой (типа перемотки) несколько нажатий на клавишу <BREAK> на линии 0 может привести к входу в отладчик монитора с кодом, обозначающим "трудный цикл" (tight loop). Это означает, что процесс начал выполнение "длинной" операции, и это не позволило ему обслужить клавишу <BREAK>.

Вход в отладчик

Вход в отладчик может произойти следующим образом:

  • Добровольно путем нажатия на клавишу <BREAK> во время процесса D3, запущенного с опцией "-D" для включения отладчика монитора.
  • Добровольно, если задана мониторная трассировка реальной или виртуальной памяти.
  • Добровольно путем установки мониторной точки прерывания в виртуальной памяти.
  • После аварийного прерывания работы системы. В случае серьезного аварийного прерывания происходит вход в отладчик. В этом случае пользователь не может продолжить работу.
  • После команды HALT монитора. Если выполнение процесса не может быть продолжено, для этого процесса выполняется команда HALT. Как правило, другие процессы это не затрагивает. Процесс, в котором произошла ошибка, входит в отладчик монитора и ждет. Следует ввести 'x' для вывода аппаратных регистров, записать их для передачи в службу поддержки, а затем попытаться перезапустить процесс с помощью команды 'g'. Если процесс вновь аварийно прерывается, следует попробовать "logoff" и/или "reset-user" с другого терминала прежде, чем пробовать 'g'. В случае еще одного отказа ввести 'q'.
  • После пятикратного нажатия на клавишу <BREAK> на линии 0 в течение менее 5-6 секунд, когда система не отвечает (застревание системы на длинной операции, взаимоблокировка семафоров или линия 0 в "коматозном" состоянии). Если семафор остается зависшим или процессор на непродолжительное время входит в "трудный цикл" (например, из-за искажения области ABS), процесс уже не отвечает и не способен выйти в виртуальный отладчик. Когда клавиша <BREAK> нажимается в пятый раз, обработчик сигналов проверяет, было ли нормально обработано первое прерывание. Если это не так, то происходит вход в отладчик. В сильно загруженной системе для входа в отладчик монитора может потребоваться несколько попыток выполнения последовательности <BREAK>.
  • После нажатия на клавишу <BREAK> на линии 0, когда она ожидает снятия системной блокировки (блокировки области свободного пространства, блокировки спулера и т.д.) в течение, примерно, более 5 секунд.

При входе в отладчик выдается сообщение с указанием причины, а также специальный символ приглашения в соответствии с таблицей, приведенной ниже:

Причина Сообщение Символ приглашения
Клавиша <BREAK> на линии с опцией "-D" <BRK> B!
Аварийное прерывание системы <ABT> A!
Мониторная трассировка <TRC> addr C!
Точка прерывания <BPT> bp# I!
HALT монитора <HLT> code H!
Клавиша <BREAK> на линии 0, "трудный цикл" <TLP> T!
Клавиша <BREAK> на линии 0, блокировка, установленная виртуальным уровнем <VLK> V!
Обращение к данным

Из отладчика монитора можно обратиться к данным как в виртуальном пространстве, так и в реальной памяти.

Спецификация данных

Местоположение данных задается в следующем формате:

address{;window}

Данные всегда выдаются в шестнадцатеричной форме.

Виртуальные адреса

Адрес элемента виртуальной пемяти может быть представлен в следующем формате:

[rreg|{.}fid][.|,]disp

Базовый FID - это содержимое регистра "reg" или идентификатор фрейма "fid". Идентификатор фрейма может быть указан в десятичной или шестнадцатеричной форме (в последнем случае идентификатору предшествует точка). Смещение может быть указано в десятичной системе (с предшествующей запятой) или шестнадцатеричной (с предшествующей точкой).

Например:

1.300   Смещение x'300' во фрейме 1. 
.12,16  Смещение 16 во фрейме x'12'.
r3.100  Смещение x'100' от адреса, на который указывает регистр 3.
Адреса элементов монитора

Адрес элемента монитора может быть представлен в одном из следующих форматов:

{ [l|g] }.hexaddress{ [+|-] {.}offset}
/symbol{ [+|-] {.}offset}

Префикс "l" используется для локальных данных, а "g" - для глобальных.

Вторая форма требует наличия файла "sdb.sym" в текущем справочнике или в "/usr/lib/D3". Как правило, этот файл с системой не поставляется. Он используется при разработках.

Необязательное смещение, которое прибавляется к базовому адресу или вычитается из него, может быть указано в десятичной системе или шестнадцатеричной (в последнем случае ему предщшествует точка).

Например:

.40000100    Абсолютный адрес.
l.0          Первый адрес в локальной области данных. 
g.100+.10    Смещение x'10' от адреса x'100' в области глобальных данных.
/sys.time    Адрес символа "sys.time".         
/tcb0+.100   Смещение +x'100' от адреса символа "tcb0".
Спецификация окна

Параметр "окна" (window) задает количество байтов для вывода. Параметр может быть указан в десятичной или шестнадцатеричной форме (в последнем случае ему предшествует точка). По умолчанию размер окна равен 4. Если используется символическое имя, размер окна устанавливается автоматически.

Изменение данных

Когда высвечивается окно данных, за ним следует символ "=" . "Ctrl-N" высвечивает следующее окно, если оно имеется, а "Ctrl-P" - предыдущее. В этом случае данные можно ввести следующим образом:

'char Вставка символа. Символьной строке предшествует апостроф. Символы в окне замещаются символами из входной строки слева направо.
.hex Вставка шестнадцатеричной строки. Шесьнадцатеричной строке предшествует точка. Она должна содержать только шестнадцатеричные символы и четное количество полубайтов. Символы в окне замещаются символами из входной строки слева направо.
{+|-}int Целое число. Окно дисплея рассматривается как числовой элемент. Окно должно быть длиной 1, 2 или 4 байта. Новое цлое число замещает все данные в окне.
Команды отладчика

Отладчик приглашает ввести команду путем вывода одного символа, за которым следует восклицательный знак (!). Команды завершаются символом возврата каретки.

!cmd Выполнение внешней команды cmd оболочкой unix.
? Вывод вспомогательной информации. Файл "/usr/lib/D3/sdb.help" Unix выдается постранично с помощью программы "pg".
ba{.}fid[.|,]disp
bao{.}offset
ba+{.}offset
b{n}
Добавление точки прерывания. Исполнительный адрес может быть указан различными способами:
  • Форма 1. Исполнительный адрес вычисляется путем добавления аргумента "fid" к "fid", заданному в команде "bo", а аргумента "disp" - к "disp", заданному в команде "bo" (см. ниже команду "bo" - break point offset).
  • Форма 2. Исполнительный адрес определяется параметром "fid", заданным в команде "bo", и прибавлением параметра "offset" к параметру "disp", заданному в команде "bo" (см. ниже команду "bo" - break point offset).
  • Форма 3. Исполнительный адрес определяется путем прибавления параметра "offset" к текущему значению R1.
  • Форма 4. Исполнительный адрес определяется путем прибавления "n * 4" к текущему значению R1. Если параметр "n" не задан, предполагается "1". Эта форма используется в архитектурах с постоянной длиной инструкций 4 байта (RISC).

Адрес должен быть на границе виртуального адреса. Точки прерывания являются глобальными для всей виртуальной машины. Как только точка прерывания устновлена, любой процесс, который на нее попадает, останавливается. Как только процесс попадает в точку прерывания, эта точка прерывания удаляется. Точка прерывания не должна устанавливаться во фрейме ABS, требующем записи на диск ("write required", т.е. во фрейме, в который произведена загрузка с помощью "mload"). Одновременно может быть установлено до трех точек прерывания. В случае успешной установки выдаются символ '+' и точка прерывания. Точки прерывания действительны до их удаления явным способом или до закрытия виртуальной машины.

bd[*|n] Удаление точек прерывания. Если используется параметр "*", удаляются все точки прерывания. Если задан парамер "n" в диапазоне от 0 до 2, удаляется указанная точка прерывания.
bl Вывод точек прерывания. Вывод точек прерывания монитора.
bo{.}fid[.|,]disp Смещение точки прерывания (break point offset). Указание идентификатора фрейма (fid) и смещения (disp), используемых командой "ba" для вычисления исполнительного адреса точки прерывания.
d? Вывод/изменение строки дампа (dump string), используемой по умолчанию. В случае аварийного прерывания работы системы (ошибки шины, нарушения сегментации и т.д.) система автоматически сбрасывает некоторые критические элементы в файл "/usr/tmp/ap.core". Просмотреть этот файл можно с помощью утилиты "apcrash". После вывода строку дампа можно изменить путем ввода ее нового варианта после символа '='. Строка дампа может содержать до 15 символов, односимвольные коды и аргументы. Значение каждого кода см. ниже в описании команды "d" монитора. Для каждого процесса строка дампа может быть разной. См. описание 'apcrash'.
dcommand.string Сброс оперативной памяти D3 в файл "/usr/tmp/ap.core" Unix. Результат дампа можно просмотреть с помощью утилиты "apcrash". Эту команду можно использовать после сбоя для сброса на диск выборочных элементов текущей оперативной памяти D3 в целях исследования проблемы. См. описание 'apcrash'.

Файл Unix можно сбросить на ленту с помощью такой утилиты Unix, как "tar" (например, "tar cv /usr/tmp/ap.core). Содержимое дампа определяется параметром "command.string", состоящим из односимвольных кодов, за некоторыми из которых следуют аргументы. Для упрощения чтения коды можно разделять запятыми. Посследовательность кодов в параметре "command.string" значения не имеет. Эта утилита для выполнения дампа автоматически вызывается в случае аварийного прерывания работы системы (ошибка шины, нарушение сегментации и т.д.) прежде, чем происходит вход в отладчик. Что именно сбрасывается на носитель, зависит от строки дампа (dump string), используемой по умолчанию (см. выше команду "d?" отладчика монитора). Действительны следующие коды:

a дамп "всего". Эта опция эквивалентна командной строке "l,g,b,p,r,c,0,f1". Описание каждого кода см. ниже.
0 дамп PCB текущего процесса. Если в этот момент блок PCB еще не придан, никакого действия не происходит.
b дамп таблицы буферов.
c дамп контекста текущего процесса. На носитель сбрасываются все фреймы, приписанные на данный момент к процессу, а также их цепные указатели вперед и назад.
f{.}n дамп фрейма с "fid", равным "n". Если указанный фрейм не находится в памяти, он считывается с диска.
g дамп глобольной памяти.
l дамп локальной (частной) памяти, исключая стек.
p дамп блоков "pib".
r дамп аппаратных регистров. Дамп регистров производится в том порядке, в котором они указаны в команде 'x' отладчика монитора, описанной далее в этом приложении.
s{.}start;[*|{.}size] дамп сегмента памяти коллективного пользования. Параметр "start" - это начальное смещение в байтах, а "size" - размер в килобайтах. Если вместо параметра размера используется "*", в дамп включается весь сегмент коллективной памяти, начиная с указанного смещения.
v{.}n дамп "n" виртуальных буферов.
e Попеременное включение/выключение отладчика (ON/OFF). Если отладчик выключен (OFF), вход в него при нажатии на клавишу <BREAK> не производится. Но на линии 0 в некоторых специальных случаях вход в отладчик происходит даже при выключенном отладчике (см. выше раздел, касающийся входа в отладчик).
f Сброс на диск модифицированной памяти. Все модифицированные фреймы памяти записываются на диск. Если возникает ошибка диска, на экран выдается символ "минус".
g{fid.disp} Пуск. Если аргументы отсутствуют, выполнение процесса возобновляется. Если заданы "fid" и смещение (fid.disp), управление передается указанной моде. "fid" указывается как смещение в текущей области "abs".
gl{-} Эта команда выдает на экран или удаляет текущие блокировки групп. Если опции отсутствуют, монитор печатает состояние глобального замка группы (с "G+" или "G-") и сканирует память в поиске каких-либо фреймов, помеченных как блокированные.

Для каждого блокированного фрейма монитор выводит на экран "fid", адрес записи в таблице буферов и всю информацию о блокировке группы, содержащуюся в самом фрейме. Сброс всех блокировок групп производится с помощью "gl-". Для сброса блокировки конкретной группы следует ввести "gl-{fid}". Следует отметить, что блокировки, стертые из отладчика монитора, могут все еще высвечиваться командой "list-locks". Такие блокировки следует удалять командой "clear-locks", когда виртуальный уровень становится доступным. Вообще, блокировки групп следует всегда снимать только командами TCL. Отладчик монитора может использоваться только в случае, если в доступе в систему отказано из-за того, что критичный файл (например, "mds,,") блокирован.

hfid Хэш-"fid". Эта команда выдает внутреннюю информацию о заданном FID, если он в памяти, или сообщение <NIM>, если в памяти его нет. Содержимое таблицы буферов может быть изменено. Ввод заканчивается следующим:
Возврат каретки возвращение в отладчик.
^N следующая запись в таблице буферов по указателю вперед в очереди старения (age queue).
^P предыдущая запись в таблице буферов по обратному указателю в очереди старения (age queue).
^F следующая запись таблицы буферов по указателю вперед в хэш-очереди (hash queue).
k{w}[f|pib] Уничтожение (kill). Прекращение процесса, связанного с заданным блоком PIB (pib), или, если используется с ключом "f", процесса сброса на диск (flusher) путем посылки туда сигнала SIGTERM. Ключ "w" ждет прекращения процесса в течение 10 секунд. Если процесс не прекращается, ему посылается процесс SIGKILL.

Следует отметить, что если процесс находится в отладчике монитора или застрял на семафоре, посылка в него сигнала SIGTERM не вызовет никакого эффекта до выхода из отладчика монитора или открытия семафора. Уничтожение процесса сброса на диск "('k{w}f') безусловно отключает все процессы и закрывает виртуальную машину.

lfid Вывод/изменение полей связи. Вывод в шестнадцатеричном виде полей-указателей фрейма с заданным "fid" в следующем формате:
nncf:frmn:frmp:npcf:clnk= 
nncf: количество следующих (непрерывных) фреймов.
frmn: указатель вперед.
frmp: указатель назад.
npcf: количество предыдущих (непрерывных) фреймов.
clnk: указатель на реальную память (core link).

После этого можно вводить новые значения полей через запятые. Чтобы поле осталось без изменения, вводится пустое поле.

m{*}monitor.address{;window} Вывод/изменение реальной памяти. Вывод в заданном окне содержимого реального адреса (см. выше раздел о спецификации адреса в мониторе). Если используется звездочка (*), адрес рассматривается как указатель и его содержимое используется как адрес монитора. Параметры длины и окна относятся к области, на которую указывает указатель.

Внимание: обращение к недействительному адресу вызывает нарушение сегментации или ошибку шины, в результате чего управление возвращается отладчику монитора с кодом непреодолимой ошибки. Абсолютных адресов настоятельно рекомендуется избегать, т.к. в разных реализациях систем они могут отличаться.

p{pib}{[.|,]offset}{;window} Вывод/Изменение блока PIB. Вывод байтов заданного окна из блока PIB, заданного параметром "pib" (или текущего блока PIB, если параметр "pib" не задан), начиная с заданного смещения.
q{!} Выход. Выход из отладчика монитора. Если символ "!" отсутствует, запрашивается подтверждение. При выходе из отладчика монитора процесс D3 прекращается. Если запрашивается подтверждение, необходимо ответить вводом символа "y" (без нажатия на клавишу возврата каретки).
rreg{.disp}{;window} Вывод данных через регистр. Вывод данных, на которые указывает регистр "reg" (от 0 до 15). Если задан параметр "disp", он прибавляется к смещению регистра.
c[*|sem]{[?|+|-]} Вывод/изменение состояния семафоров. Вывод ии изменение состояния семафора, заданного параметром "sem" (в диапазоне от 1 до 3) или всех семафоров, если используется ключ "*". Ключ "+" устанавливает (блокирует) заданный семафор. Ключ "-" сбрасывает (разблокирует) заданный семафор. Ключ "?" выдает информацию, как в нижеукаанном примере:
01: O=0023 W
02: 
03: O=001A 

где семафор 2 свободен; семафор 1 занят, принадлежит блоку PIB x'23', и, по крайней мере, один процесс ждет на этом семафоре (W); семафор 3 занят, принадлежит процессу x'1A', но ни один процесс на этом семафоре не ждет.

S{f}{h}{i}{m}{s}{w}{-} Сканирование битов таблицы буферов. Эта команда выводит и/или сбрасывает биты таблицы буферов по определенным критериям. Возможны следующие варианты:
f  Бит, на который делается ссылка.
h  Бит задержки (hold).
i  Бит чтения диска (iobusy). 
m  Бит временной блокировки памяти (temporary mlock).
s  Подавление подробного вывода. Вывод только итога.
w  Бит модифицированного фрейма (write-required)
-  Очистка вместо вывода

Пользователь задает искомые биты с помощью вышеуказанных опций. Когда бит обнаруживается, он выводится подобно тому, как это делает команда "h". С помощью команд "CTL-P" и "CTL-N" пользователь может продвигаться по списку выбранных записей в обратном или прямом направлении. Следует отметить, что счетчик правилен только в случае продвижения в прямом направлении.

t{[mmonitor.address|fid.disp]{;window}} Установка/отмена мониторной трассировки. Если аргумен отсутствуют, удаляется вся заданная мониторная трассировка. В качестве подтверждения удаления трассировки выдается символ "-". В противном случае команда задает трассировку области памяти, начиная с адреса, заданного параметром "monitor.address" или "fid.disp". Длина равна длине окна (window).

Если параметр окна не задан, используется длина окна по умолчанию или размер элемента монитора. Максимальный размер окна в адресе монитора равен 32767. Максимальный размер окна в виртуальном адресе равен размеру фрейма. В качестве подтверждения установки трассировки выдается символ "+". Отслеживаются изменения памяти при каждом виртуальном переходе (branch) или вызове (call) , а также все случаи отсутствия фрейма в памяти (frame fault). Если память изменяется, происходит вход в отладчик монитора. Когда выполняется трассировка виртуального адреса, фрейм "запирается" в памяти (т.е. не выводится на диск при свопинге). При отмене трассировки блокировка с фрейма снимается, если он не был блокирован в момент установки блокировки.

x Вывод аппаратных регистров. На первой строке высвечивается счетчик команд (program counter), за которым следует переменное количество 32-битных регистров. Информация зависит от реализации системы:
AIX:                Регистры r3 - r31.
SCO:                Регистры edi esi ebp esp ebx edx ecx eax 
HP-UX:              Регистры r2 - r30 
SINIX (MIPS):       Регистры r1 - r30 
SVS (ICL DRS6000):  Регистры %pc %npc %g1 %o %l %i 
y{!} Попеременное включение/выключение обхода блокировок. Если обход блокировок задан (ON), процесс, находящийся под управлением отладчика, обходит все блокировки в системе, мониторе, а также блокировки, установленные на виртуальном уровне. Использование этой опции требует чрезвычайной осторожности, т.к. в действующей системе она может нанести большой вред. Для безопасного использования этой опции все остальные процессы должны быть отключены или остановлены с помощью семафоров (см. ниже "Рекомендации по использованию"). Если символ "!" отсутствует, для обхода блокировок требуется подтверждение пользователя.
Рекомендации по использованию

В этом разделе показано использование отладчика монитора для выполнения некоторых необычных действий. Во избежании утери данных использовать отладчик монитора для снятия блокировки или удаления семафора следует чрезвычайно осторожно. В случаях блокировки системы настоятельно рекомендуется обращаться в службу поддержки пользователей.

Работа в режиме одного пользователя. Чтобы никто не работал, кроме одного терминала, можно сделать следующее:

На уровне интерпретатора команд (shell) привести в действие процесс D3 в отладчике.

ap  -D   <return>

После входа в отладчик монитора:

B!  s1+  <return>
B!  y  <return> и подтвердить путем ввода символа 'y'
B!  g  <return>

Теперь все процессы блокированы за исключением одного процесса, работающего под управлением отладчика, и процесса сброса на диск (flusher"). Это полезно при вводе модификаций ("заплат") в некоторые критические структуры виртуальноого кода (например, таблицы свободного пространства - "Overflow Table").

Для возобновления работы в многопользовательском режиме необходимо сделать следующее:

Прервать процесс с выходом в отладчик монитора нажатием на клавишу <BREAK> на линии с установленной блокировкой или нажатием на клавишу <BREAK> дважды на линии на линии 0 (т.к. линия щ должна быть заблокирована семафором).

Таким образом происходит вход в отладчик монитора.

B!  y  <return> для отмены игнорирования блокировок 
B!  s1-  <return>
B!  g  <return>

Теперь все процессы разблокированы.

Следующий шаг - устранение взаимоблокировки. Если процесс уничтожается системой, после него может остаться установленный семафор или виртуальная блокировка. Для снятия блокировки необходимо удостовериться в том, что в системе нет работающих пользователей, и сделать следующее:

На линии 0 нажать <BREAK> до шести раз менее, чем за 5 или 6 секунд. Процесс должен выпасть в отладчик монитора с сообщением <TLP> в случае "трудного цикла" (tight loop) или сообщением <VLK> в случае виртуальной блокировки. В зависимости от случая сделать следующее:

T!  f  <return>
T!  s*?  <return>

Запомнить номер установленного семафора и удалить его следующей командой:

T!  s  semnum  -  <return>
T!  g  <return>

Если блокировка установлена на виртуальном уровне, может потребоваться ее снятие. Выполнение этой операции при отсутствии необходимой информации о внутреннем состоянии системы может иметь катастрофические последствия, поэтому в теких случаях настоятельно рекомендуется обратиться в службу поддержки.

V!  f  <return>
V!  r15;2  <return>

Система выдаст число. Если это число не ноль, его следует обнулить. В противном случае существует другая проблема. Следует связаться с службой технической поддержки.

V!  r15;2 .001A=  0  <return>
V!  g  <return>

Виртуальная блокировка может быть также одной из блокировок, распространяющихся на всю систему. Для ее распознания можно сделать следующее:

V!  f  <return>
V!  1.100;2  <return>

Система выдаст число (как правило, 0). Ввести <ctrl> N 10 раз или делать это до тех пор, пока не появится нулевое значение. Если нулевое значение не появляется, это может означать наличие другой проблемы. Необходимо связаться со службой техничекой поддержки.

V!  1.100 .0000=  Ctrl N
V!  1.102 .001A=  0  <return>
V!  g  <return>

Виртуальная блокировка может быть и блокировкой отдельной записи (только в 6.1 и выше). Для распознания такой блокировки можно сделать следующее:

V!  1.15a;6  <return> <return>

Система должна выдать номер фрейма. Теперь ввести следующее:

V!  .(выданный перед этим номер фрейма).0;4 <return>

Система выдает 8-значное шестнадцатеричное число. Первые 4 цифры обозначают глобальную блокировку, а следующие 4 цифры - количество блокировок записей. Для обнуления и того, и другого следует ввести "0" в ответ на приглашение "=", а затем нажать на <return>.

Виртуальная блокировка может быть блокировкой группы (только в 6.1 и выше). Для идентификации сделать следующее:

V!  gl <return>

Если система печатает что-либо, кроме "G-", установлена блокировка групп. Для отмены этой блокировки сделать следующее:

V!  gl- <return>
V!  gl <return>

После последней команды система должна выдать "G-". Следует отметить, что виртуальный уровень может все еще сообщать об установленных блокировках, если используется команда "list-locks". Для исправления следует вернуться в TCL седующим образом:

V!  g <return>

Если система не выходит на приглашение TCL, это означает, что установлена какая-то другая блокировка, и в этом случае следует обратиться в службу технической поддержки. При появлении приглашения TCL ввести следующую команду:

:  clear-locks (g <return>

Подождать окончания выполнения команды "clear-locks", т.к. оно может быть задержано процессами, закончившимися аномально. После завершения блокировки групп должны быть сняты. Если обнаруживаются еще какие-либо взаимоблокировки, следует обратиться в службу технической поддержки.

Если зависает только линия 0, это может быть из-за случайного перехода этой линии в состояние "комы". Команда WHERE показывает FE или 7E в первых двух знаках поля статуса. Выполнение команды "logoff" с другого порта выведет линию 0 из состояния "комы". Или можно сделать следующее:

T!  p.0;1  <return>
T!  p.0;1 .7E=   .ff  <return>
T!  g  <return>

Разрешение отладчика на линии 0. Если линия 0 была запущена без опции "-D", попасть в отладчик монитора невозможно за исключением случая, когда имеется блокировка. Для разрешения отладчика выполнить следующую последовательность шагов (временно установить виртуальную блокировку, чтобы войти в отладчик, разрешить и запустить отладчик):

На уровне TCL:

:  debug  <return>
!  1.102;2  <return>
! 1.102;2=  -1  <return> Это устанавливает блокировку переполнения.
!  g  <return>.

Теперь линия 0 (и ВСЯ система) заблокирована. Подождать 5 секунд и нажать на <BREAK>. В результате произойдет вход в отладчик.

V!  1.102;2  <return>
V!  1.102;2 .FFFF=  0  <return>
V!  e  <return>
V!  g  <return>

Теперь отладчик монитора разрешен на линии 0.

Определение номера вашей линии. Для определения номера PIB, где работает отладчик, сделать следующее:

Войти в отладчик с помощью <break>.

B!  p.18;2  <return>

Система выдает шестнадцатеричный номер PIB +1

Перезапуск виртуального уровня после аварийного останова на ранней стадии начальной загрузки. Если загрузка виртуальной машины аварийно прерывается на ранней стадии (во время или сразу поле сообщения 'Diagnostic'), после исправления ошибки загрузку можно быстро возобновить следующим образом (линия 0 должна быть запущена с опцией "-D"):

!   Нажать на клавишу <BREAK> для входа в отладчик монитора.
B!  g3.0  <return>

В результате вновь появится сообщение ' Diagnostic ...', и возобновится загрузка.

Меры предосторожности

Процесс, запущенный с опцией "-D", имеет некоторые привилегии, неосторожное использование которых может привести к потере данных:

  • Доступ к виртуальной машине разрешается всегда - даже в случае, если установлена блокировка инициализации (initialization lock). В частности, пользовательский процесс может быть запущен в то время, когда линия 0 находится в процессе инициализации виртуальной машины. Следовательно, прежде, чем начинать процесс, следует убедиться в том, что линия 0 достигла, по крайней мере, стадии сообщения 'Diagnostics...'.
  • Процесс с привилегией отладчика может обойти все блокировки, включая виртуальные! При изменении структуры данных необходимо убедиться в том, что никто не обращается к виртуальной машине, или, еще лучше, установить семафор вышеуказанным способом во избежании одновременного доступа. По этой же причине в конкретный момент времени следует использовать отладчик только на одной линии.
  • Когда память оказывается полной, отладчик может аварийно прекратить работу с сообщением 'MEM FULL'. Следует произвести сброс на диск (flush) и пробовать заново до достижения желаемого результата.
  • Если система работает в режиме одного пользователя (с блокировкой, установленной командой "s1+") и задан обход блокировок, не следует пытаться закрыть систему с помощью команды "shutdown" TCL. Вместо этого следует войти в отладчик монитора на линии 0, выполнить сброс на диск (f) и выйти из отладчика (q). Таким образом все активные процессы будут прекращены.
  • При изменении виртуальной памяти с помощью отладчика полезно регулярно осуществлять сброс содержимого памяти на диск командой "f".