- дата последнего обновления 28.12.05 -
Оглавление
1 Назначение и возможности анализатора корректности MPI-программ
2 Компиляция , сбор трасс и запуск анализатора корректности
2.1 Компиляция и запуск на выполнение со сбором трасс
2.2 Запуск анализатора корректности MPI-программ
3.2 Параметры работы трассировщика
3.3 Результат работы трассировщика
4.1 Параметры работы анализатора
4.1.1 Выдача дополнительной информации
4.1.2 Контроль содержимого файлов с исходными текстами программы пользователя
4.1.3 Параметры, управляющие составом и количеством фиксируемых ошибок
4.1.4 Вывод информации об обнаруженных ошибках
4.2 Результат работы анализатора
4.2.1 Протокол работы анализатора
Приложение 1. Параметры трассировщика
Приложение 2. Параметры анализатора
1 Назначение и возможности анализатора корректности MPI-программ
Анализатор корректности MPI-программы предназначен для получения состояния задачи в целом и её отдельных процессов по трассировке задачи и обнаружения ситуаций, классифицируемых в качестве ошибочных. Анализатор корректности в дальнейшем будем называть анализатором трассировки или просто анализатором.
Анализатор непосредственно выявляет не ошибки программиста, а ситуации, являющиеся их проявлением (ошибочные ситуации), которые, краткости ради, именуются ошибками.
Ситуации, отслеживаемые анализатором
(в скобках - краткие названия ситуаций, используемые анализатором).
1. Авост в каком-либо процессе задачи (abend).
2. Принудительное снятие задачи (предполагается, прежде всего, снятие задачи пользователем нажатием клавиш Ctrl+C; abort).
3. Обращение к MPI-функции без возврата из неё (incomplete call).
Для всех операций типа “точка-точка”.
4. Незавершённая передача: невозврат из функции старта передачи или неблокирующая передача без последующего Wait или успешного Test (unfinished send).
5. Передача, которой не удалось поставить в соответствие операцию приёма (nonpaired send).
6. Незавершённый приём: невозврат из функции старта приёма или неблокирующий приём без последующего Wait или успешного Test (unfinished recv).
7. Приём, которому не удалось поставить в соответствие операцию передачи (nonpaired recv).
8. Неосвобождённый пассивный запрос (nonfreed request).
9. Недопустимое пересечение буфера приёма или передачи запускаемой операции с буфером приёма или передачи какой-либо уже запущенной неблокирующей операции (overlapping).
10. Пересечение буферов передачи и приёма в функции MPI_Sendrecv (overlapping).
11. Несовпадение контрольной суммы буфера неблокирующей передачи, подсчитанной при её запуске, с контрольной суммой, подсчитанной при завершении передачи (send checksum).
12. Несовпадение контрольной суммы буфера передачи с контрольной суммой буфера приёма (recv checksum).
13. Несовпадение длин посылаемого и принимаемого сообщений (incorrect send size – если длина посылаемого сообщения меньше длины буфера приёма, wrong send size - если длина посылаемого сообщения больше длины буфера приёма).
14. Взаимно недопустимые (несогласованные) типы данных в операциях передачи и приёма (wrong data type). Для производных типов проверяется согласованность соответствующих элементарных типов.
15. Освобождение с помощью функции MPI_Request_free запроса незавершённой неблокирующей операции (предупреждение nonpersistent request free - для непостоянного запроса и ошибка wrong request free – для persistent).
16. Прерывание неблокирующей операции типа “точка-точка” с помощью функции MPI_Cancel (предупреждение request cancel).
Для коллективных операций.
17. Не полностью запущенная коллективная операция (не все процессы коммуникатора запустили операцию; incomplete gop).
18. Незавершённая коллективная операция (все процессы коммуникатора запустили операцию, но не все по какой-либо причине её завершили; unfinished gop).
19. Недопустимое пересечение буфера передачи или приёма с буфером передачи или приёма ранее запущенной неблокирующей операции (overlapping).
20. Пересечение буфера передачи с буфером приёма (или их частей), взаимное пересечение частей буфера передачи, взаимное пересечение частей буфера приёма (overlapping).
21. Несовпадение длин посылаемого и принимаемого сообщений (incorrect recv size, wrong recv size).
22. Неверная контрольная сумма приёма (recv checksum).
23. Взаимно недопустимые типы данных на каком-либо принимающем процессе и на соответствующем ему посылающем (wrong data type).
24. Несовпадение кодов редукционной операции хотя бы на двух участвующих в ней процессах (diff reductions).
25. Задание пользователем разных root в разных процессах-участниках коллективных операций MPI_Bcast, MPI_Gather, MPI_Gatherv, MPI_Scatter, MPI_Scatterv и MPI_Reduce (wrong root process).
Дедлоки и “зависания” (для всех операций типа “точка-точка” и всех коллективных операций).
Пояснение.
Пусть {Pi} (i=1,n; n > 1) - последовательность различных номеров MPI-процессов (Pk≠Pm при k≠m). Пусть также каждый i-й процесс закрыт при обращении к MPI-функции, условия выполнения которой не обеспечены (i+1)-м процессом (i < n). Тогда последовательность {Pi} будем называть зависанием, если процесс Pn по какой-либо причине завершился, и дедлоком, если процесс Pn закрыт при обращении к MPI-функции, условия выполнения которой не обеспечены процессом P0 (дедлок - это цикл (cycle) на графе незавершённых межпроцессных взаимодействий, завершение которых стало невозможным в силу образования этого цикла). То есть, все тупиковые ситуации разделены на зависания и дедлоки (хотя в расширенном понимании зависания дедлок является его частным случаем).
Если хотя бы один процесс последовательности {Pi} не закрыт, но мог быть закрыт при некоторых условиях взаимодействия задачи со средой её выполнения, то зависание или дедлок называются потенциальными (в отличие от реальных зависаний или дедлоков, в действительности осуществившихся при выполнении задачи).
26. Потенциальное зависание (не образующая цикла цепочка потенциально или реально “зависших” процессов, последний из которых по какой-либо причине завершился, а среди остальных имеется хотя бы один потенциально “зависший”; potential hang-up).
27. Реальное зависание (цепочка действительно “зависших” процессов, последний из которых завершился; real hang-up).
28. Потенциальный дедлок (цикл потенциально или реально “зависших” процессов, среди которых имеется хотя бы один потенциально “зависший”; potential deadlock).
29. Реальный дедлок (цикл действительно “зависших” процессов; real deadlock).
Замечание. Пункты 9, 10, 19 и 20 реализованы только для предопределённых типов данных, а пункт 24 – только для предопределённых редукционных операций.
2 Компиляция, сбор трасс и запуск анализатора корректности
2.1 Компиляция и запуск на выполнение со сбором трасс
Для компиляции программы и получения выполняемого файла необходимо использовать команды:
dtcc, dtf77, dtf90 вместо
mpicc, mpif77, mpif90.
Эти новые команды обеспечивают линковку программы с трассировщиком, который осуществляет накопление трасс.
Запуск программы на выполнение со сбором трасс осуществляется командой
dtrun.
Эта команда имеет те же параметры, что и стандартная команда mpirun.
При запуске задачи командная строка может быть дополнена параметрами:
-stderrf <имя файла> - задает имя файла для перенаправления потока stderr;
-stdoutf <имя файла> - задает имя файла для перенаправления потока stdout.
Файлы создаются в той же директории, что и трассы.
В поток stderr трассировщик выводит все сообщения о своём функционировании и об обнаруженных в программе ошибках.
Если необходимо запускать программу с параметрами, отличающимися от стандартных, надо с помощью команды dtpar загрузить в текущую директорию файлы с параметрами отладки (файлы tracer.par, tran.par) и изменить в них нужные параметры.
Параметры, управляющие работой трассировщика, находятся в файле tracer.par и описаны в п.3.2 этой инструкции.
2.2 Запуск анализатора корректности MPI-программ
Анализатор запускается пользователем после завершения выполнения задачи в директории с накопленными трассами. Запуск анализатора корректности осуществляется командой:
dtan <task>
где:
task - имя выполняемого файла без расширения.
Результаты анализа записываются в файл с именем <task>.tran.
Параметры, управляющие работой анализатора, находятся в файле tran.par и описаны в п.4.1 этой инструкции.
3 Трассировщик
3.1 Назначение и возможности
При выполнении программы пользователя трассировщик накапливает информацию об обращениях к функциям и параметрах этих обращений, о созданных задачей коммуникаторах, типах данных, стеках адресов возврата из процедур и т. д.
Кроме этого при сборе трассы осуществляется динамический анализ обращений к MPI-функциям и выдача сообщений об ошибках, которые могут помешать работе трассировщика. Например, во всех функциях, имеющих параметром коммуникатор, проверяется его существование.
3.2 Параметры работы трассировщика
Функционирование трассировщика управляется параметрами, содержащимися в файле параметров tracer.par.
Если необходимо запускать программу с параметрами, отличающимися от стандартных, то надо с помощью команды dtpar загрузить в текущую директорию файл с параметрами трассировщика (tracer.par) и изменить в нем нужные параметры.
Пользователь может управлять работой трассировщика при помощи параметров MaxTraceSize, ShortTrace, UserStackSize.
Параметры MaxTraceSize и ShortTrace позволяют пользователю увеличить размер трасс, если для этого есть пространство, либо сократить размер трасс, если пространства нет. Некоторое сокращение трасс трассировщик осуществляет всегда. Так для функций MPI_Testxxxx и функции MPI_Iprobe трассируются: первое обращение к функции, успешное и каждое 1000-е. Параметр UserStackSize управляет длиной стека адресов возврата из процедур. Если глубина вложенности процедур превышает заданное значение, то необходимо увеличить значение UserStackSize.
Описание параметров:
MaxTraceSize |
- |
параметр задает максимальный размер файлов трассировки в мегабайтах. Стандартное значение параметра равно 500. Если размер трассировки процесса превысит значение MaxTraceSize / <число процессов>, то трассировка процесса будет остановлена. Если значение параметра MaxTraceSize задано нулевым, то контроль размера трассировки не осуществляется. |
ShortTrace |
- |
параметр задает признак сокращенной трассировки. При сокращённой трассировке не трассируются MPI-функции, обращение к которым не влияет на состав ошибок, обнаруживаемых анализатором трассировки (например, MPI_Wtime, MPI_Comm_size, MPI_Comm_rank и т. д.). Стандартное значение параметра равно нулю – трассируются все MPI-функции. Ненулевое значение параметра - признак сокращенной трассировки. |
UserStackSize |
- |
параметр задает максимальный размер стека адресов возврата из процедур, сохраняемого трассировщиком. Стандартное значение параметра равно 4. |
Если трассировщику не удаётся открыть файл параметров в текущей директории, то в поток stderr выводится соответствующее предупреждение, а выполнение программы под управлением трассировщика продолжается со стандартными значениями параметров.
3.3 Результат работы трассировщика
По завершению задачи (нормальному или аварийному) в текущей директории появятся следующие файлы:
-
Файлы с трассировкой обращений к MPI-функциям (файлы с именами <имя задачи>.<номер процесса>.trc). Число таких файлов равно числу MPI-процессов задачи.
-
Файл с описаниями трассировщика (<имя задачи>.dcl.trc). Данный файл содержит общие для всех процессов описания коммуникаторов, описания ссылок на исходные тексты программы пользователя, значения констант и переменных MPI и другую информацию.
Файлы трассировки от предыдущих запусков программы уничтожаются в начале функционирования трассировщика.
Все сообщения о своей работе, об ошибках, обнаруженных во время сбора трасс, трассировщик направляет в поток stderr. Эта информация очень важна для пользователя. Рекомендуется проанализировать сообщения трассировщика прежде, чем запускать анализатор корректности. Поток stderr может выдаваться на экран, может перенаправляться в файл, указанный при запуске задачи на счет (см. п 2.1). На некоторых машинах (например, на МВС-1000, МВС-15000) для каждого запуска задачи создается своя директория, а в ней, в свою очередь, файл с именем errors для потока stderr и файл - output для потока stdout.
Все сообщения трассировщика начинаются с "Dynamic analyzer" или с "***Dynamic analyzer". Если такого текста нет в начале сообщения, то сообщение не имеет никакого отношения к работе трассировщика.
Сообщение о нормальном завершении работы трассировщика имеет вид :
Dynamic analyzer : tracing successfully completed in < имя директории>
Dynamic analyzer : <имя задачи> task time = <время>
При получении другого сообщения необходимо разобраться с причиной авоста трассировщика, прежде, чем запускать анализатор корректности.
4 Анализатор
4.1 Параметры работы анализатора
Функционирование анализатора управляется параметрами, содержащимися в файле параметров tran.par.
Если необходимо запускать программу с параметрами, отличающимися от стандартных, то надо с помощью команды dtpar загрузить в текущую директорию файл с параметрами анализатора(tran.par) и изменить в нем нужные параметры.
Эти параметры дают пользователю возможность выдать дополнительную информацию для поиска ошибки или анализа ситуации, сократить длину протокола.
Если анализатору не удаётся открыть файл параметров в текущей директории, то он работает со стандартными значениями параметров.
4.1.1 Выдача дополнительной информации
Выдача определений точек в исходных текстах программы и коммуникаторов может помочь найти ошибку в программе. Что это за точки?
Любому обращению к MPI-функции соответствует стек вызовов функций, вершиной которого является данное обращение. Для каждого вызова функции стек содержит ссылку на соответствующую строку исходного текста программы - имя файла с исходным текстом и номер оператора в нем. Этот стек фактически является описанием некоторой точки программы, в которой произошло обращение к MPI-функции. Каждой такой точке, которой соответствует свой стек вызовов функций, приписан некоторый номер (SRC).
Если стек выдается не весь, то это значит, что нужно увеличить значение параметра UserStackSize (параметр трассировщика).
Параметр анализатора DeclPrint управляет выдачей этой информации. Если значение параметра установить равным 1, то в протоколе анализатора появляется раздел – scanning declarations c определениями точек и коммуникаторов.
4.1.2 Контроль содержимого файлов с исходными текстами программы пользователя
Наличие в файле с исходным текстом символа ‘\r’ (перевод строки), не составляющего пару с символом конца строки ‘\n’ (т. е. пару <‘\r’’\n’>), может привести к различному разбиению файла на строки разными компиляторами. Кроме того, различные редакторы текстов по-разному реагируют на отдельные символы ‘\r’ при отображении файла на экран монитора. В результате строки исходного текста программы будут помещаться в протокол анализатора неверно (со сдвигами по тексту).
Чтобы исключить неоднозначную нумерацию строк различными компиляторами, анализатор контролирует исходные тексты программы пользователя (если они ему доступны). Этот контроль управляется параметром запуска SrcFileCheckingCode, который может принимать значения:
0 |
- |
не проверять файлы с исходным текстом программы пользователя; |
1 |
- |
проверка с выводом предупреждения в поток сообщений об ошибках и продолжением работы (при обнаружении некорректного символа ‘\r’); |
2 |
- |
проверка с выводом сообщения об ошибке и завершением работы (стандартное значение); |
3 |
- |
проверка с выводом сообщения об ошибке и завершением работы, а также исправлением файлов с некорректным символом ‘\r’. |
При обнаружении анализатором в файлах некорректных символов ‘\r’ их необходимо исключить (если анализатор не сделал это самостоятельно), перекомпилировать и перезапустить программу, а затем повторить анализ.
4.1.3 Параметры, управляющие составом и количеством фиксируемых ошибок
Число ошибок и предупреждений, обнаруживаемых анализатором, ограничено для каждого процесса значением параметра запуска MaxAnalysisErrorNumber. Этим же параметром ограничено число выявляемых коллективных ошибок и предупреждений. Если число ошибок и предупреждений превысит значение, заданное параметром MaxAnalysisErrorNumber, в протокол анализатора будет выведено соответствующее сообщение.
SendSizeWarning |
- |
ненулевой признак фиксации ошибки (предупреждения), если длина посылаемого сообщения меньше длины принимаемого. Стандартное значение этого параметра равно 1. |
DeadlockSendSize |
- |
длина посылаемого сообщения, начиная с которой send рассматривается как причина потенциального дедлока или зависания. При отрицательном значении этого параметра все операции send, вне зависимости от длины передаваемого сообщения, считаются дедлокобезопасными. Стандартное значение параметра DeadlockSendSize равно нулю. |
4.1.4 Вывод информации об обнаруженных ошибках
Число выводимых в протокол ошибок ограничивается следующими параметрами:
MaxErrorPrint |
- |
максимальное число выводимых в протокол ошибок, имеющих один и тот же тип и один и тот же номер точки (SRC) в исходных текстах. При отрицательном значении этого параметра число выводимых ошибок не ограничивается. Стандартное значение параметра MaxErrorPrint равно 20. Параметр не ограничивает число выводимых в протокол дедлоков и зависаний. |
MaxDeadlockPrint |
- |
максимальное число выводимых в протокол потенциальных дедлоков и зависаний. При отрицательном значении этого параметра число выводимых в протокол потенциальных дедлоков и зависаний не ограничивается. Стандартное значение параметра MaxDeadlockPrint равно 30. |
4.2 Результат работы анализатора
4.2.1 Протокол работы анализатора
Результаты анализа выводятся в специально предназначенный для этого текстовый файл, называемый протоколом анализатора. В него выводятся:
1. Головная таблица, содержащая:
· число процессов задачи;
· числа успешно, авостно и принудительно завершившихся процессов;
· число ошибок и предупреждений в задаче;
· число незавершённых операций send и число незавершённых операций receive.
2. Сurrent Function. Таблица c именами различных текущих MPI-функций (к которым были последние обращения), содержащая для каждой функции:
· число процессов, обратившихся к ней;
· число различных точек в исходных текстах программы, последнее обращение в которых было к этой функции.
3. Current source code points(src). Таблица различных текущих выполняемых точек в исходных текстах программы, содержащая для каждой точки:
· номер строки и имя файла;
· число процессов с данной текущей точкой выполнения;
· имя MPI-функции, к которой произошло обращение в данной точке.
4. All errors/warnings. Таблица обнаруженных ошибок, содержащая для каждого типа ошибки:
· краткое название ошибки;
· важность ошибки (собственно ошибка или предупреждение);
· число найденных ошибок данного типа;
· число процессов, в которых произошла ошибка данного типа;
· число различных точек в исходных текстах программы, в которых произошла ошибка данного типа.
5. Source code points of all errors/warnings. Таблица различных точек в исходных текстах программы, в которых произошли ошибки (любые). Для каждой такой точки таблица содержит:
· номер строки и имя файла;
· число процессов, при выполнении которых в данной точке произошли ошибки;
· имя MPI-функции, к которой произошло обращение в данной точке.
6. Source code points of <ошибка>. Таблица, аналогичная таблице 5, выдается для каждой ошибки.
7. Task function statistics. Статистики обращений к MPI-функциям.
8. State of processes. Состояние каждого процесса представлено отдельной таблицей, которая для каждого процесса содержит:
· Proc - номер процесса;
· Term - тип завершения процесса (нормальное, авостное или принудительное завершение);
· Nerr - число ошибок ;
· Nwarn - число предупреждений;
· Nprecv, NPsend - число незавершённых операций receive и число незавершённых операций send;
· Nsend, Nrecv, Ngop - число операций send, число операций receive и число коллективных операций;
· имя текущей MPI-функции;
· номер строки и имя файла точки завершения процесса;
· число прохождений через точку завершения процесса (кратность точки завершения);
· proc time - время работы процесса;
· Статистика обращений к MPI-функциям;
· фрагмент исходного текста программы, соответствующий точке завершения;
· стек обращений к функциям для точки завершения (если длина стека в этой точке больше 1).
9. Errors and warnings. Вывод информации об обнаруженных ошибках.
Все обнаруженные анализатором ошибки, кроме дедлоков и зависаний, выводятся в протокол отдельно для каждого процесса в порядке их возникновения.
Для каждой найденной ошибки выводится:
· краткое название ошибки;
· номер процесса, при выполнении которого произошла ошибка;
· имя MPI-функции, при обращении к которой произошла ошибка;
· номер строки и имя файла точки, в которой произошла ошибка;
· число прохождений через точку, в которой произошла ошибка (кратность точки);
· фрагмент исходного текста программы, соответствующий точке, в которой произошла ошибка;
· информация о коммуникаторе (если ошибка связана с передачей сообщений);
· стек обращений к функциям для точки, в которой произошла ошибка (если длина стека в этой точке больше 1);
· совокупность фрагментов трассировки, каждый из которых непосредственно или косвенно связан с ошибкой; порядковый номер в трассировке каждого события при этом заканчивается символом “!”, если событие является “криминальным” (событием, с которым связывается ошибка), или символом “i”, если событие является информационным (т. е. выводимым для лучшего понимания ситуации).
Кроме того, для каждого типа ошибки может выводиться специфическая для него информация: длина сообщения в байтах, тег, имя типа данных и т. д.
10. Potential deadlocks and hang-ups. Информация о дедлоках и зависаниях (сначала выводится информация о реальных дедлоках и зависаниях, затем - о потенциальных).
4.2.2 Сообщения анализатора
Ошибки при работе анализатора (противоречия в трассировке, неудачные открытия файлов, нехватка памяти и т. д.) выводятся в поток сообщений об ошибках. Сообщения анализатора начинаются с текста: “ *** Analyzer err:”
В процессе работы анализатор выдает название этапа работы и прогресс времени его выполнения.
Основные этапы работы анализатора:
1. Инициализация анализатора, чтение и начальное преобразование трассировки (Analyzer initialization and trace reading);
2. Приведение сокращённой трассировки к виду, пригодному для дальнейшей обработки (Trace reconstruction);
3. Предварительная обработка трассировки перед поиском ошибок (Analysis preparation);
4. Спаривание операций типа “точка-точка” и стыковка коллективных операций (Event reference creation);
5. Обнаружение всех ошибок, кроме дедлоков и зависаний (Error detection);
6. Обнаружение потенциальных и реальных дедлоков и зависаний (Deadlock detection);
7. Вывод в протокол состояния задачи и процессов и информации о всех ошибках, кроме дедлоков и зависаний (Task state and error printing);
8. Вывод в протокол информации о найденных дедлоках и зависаниях (Deadlock printing);
9. Чтение результатов анализа, записанных ранее в трассировку, и подготовка её к обработке визуализатором (Error reading);
10. Вывод в протокол трассировки в терминах обращений к MPI-функциям и выходов из них (Trace printing).
Приложение 1. Параметры трассировщика
MaxTraceSize |
- |
параметр задает максимальный размер файлов трассировки в мегабайтах. Стандартное значение параметра равно 500. Если размер трассировки процесса превысит значение MaxTraceSize / <число процессов>, то трассировка процесса будет остановлена. Если значение параметра MaxTraceize задано нулевым, то контроль размера трассировки не осуществляется. |
ShortTrace |
- |
параметр задает признак сокращенной трассировки. При сокращённой трассировке не трассируются MPI-функции, обращение к которым не влияет на состав ошибок, обнаруживаемых анализатором трассировки (например, MPI_Wtime, MPI_Comm_size, MPI_Comm_rank и т. д.). Стандартное значение параметра равно нулю – трассируются все MPI-функции. Ненулевое значение параметра - признак сокращенной трассировки. |
UserStackSize |
- |
параметр задает максимальный размер стека адресов возврата из процедур, сохраняемого трассировщиком. Стандартное значение параметра равно 4. |
Приложение 2. Параметры анализатора
DeclPrint |
- |
ненулевой признак вывода определений точек в исходных текстах программы пользователя и коммуникаторов. Стандартное значение этого параметра равно 0. |
SrcFileCheckingCode |
- |
контроль параметров: 0 - не проверять файлы с исходным текстом программы пользователя; 1 - проверка с выводом предупреждения в поток сообщений об ошибках и продолжением работы (при обнаружении некорректного символа ‘\r’); 2 - проверка с выводом сообщения об ошибке и завершением работы (стандартное значение); 3 - проверка с выводом сообщения об ошибке и завершением работы, а также исправлением файлов с некорректным символом ‘\r’. |
SendSizeWarning |
- |
ненулевой признак фиксации ошибки (предупреждения), если длина посылаемого сообщения меньше длины принимаемого. Стандартное значение этого параметра равно 1. |
DeadlockSendSize |
- |
длина посылаемого сообщения, начиная с которой send рассматривается как причина потенциального дедлока или зависания. При отрицательном значении этого параметра все операции send, вне зависимости от длины передаваемого сообщения, считаются дедлокобезопасными. Стандартное значение параметра DeadlockSendSize равно нулю. |
MaxErrorPrint |
- |
максимальное число выводимых в протокол ошибок, имеющих один и тот же тип и один и тот же номер точки (SRC) в исходных текстах. При отрицательном значении этого параметра число выводимых ошибок не ограничивается. Стандартное значение параметра MaxErrorPrint равно 20. Параметр не ограничивает число выводимых в протокол дедлоков и зависаний. |
MaxDeadlockPrint |
- |
максимальное число выводимых в протокол потенциальных дедлоков и зависаний. При отрицательном значении этого параметра число выводимых в протокол потенциальных дедлоков и зависаний не ограничивается. Стандартное значение параметра MaxDeadlockPrint равно 30. |