LIBDVM~1 (1158353), страница 4
Текст из файла (страница 4)
EveryEventCheckCodeMem - признак контроля области памяти с программным кодом по каждому трассируемому событию.
EveryTraceCheckCodeMem - признак контроля области памяти с программным кодом при каждом обращении к функциям вывода трассировки, рассмотренным в п.7.3. Данный контроль включает в себя контроль, задаваемый параметром EveryEventCheckCodeMem.
7.3.Функции вывода информации в потоки трассировки.
Вывод информации в потоки трассировки и в стандартный поток stderr осуществляется с помощью следующих функций (параметр format и следующие за ним параметры аналогичны соответствующим параметрам функции printf библиотеки языка C).
int tprintf(char *format, ... );
Функция осуществляет вывод информации в открытые потоки трассировки. Возвращается число выведенных символов.
int pprintf(int prefix, char *format, ... );
Функция выводит информацию в открытые потоки трассировки. Кроме того, вывод производится в потоки, предназначенные для вывода информационных сообщений системы поддержки (параметр prefix равен 0 или 1), либо в потоки, предназначенные для вывода сообщений об ошибках (prefix равен 2 или 3) (см.п.8).
При значении параметра prefix, равном 1 или 3, вывод осуществляет каждый процессор решающего поля, предваряя заданную информацию своим номером (см.п.1.3 и п.4). Если значение prefix равно 0 или 2, то вывод информации в потоки трассировки осуществляет каждый процессор решающего поля, а в остальные потоки - только главный процессор (см.п.4). Предварительный вывод номера процессора в этом случае не производится.
Возвращается число выведенных символов.
int vtprintf(int prefix, char *format, va_list arg_ptr);
Функция выводит информацию в открытые потоки трассировки. При значении параметра prefix, равном 1 или 3, выводу информации в поток трассировки, совпадающий с потоком stderr, предшествует вывод номера текущего процессора. Для вывода информации в поток stderr без номера процессора значение prefix должно быть равно 0 или 2. Значения параметра prefix 0 и 1 используются для вывода информационных сообщений, а 2 и 3 - для вывода сообщений об ошибках (см.п.8).
Возвращается число выведенных символов.
void dvm_trace(int number, char *format, ... );
Функция выводит информацию о состоявшемся событии с номером number в открытые потоки трассировки. Выводимая информация состоит из:
-
стандартной информации для события трассировки с номером number;
-
дополнительной информации, заданной параметром format и последующими параметрами, если таковые имеются.
Стандартная информация включает в себя:
-
имя события трассировки с номером number;
-
время выполнения программы, прошедшее с момента предыдущего фактического вывода информации в потоки трассировки с помощью функции dvm_trace;
-
имя файла и номер строки, вместе определяющие точку произошедшего события с номером number.
Фактический вывод информации в потоки трассировки происходит лишь в том случае, если событие с номером number включено.
Вывод дополнительной информации осуществляется только в расширенном режиме трассировки или при задании такого режима отдельно для события с номером number.
Имя файла и номер строки, определяющие точку произошедшего события, сообщаются программе трассировки макровызовом DVM_CALL. Название макроса проистекает из того, что все события трассировки, за несколькими исключениями, - это вызовы функций системы поддержки. Если событие произошло внутри системы поддержки и событием является обращение к функции, то используется макровызов RTL_CALL. Макровызовы DVM_CALL и RTL_CALL должны исполнительно предшествовать событию и максимально к нему приближены (по расположению в файле с программой). Таким образом, трассировка событий осуществляется по следующей схеме:
DVM_CALL; (или RTL_CALL;)
..................................
< точка наступления события >
..................................
dvm_trace( ........ );
Трассировка функций системы поддержки организована таким образом, что обращение к dvm_trace происходит внутри трассируемой функции. Наиболее предпочтительным способом использования макровызовов DVM_CALL и DVM_TRACE при трассировке функций является применение операции последовательного вычисления:
( DVM_CALL , < обращение к функции > )
или
( RTL_CALL , < обращение к функции > ) .
В этом случае номер строки, сообщаемый программе трассировки, будет точно равен номеру строки наступившего события (обращения к функции), а обращение к функции в любом выражении языка C может быть эквивалентно заменено на какую либо из вышеприведенных конструкций.
ЗАМЕЧАНИЕ. Имя файла и номер строки, определяющие точку наступившего события, могут быть сообщены системе поддержки также с помощью функций
long fname_ (char *FileNamePtr, long FileNameLength);
long lnumb_ (long *LineNumberPtr);
| FileNamePtr | - указатель на текстовую строку с именем файла. |
| FileNameLength | - длина строки с именем файла в байтах. |
| *LineNumberPtr | - номер строки. |
При выполнении функции fname_ последнему байту с именем файла будет присвоено нулевое значение. Функции возвращают нулевые значения.
Данные функции могут быть использованы препроцессорными программами для "привязки" точки предполагаемого события к своему входному тексту.
Отметим, что последовательность обращений
long line;
..............................
..............................
line = __LINE__ ;
fname_ ( __FILE__ ,
strlen(__FILE__)+1 ) ;
lnumb_ ( &line ) ;
эквивалентна макровызову
DVM_CALL ; .
void eprintf(char *FileNamePtr, int Line, char *format, ... );
Функция выводит информацию в открытые потоки трассировки и в потоки, предназначенные для сообщений об ошибках (см.п.8), после чего завершает выполнение программы пользователя и системы поддержки. Информации, выводимой в потоки, предназначенные для сообщений об ошибках, предшествует вывод номера текущего процессора.
После вывода информации, заданной параметром format и последующими параметрами (если таковые имеются), выводятся строка, заданная указателем FileNamePtr и целое число, заданное параметром Line. Предполагается, что выводимые строка и число - это имя файла и номер строки, содержащие данное обращение к функции eprintf, то есть, что обращение к eprintf имеет вид:
eprintf(__FILE__ , __LINE__ , format , ... );
Кроме того, функция eprintf выводит координаты точки программы пользователя, из которой произошло последнее обращение к системе поддержки (имя файла и номер строки).
8.О ВЫВОДЕ ИНФОРМАЦИОННЫХ СООБЩЕНИЙ СИСТЕМЫ ПОДДЕРЖКИ И СООБЩЕНИЙ ОБ ОШИБКАХ
Каждое сообщение, выдаваемое системой поддержки в процессе своего функционирования, является либо информационным, либо сообщением об ошибке.
Информационные сообщения выводятся с помощью функций rtl_printf, rtl_mprintf (см.п.1.3), а также функцией pprintf со значением параметра prefix, равным 0 или 1 (см.п.7).
Кроме того, для вывода информационных сообщений в системе поддержки предусмотрена функция iprintf, синтаксически эквивалентная функции printf и возвращающая число выведенных символов:
int rtl_iprintf(char *format, ...);
Информационным сообщением считается также любая трассировочная информация, предназначенная для вывода на видеомонитор.
Вывод сообщений об ошибках осуществляется функциями eprintf и eprintf, а также функцией pprintf со значением параметра prefix, равным 2 или 3 (см.п.7).
Направление и перенаправление потоков, предназначенных для вывода информационных сообщений и сообщений об ошибках, осуществляется с помощью параметров файлов current.par и syspar.* .
Файл current.par является файлом параметров текущего запуска системы поддержки и создается программой запуска системы поддержки в текущей рабочей директории. Он состоит из следующей последовательности строк:
CurrentPar[0]=<параметр>;
CurrentPar[1]=<параметр>;
. . . . . . . . . . . . . . . . . . . . . . . .
CurrentPar[n]=<параметр>;
Расположенными справа от знака '=' параметрами, определяющими вывод информации, могут быть:
-
+o[<путь, определяющий файл>]
Данный параметр дает указание системе поддержки перевести поток stdout в заданный файл. Если путь, определяющий файл, не задан, то stdout переводится в файл stdout.out .
-
+e[<путь, определяющий файл>]
Параметр задает перевод потока stderr в заданный файл. Если путь, определяющий файл, не задан, то stderr переводится в файл stderr.out .
-
+i[<символы, определяющие потоки>]
Данный параметр дает указание системе поддержки направить информационные сообщения в потоки, определяемые заданными символами.
Символами, определяющими потоки, могут быть:
o - поток stdout;
e - поток stderr;
f - файл.
Если задан как символ 'o', так и символ 'e', а потоки stdout и stderr в файлы не переведены, то дублирования информационных сообщений на видеомонитор производиться не будет. Если не задано ни одного символа, то информационные сообщения выводиться не будут.
При отсутствии указания +i в файле current.par вывод информационных сообщений определяется параметрами, заданными в файле syspar.* .
Такими параметрами могут быть:
| SysInfoPrint | - общий признак включенного вывода информационных сообщений; |
| SysInfoStdOut | - признак вывода информационных сообщений в поток stdout при условии, что он переведен в файл; |
| SysInfoStdErr | - признак вывода информационных сообщений в поток stderr; |
| SysInfoFile | - признак вывода информационных сообщений в файл. |
Единичные значения параметров SysInfoStdOut и SysInfoStdErr позволяют при перенаправлении stdout в файл перенаправить информационные сообщения в этот же файл и сохранить их на экране видеомонитора (перевод вывода пользовательской программы в файл должен быть осуществлен с помощью параметра '+o' файла current.par). Манипулируя значениями этих параметров, можно добиться любой комбинации ВИДЕОМОНИТОР - STDOUT, ПЕРЕВЕДЕННЫЙ В ФАЙЛ.
Отметим, что направление информационных сообщений с помощью параметра '+i' файла current.par имеет приоритет над их направлением, заданным параметрами SysInfoStdOut, SysInfoStdErr и SysInfoFile файла syspar.* .
Направление информационных сообщений в файл (SysInfoFile = 1) управляется еще двумя параметрами файла syspar.*:
| SysInfoFileName | - путь, определяющий файл для размещения информационных сообщений; |
| SysInfoSepFile | - признак накопления информационных сообщений в отдельном для каждого процессора файле. |
При нулевом значении SysInfoSepFile каждый процессор направляет информационные сообщения непосредственно в файл, заданный параметром SysInfoFileName. При единичном - каждый процессор накапливает информационные сообщения в своем временном файле. При завершении работы все временные файлы собираются в один (определенный параметром SysInfoFileName), а затем уничтожаются.
Все сообщения об ошибках:
-
всегда выводятся в поток stderr;
-
выводятся в поток stdout, если вывод задачи пользователя перенаправлен в файл;
-
выводятся в файл, заданный параметром SysInfoFileName, если параметр SysInfoFile равен единице (в тот же файл, что и информационные сообщения).
Поэтому сообщения об ошибках:
-
всегда сопровождают вывод пользовательской задачи;
-
всегда поступают на видеомонитор (если потоки stdout и stderr одновременно не переведены в файлы).
9.ИЗМЕРЕНИЕ ВРЕМЕНИ ВЫПОЛНЕНИЯ УЧАСТКОВ ПОЛЬЗОВАТЕЛЬСКОЙ ПРОГРАММЫ.
Для обозначения начала и конца измеряемого участка используются макровызовы MeasureStart и MeasureFinish. Измеряемые участки могут быть вложенными:
| MeasureStart; /* начало участка 1 */ | ||
| MeasureStart; /* начало участка 2 */ | ||
| MeasureStart; /* начало участка N */ | ||
| ........................................... | ||
| MeasureFinish; /* конец участка 2 */ | ||
| MeasureFinish; /* конец участка 1 */ | ||
Макровызов MeasureStart эквивалентен обращению к функции dvm_trace (см.п.7) с номером события 1 (имя этого события - MeasureStart), а макровызов MeasureFinish - обращению к dvm_trace с номером события 2 (имя этого события - MeasureFinish). В качестве дополнительной информации в открытые потоки трассировки для макровызова MeasureStart выводится уровень вложенности измеряемого участка (1,2, ..., N в вышеприведенной схемке), а для макровызова MeasureFinish - уровень вложенности и время выполнения программы, прошедшее с момента макровызова MeasureStart с тем же уровнем вложенности.















