DVM отладчик - оглавление | Часть 1 (1 - 4) | Часть 2 (5 - 6.4) | Часть 3 (6.5) | Часть 4 (7) |
дата документа: февраль. 2000 | - дата последнего обновления 22.05.01 - |
6.5 Реализация системы сравнения результатов выполнения
6.5.1 Основные структуры системы сравнения результатов выполнения
Система сравнения результатов выполнения основана на сборе и последующем сравнении трассировки исполнения программы. Трассировка накапливается в памяти каждого процессора и записывается в файл при завершении выполнения программы. Она состоит из двух частей. Первая часть представляет собой описание исполняемых конструкций программы (параллельные и последовательные циклы, области задач) и содержит информацию о вложенности конструкций, параметры сбора трассировки для каждой конструкции и прочую информацию. Информация об исполняемых конструкциях программы и их параметрах считываются при запуске программы из конфигурационного файла трассировки. Если данный файл отсутствует (его имя при запуске не задано) или нарушена его структура, то описание конструкций программы формируется в ходе сбора трассировки. Заметим также, что в режиме сравнения результатов вычислений конфигурационный файл трассировки не читается, а все параметры берутся из файла с эталонной трассировкой.
Вторая часть трассировки представляет собой массив трассировочных записей. Во время накопления трассировки поддерживается согласованность трассировочных записей и структур, описывающих исполняемые конструкции программы. При записи в трассировку информации о начале конструкции, в ней запоминается указатель на соответствующую структуру, описывающую данную конструкцию. Если структура с описанием конструкции отсутствует, то она динамически создается.
Так как при сравнении результатов вычислений порядок выполнения витков параллельных циклов может отличаться, то каждая запись начала цикла содержит массив номеров всех записей витков данного цикла. В начале выполнения каждого витка этот массив просматривается для нахождения соответствующей записи в трассировке. Для ускорения поиска данный массив организован в виде хеш-таблицы.
Рис. 4. Структура трассировки
Система сравнения результатов выполнения содержит в себе следующие основные модули: модуль чтения трассировки, модуль записи трассировки, модуль накопления трассировки, модуль сравнения трассировки и модуль обработки операций редукции. К данным модулям обращаются в зависимости от параметров и режима выполнения динамического отладчика.
Функции накопления трассировки формируют соответствующие записи в таблице трассировочных записей. Если задан режим прямой записи в файл, то записи в памяти не формируются, а сразу же пишутся в файл с помощью функций модуля записи трассировки. Если задан режим сравнения трассировки, то функции накопления используются модулем чтения трассировки для формирования в памяти трассировки, соответствующей эталонному файлу.
Далее приводятся структуры, используемые системой сравнения результатов выполнения.
Структура описания исполняемой конструкции программы:
typedef struct tag_STRUCT_INFO |
{ | ||||
long | No; | |||
char | File[MaxSourceFile]; | |||
unsigned long | Line; | |||
enum_TraceLevel | TraceLevel; | |||
enum_TraceLevel | RealLevel; | |||
byte | bSkipExecution; | |||
s_COLLECTION | cChildren; | |||
byte | Type; | |||
byte | Rank; | |||
s_REGULARSET | Limit[MAXARRAYDIM]; | |||
s_REGULARSET | Current[MAXARRAYDIM]; | |||
s_REGULARSET | Common[MAXARRAYDIM]; | |||
long | CurIter[MAXARRAYDIM]; | |||
struct tag_ STRUCT _INFO* | pParent; | |||
unsigned long | Bytes; | |||
unsigned long | StrCount; | |||
unsigned long | Iters; | |||
} | STRUCT_INFO; | |||
No | – | уникальный номер конструкции; | ||
File | – | имя файла программы, где располагается данная конструкция; | ||
Line | – | номер строки начала конструкции; | ||
TraceLevel | – | уровень трассировки данной конструкции, заданный в конфигурационном файле трассировки (полный, только модификации, минимальный или отключен); | ||
RealLevel | – | реальный уровень трассировки данной конструкции, вычисленный исходя из параметров конфигурационного файла трассировки и уровня трассировки объемлющей конструкции; | ||
bSkipExecution | – | флаг, определяющий трассировку конструкции в зависимости от ограничений по трассируемым виткам; | ||
children | – | коллекция указателей на описания вложенных конструкций для данной конструкции; | ||
Type | – | тип конструкции (параллельный или последовательный цикл, область задач); | ||
Rank | – | размерность конструкции (определяет размерность параллельных циклов); | ||
Limit | – | ограничения трассировки конструкции по виткам; | ||
Current | – | текущие пределы итерационных переменных циклов; | ||
Common | – | наиболее общие пределы итерационных переменных циклов; | ||
CurIter | – | текущие значения итерационных переменных; | ||
pParent | – | ссылка на описание объемлющей конструкции; | ||
Bytes | – | размер полной трассировки конструкции; | ||
StrCount | – | число строк полной трассировки конструкции; | ||
Iters | – | общее число выполненных итераций данной конструкции. |
Следующие структуры описывают записи трассировки в зависимости от их типа.
Запись, отмечающая завершение блока собственных вычислений в последовательной ветви программы:
typedef struct tag_SKIP |
{ | ||||
byte | RecordType; | |||
char | File[MaxSourceFile]; | |||
unsigned long | Line; | |||
} | SKIP; | |||
RecordType | – | тип записи; | ||
File | – | имя файла исходной DVM-программы; | ||
Line | – | номер строки в DVM-программе. |
Запись, описывающая начало исполняемой конструкции программы:
typedef struct tag_STRUCT_BEGIN |
{ | ||||
byte | RecordType; | |||
char | File[MaxSourceFile]; | |||
unsigned long | Line; | |||
long | Parent; | |||
long | LastRec; | |||
struct tag_STRUCT_INFO * | pCnfgInfo; | |||
HASH_TABLE | hIters; | |||
} | STRUCT_BEGIN; |
RecordType | – | тип записи; | ||
File | – | имя файла исходной DVM-программы; | ||
Line | – | номер строки в DVM-программе; | ||
Parent | – | номер записи начала объемлющей конструкции программы или номер записи витка, в котором данная конструкция выполняется; | ||
LastRec | – | номер записи завершения данной конструкции; | ||
pCnfgInfo | – | ссылка на описание конструкции; | ||
hIters | – | хэш-таблица номеров записей витков конструкции. Служит для ускорения поиска записи начала конструкции. |
Запись, описывающая завершение конструкции:
typedef struct tag_STRUCT_END |
{ | ||||
byte | RecordType; | |||
char | File[MaxSourceFile]; | |||
unsigned long | Line; | |||
long | Parent; | |||
struct tag_STRUCT_INFO* | pCnfgInfo; | |||
} | STRUCT_END; |
RecordType | – | тип записи; | ||
File | – | имя файла исходной DVM-программы; | ||
Line | – | номер строки в DVM-программе; | ||
Parent | – | номер записи начала объемлющей конструкции программы или номер записи витка, в котором данная конструкция выполняется; | ||
pCnfgInfo | – | ссылка на описание конструкции. |
Запись, описывающая начало витка цикла или задачи из области задач:
typedef struct tag_ITERATION |
{ | ||||
byte | RecordType; | |||
long | Index[MAXARRAYDIM]; | |||
long | LI; | |||
char | Checked; | |||
long | Parent; | |||
byte | Rank; | |||
} | ITERATION; |
RecordType | – | тип записи; | ||
Index | – | значения итерационных переменных; | ||
LI | – | абсолютный индекс витка или номер задачи; | ||
Checked | – | равен 1, если данный виток (или задача) уже исполнялся. Служит для проверки повторного исполнения в режиме сравнения трассировки; | ||
Parent | – | номер записи начала конструкции, к которой относится виток или задача; | ||
Rank | – | размерность витка (равна размерности исполняемой конструкции). |
Запись, описывающая доступ к переменной на чтение или запись или результат вычисления редукции.
typedef struct tag_VARIABLE |
{ | ||||
byte | RecordType; | |||
long | vType; | |||
char | Operand[MaxOperand]; | |||
char | File[MaxSourceFile]; | |||
unsigned long | Line; | |||
byte | Reduct; | |||
VALUE | val; | |||
} | VARIABLE; |
RecordType | – | тип записи; | ||
vType | – | тип переменной. Система сравнения результатов выполнения обрабатывает только следующие четыре типа: int, long, float и double; | ||
Operand | – | имя переменной; | ||
File | – | имя файла исходной DVM-программы; | ||
Line | – | номер строки в DVM-программе; | ||
Reduct | – | 1, если обращение идет к редукционной переменной. Иначе – 0; | ||
val | – | значение переменной. |
Для хранения трассировочных записей и некоторых глобальных параметров системы сравнения результатов выполнения, определена глобальная переменная Trace, которая описывается структурой типа TRACE:
typedef struct tag_TRACE |
{ | ||||
TABLE | tTrace; | |||
s_COLLECTION | cStructs; | |||
TABLE | tBegStructs; | |||
long | CurIter; | |||
long | CurStruct; | |||
long | CurTraceRecord; | |||
long | CurPreWriteRecord; | |||
byte | IterFlash; | |||
byte | ReductExprType; | |||
STRUCT_INFO* | pCurCnfgInfo; | |||
int | ErrCode; | |||
int | Level; | |||
unsigned long | Bytes; | |||
unsigned long | StrCount; | |||
unsigned long | Iters; | |||
FILE * | TrcFileHandle; | |||
unsigned long | TraceRecordBase; | |||
unsigned | FloatPrecision; | |||
} | TRACE; |
tTrace | – | таблица трассировочных записей; | ||
cStructs | – | коллекция описаний конструкций программы, расположенных на внешнем уровне (не имеющих объемлющих конструкций); | ||
tBegStructs | – | таблица номеров всех записей начала конструкций; | ||
CurIter | – | номер записи текущего исполняемого витка или задачи; | ||
CurStruct | – | номер записи текущей исполняемой конструкции; | ||
CurTraceRecord | – | номер текущей обрабатываемой записи трассировки; | ||
CurPreWriteRecord | – | номер записи начала текущего обрабатываемого выражения; | ||
IterFlash | – | флаг отложенной записи витка; | ||
ReductExprType | – | флаг обработки выражения, вычисляющего значение редукционной переменной; | ||
pCurCnfgInfo | – | ссылка на описание текущей исполняемой конструкции; | ||
ErrCode | – | код последней ошибки; | ||
Level | – | уровень трассировки, заданный для всей программы; | ||
Bytes | – | размер полной трассировки последовательной части программы; | ||
StrCount | – | число строк трассировки последовательной части программы; | ||
Iters | – | общее число всех выполненных витков программы. Используется для вычисления объема занимаемой памяти. | ||
TrcFileHandle | – | дескриптор файла трассировки; | ||
TraceRecordBase | – | номер строки в файле трассировки, начиная с которого идут непосредственно трассировочные записи. | ||
FloatPrecision | – | число знаков после запятой, которые будут записываться в трассировку для вещественных чисел. Вычисляется исходя из параметров трассировки. |
Для работы с трассировкой предназначен следующий набор функций. Данные функции обращаются к функциям модулей чтения, записи, накопления и сравнения трассировки в зависимости от заданных параметров и текущего режима выполнения.
void cmptrace_Init(void) |
Функция инициализирует структуры, используемые для трассировки. Если задан режим сравнения трассировки, то производит чтение файла с эталонной трассировкой. Если задан режим накопления трассировки, то производится чтение файла описания циклов.
void cmptrace_ReInit(void) |
Функция подготавливает внутренние структуры к режиму сравнения трассировки после чтения файла с эталонной трассировкой.
void cmptrace_Done(void) |
Функция деинициализирует внутренние структуры, используемые для трассировки. Производит освобождение всей занятой памяти и формирует файл трассировки и конфигурационный файл, если заданы соответствующие режимы.
void cmptrace_Read(void) |
Функция производит чтение конфигурационного файла трассировки или файла с эталонной трассировкой в зависимости от заданного режима.
void cmptrace_Write(void) |
Функция производит запись конфигурационного файла трассировки или файла с эталонной трассировкой в зависимости от заданного режима.
Следующие функции обращаются к функциям модулей накопления или сравнения трассировки в зависимости от заданного режима:
void cmptrace_BeginSeqLoop( char *File, unsigned long Line, long No ) | ||
File | – | имя файла с исходной DVM-программой; |
Line | – | номер строки в DVM-программе; |
No | – | уникальный номер конструкции. |
Функция отмечает начало последовательного цикла программы.
void
cmptrace_BeginParLoop( char *File, unsigned long Line,
long No, byte Rank, long *Init, long *Last, long *Step ) |
||
File | – | имя файла с исходной DVM-программой; |
Line | – | номер строки в DVM-программе; |
No | – | уникальный номер конструкции; |
Rank | – | размерность цикла; |
Init | – | массив начальных значений итерационных переменных; |
Last | – | массив конечных значений итерационных переменных; |
Step | – | массив значений шагов приращения итерационных переменных. |
Функция отмечает начало параллельного цикла программы.
void cmptrace_BeginTaskRegion( char *File, unsigned long Line, long No ) | ||
File | – | имя файла с исходной DVM-программой; |
Line | – | номер строки в DVM-программе; |
No | – | уникальный номер конструкции; |
Функция отмечает начало области задач программы.
void cmptrace_EndStruct( char *File, unsigned long Line, long No, unsigned long BegLine ) | ||
File | – | имя файла с исходной DVM-программой; |
Line | – | номер строки в DVM-программе; |
No | – | уникальный номер конструкции; |
BegLine | – | номер строки начала конструкции. |
Функция отмечает завершение цикла или области задач.
void cmptrace_Iter( AddrType *index ) | ||
index | – | массив указателей на итерационные переменные. |
Функция отмечает начало новой итерации цикла или новой задачи.
void cmptrace_PreStoreVar( char *File, unsigned long Line, char *Operand, long Type, byte Reduct ) | ||
File | – | имя файла с исходной DVM-программой; |
Line | – | номер строки в DVM-программе; |
Operand | – | имя переменной; |
Type | – | тип переменной; |
Reduct | – | флаг обращения к редукционной переменной. |
Функция отмечает начало вычисления нового значения для переменной с именем Operand.
void cmptrace_PostStoreVar( char* File, unsigned long Line, char* Operand, long Type, void* Value, byte Reduct ) | ||
File | – | имя файла с исходной DVM-программой; |
Line | – | номер строки в DVM-программе; |
Operand | – | имя переменной; |
Type | – | тип переменной; |
Value | – | адрес переменной; |
Reduct | – | флаг обращения к редукционной переменной. |
Функция отмечает завершение вычисления выражения и запись результата в переменную с именем Operand.
void cmptrace_LoadVar( char* File, unsigned long Line, char* Operand, long Type, void* Value, byte Reduct ) | ||
File | – | имя файла с исходной DVM-программой; |
Line | – | номер строки в DVM-программе; |
Operand | – | имя переменной; |
Type | – | тип переменной; |
Value | – | адрес переменной; |
Reduct | – | обращение идет к редукционной переменной или нет. |
Функция отмечает чтение значения переменной.
void cmptrace_ReductVar( char *File, unsigned long Line, long Type, void *Value, byte Wait ) | ||
File | – | имя файла с исходной DVM-программой; |
Line | – | номер строки в DVM-программе; |
Operand | – | имя переменной; |
Type | – | тип переменной; |
Value | – | адрес редукционной переменной; |
Wait | – | флаг отложенной записи результата. Равен 1, если результат редукции необходимо помещать в трассировку только после завершения текущей параллельной конструкции. |
Функция отмечает завершение вычисления редукционной операции.
void cmptrace_SkipBlock( char *File, unsigned long Line ) | ||
File | – | имя файла с исходной DVM-программой; |
Line | – | номер строки в DVM-программе; |
Функция отмечает завершение блока собственных вычислений в последовательной ветви программы.
Следующие функции предназначены для работы со структурами описания исполняемых конструкций программы.
STRUCT_INFO* trc_InfoNew(STRUCT_INFO* pParent) | ||
pParent | – | указатель на описание объемлющей конструкции. |
Функция выделяет память и инициализирует новую структуру с описанием исполняемой конструкции.
void trc_InfoDone(STRUCT_INFO* pInfo) | ||
pInfo | – | указатель на описание конструкции. |
Функция-деструктор описания конструкции.
int trc_InfoCanTrace(STRUCT_INFO* pInfo, int nRecType) | ||
pInfo | – | указатель на описание текущей исполняемой конструкции; |
nRecType | – | тип записи трассировки. |
Функция определяет необходимость трассировки записи указанного типа в соответствии с параметрами конструкции.
void trc_InfoSetup(STRUCT_INFO* pInfo, long *Init, long *Last, long *Step) | ||
pInfo | – | указатель на описание конструкции; |
Init | – | массив начальных значений итерационных переменных; |
Last | – | массив конечных значений итерационных переменных; |
Step | – | массив значений шагов приращения итерационных переменных. |
Функция инициализирует структуру описания конструкции в момент начала ее исполнения.
STRUCT_INFO*
trc_InfoFindForCurrentLevel(long No, byte Type, byte
Rank, char *File, unsigned long Line) |
||
No | – | уникальный номер конструкции; |
Type | – | тип конструкции (параллельный или последовательный цикл, область задач); |
Rank | – | размерность конструкции; |
File | – | имя файла с исходной DVM-программой; |
Line | – | номер строки в DVM-программе. |
Функция осуществляет поиск на текущем уровне вложенности конструкций и возвращает как результат поиска описание конструкции с заданными параметрами. Если описание конструкции с заданными параметрами отсутствует, то инициализируется новая структура и возвращается как результат.
STRUCT_INFO* trc_InfoFindByNo(long No, s_COLLECTION *pColl) | ||
No | – | уникальный номер конструкции; |
pColl | – | коллекция описаний конструкций. |
Функция рекурсивно перебирает все элементы коллекции и возвращает описание конструкций с указанным номером. Возвращает NULL, если описания конструкции с казанным номером не существует.
6.5.2 Модуль записи трассировки
Функции модуля записи трассировки предназначены для формирования файла трассировки и конфигурационного файла трассировки. Прототипы функций модуля следующие:
void trc_wrt_header(
s_COLLECTION* pStructs, int Level, FILE *hf, int nWriteInfo ) |
||
pStructs | – | коллекция конструкций программы верхнего уровня; |
Level | – | степень вложенности конструкций; |
hf | – | дескриптор файла; |
nWriteInfo | – | флаг записи информационных комментариев. |
Функция записывает в файл конфигурационные параметры трассировки для каждой конструкции программы. Дополнительно, если задан флаг записи информационных комментариев, то в файл пишутся специальные комментарии с суммарными значениями объемов трассировки для каждой конструкции. Функция рекурсивно обращается к себе со значением Level+1 и коллекцией конструкций следующего уровня каждого элемента из коллекции pStructs.
void trc_wrt_trace( FILE *hf ) | ||
hf | – | дескриптор файла трассировки. |
Функция формирует файл с эталонной трассировки.
size_t trc_wrt_beginstruct( FILE *hf, STRUCT_BEGIN *pStruct) | ||
hf | – | дескриптор файла; |
pStruct | – | ссылка на запись начала конструкции программы. |
Функция записывает в файл запись начала конструкции программы. Возвращает число записанных байтов.
size_t trc_wrt_enstruct( FILE *hf, STRUCT_END* pStruct) | ||
hf | – | дескриптор файла; |
pStruct | – | ссылка на запись завершения конструкции программы. |
Функция записывает в файл запись завершения конструкции программы. Возвращает число записанных байтов.
size_t trc_wrt_iter( FILE *hf, ITERATION *Iter ) | ||
hf | – | дескриптор файла; |
Iter | – | ссылка на запись начала витка. |
Функция записывает в файл запись начала нового витка цикла или задачи. Возвращает число записанных байтов.
size_t trc_wrt_readvar( FILE *hf, VARIABLE *Var ) | ||
hf | – | дескриптор файла; |
Var | – | ссылка на запись обращения к переменной. |
Функция записывает в файл запись обращения к переменной на чтение. Возвращает число записанных байтов.
size_t trc_wrt_prewritevar( FILE *hf, VARIABLE *Var ) | ||
hf | – | дескриптор файла; |
Var | – | ссылка на запись обращения к переменной. |
Функция записывает в файл запись начала вычисления значения переменной. Возвращает число записанных байтов.
size_t trc_wrt_postwritevar( FILE *hf, VARIABLE *Var ) | ||
hf | – | дескриптор файла; |
Var | – | ссылка на запись обращения к переменной. |
Функция записывает в файл запись завершения вычисления нового значения и модификации переменной. Возвращает число записанных байтов.
size_t trc_wrt_reductvar( FILE *hf, VARIABLE *Var ) | ||
hf | – | дескриптор файла; |
Var | – | ссылка на запись результата редукции. |
Функция записывает в файл запись результата вычисления редукционной операции. Возвращает число записанных байтов.
size_t trc_wrt_variable( FILE *hf, VARIABLE *Var, int iType ) | ||
hf | – | дескриптор файла; |
Var | – | ссылка на запись обращения к переменной; |
iType | – | тип записи. |
Общая функция записи в файл события обращения к переменной. Возвращает число записанных байтов.
size_t trc_wrt_skip( FILE *hf, SKIP *Skip ) | ||
hf | – | дескриптор файла; |
Skip | – | ссылка на запись завершения блока собственных вычислений. |
Функция записывает в файл запись завершения блока собственных вычислений в последовательной части программы. Возвращает число записанных байтов.
void trc_wrt_calctraceinfo(void) |
Функция вычисляет суммарные размеры трассировки программы и всех исполняемых конструкций.
void trc_wrt_calcinfo(STRUCT_INFO* pInfo) | ||
pInfo | – | ссылка на описание конструкции программы. |
Функция вычисляет суммарные размеры трассировки для указанной конструкции.
6.5.3 Модуль накопления трассировки
Функции модуля накопления трассировки формируют записи в таблице трассировочных записей. Если задан режим сквозной записи, то трассировочные записи в памяти не формируются, а сразу же записываются в файл с помощью функций модуля записи трассировки.
Если задан режим сравнения трассировки, то данные функции используются модулем чтения трассировки для формирования в памяти таблицы трассировочных записей, соответствующей эталонному файлу.
Прототипы функций модуля накопления трассировки следующие:
void trc_put_beginstruct(
char *File, unsigned long Line, long No, byte Type, byte Rank, long *Init, long *Last, long *Step ) |
||
File | – | имя файла с исходной DVM-программой; |
Line | – | номер строки в DVM-программе; |
No | – | уникальный номер конструкции; |
Type | – | тип конструкции (параллельный или последовательный цикл, область задач); |
Rank | – | размерность конструкции; |
Init | – | массив начальных значений итерационных переменных; |
Last | – | массив конечных значений итерационных переменных; |
Step | – | массив значений шагов приращения итерационных переменных. |
Функция формирует запись начала исполняемой конструкции программы.
void
trc_put_endstruct(char *File, unsigned long Line, long
No, unsigned long BegLine) |
||
File | – | имя файла с исходной DVM-программой; |
Line | – | номер строки в DVM-программе; |
No | – | уникальный номер конструкции; |
BegLine | – | номер строки начала конструкции. |
Функция формирует запись завершения исполняемой конструкции программы.
void trc_put_iteration( AddrType *index ) | ||
index | – | массив указателей на итерационные переменные. |
Функция формирует запись начала нового витка цикла или новой задачи. Если не задан режим записи пустых витков, то запись реально будет помещена в трассировку только после начала вложенной конструкции или обращения к переменной внутри данного витка.
void trc_put_iteration_flash_par( byte Rank, long *Index, long LI ) | ||
Rank | – | размерность витка; |
Index | – | массив значений итерационных переменных; |
LI | – | абсолютный индекс витка. |
Функция формирует запись начала нового витка цикла или новой задачи с указанными параметрами.
void trc_put_iteration_flash(void) |
Функция помещает в трассировку текущую отложенную запись начала витка. Вызывается из функций trc_put_beginloop() и trc_put_variable().
void trc_put_readvar( char *File, unsigned long Line, char *Operand, long Type, void *Value, byte Reduct ) | ||
File | – | имя файла с исходной DVM-программой; |
Line | – | номер строки в DVM-программе; |
Operand | – | имя переменной; |
Type | – | тип переменной; |
Value | – | адрес переменной; |
Reduct | – | флаг обращения к редукционной переменной. |
Функция формирует запись обращения к переменной на чтение.
void trc_put_prewritevar( char *File, unsigned long Line, char *Operand, long Type, byte Reduct ) | ||
File | – | имя файла с исходной DVM-программой; |
Line | – | номер строки в DVM-программе; |
Operand | – | имя переменной; |
Type | – | тип переменной; |
Reduct | – | флаг обращения к редукционной переменной. |
Функция формирует запись начала вычисления значения переменной.
void trc_put_postwritevar( char *File, unsigned long Line, char *Operand, long Type, void *Value, byte Reduct ) | ||
File | – | имя файла с исходной DVM-программой; |
Line | – | номер строки в DVM-программе; |
Operand | – | имя переменной; |
Type | – | тип переменной; |
Value | – | адрес переменной; |
Reduct | – | флаг обращения к редукционной переменной. |
Функция формирует запись завершения вычисления нового значения и модификации переменной.
void trc_put_reductvar( char *File, unsigned long Line, long Type, void *Value ) | ||
File | – | имя файла с исходной DVM-программой; |
Line | – | номер строки в DVM-программе; |
Operand | – | имя переменной; |
Type | – | тип переменной; |
Value | – | адрес редукционной переменной. |
Функция формирует запись результата вычисления редукционной операции.
void trc_put_variable( char *File, unsigned long Line, char *Operand, byte iType, long Type, void *Value, byte Reduct ) | ||
File | – | имя файла с исходной DVM-программой; |
Line | – | номер строки в DVM-программе; |
Operand | – | имя переменной; |
iType | – | тип записи; |
Type | – | тип переменной; |
Value | – | адрес переменной; |
Reduct | – | флаг обращения к редукционной переменной. |
Общая функция формирования записи обращения к переменной.
void trc_put_skip( char *File, unsigned long Line ) | ||
File | – | имя файла с исходной DVM-программой; |
Line | – | номер строки в DVM-программе. |
Функция формирует запись завершения блока собственных вычислений в последовательной части программы.
6.5.4 Модуль чтения трассировки
Функции модуля чтения трассировки предназначены для чтения и разбора файла с эталонной трассировки и конфигурационного файла. Для формирования записей в таблице трассировочных записей используются функции модуля накопления трассировки.
Прототипы функций чтения трассировки следующие:
void trc_rd_header( DVMFILE *hf, char* szFileName ) | ||
hf | – | дескриптор файла; |
szFileName | – | имя читаемого файла (участвует в сообщениях об ошибках). |
Функция читает из файла структуру и параметры трассировки исполняемых конструкций программы.
void trc_rd_trace( DVMFILE *hf, char* szFileName, unsigned long StrBase ) | ||
hf | – | дескриптор файла; |
szFileName | – | имя читаемого файла (участвует в сообщениях об ошибках); |
StrBase | – | номер строки файла, с которой начинаются записи трассировки. |
Функция читает файл с трассировкой и формирует в памяти таблицу трассировочных записей.
unsigned long trc_rd_gets( DVMFILE *hf ) | ||
hf | – | дескриптор файла. |
Функция читает следующую запись из файла. Возвращает число обработанных строк.
short trc_rd_search_key(char *str) | ||
str | – | строка с ключевым словом. |
Функция возвращает код, соответствующий строке с ключевым словом, или –1, если ключевое слово не найдено.
char* trc_rd_split( char *Str, char *Format, … ) | ||
Str | – | разбираемая строка; |
Format | – | синтаксис строки; |
… | – | адреса переменных, принимающих разобранные параметры строки. |
Функция производит разбор строки на параметры в соответствии с указанным синтаксисом.
В форматной строке Format могут использоваться следующие символы:
i – int
l – long
f – float
d – double
6.5.5 Модуль сравнения трассировки
Функции модуля сравнения трассировки сравнивают события программы с соответствующими записями эталонной трассировки.
Прототипы функций модуля сравнения трассировки следующие:
void trc_cmp_beginstruct(
char *File, unsigned long Line, long No, byte Type, byte Rank, long *Init, long *Last, long *Step ) |
||
File | – | имя файла с исходной DVM-программой; |
Line | – | номер строки в DVM-программе; |
No | – | уникальный номер конструкции; |
Type | – | тип конструкции (параллельный или последовательный цикл, область задач); |
Rank | – | размерность конструкции; |
Init | – | массив начальных значений итерационных переменных; |
Last | – | массив конечных значений итерационных переменных; |
Step | – | массив значений шагов приращения итерационных переменных. |
Функция сравнивает событие начала исполняемой конструкции программы с соответствующей эталонной записью трассировки.
void trc_cmp_endstruct(char *File, unsigned long Line, long No, unsigned long BegLine) | ||
File | – | имя файла с исходной DVM-программой; |
Line | – | номер строки в DVM-программе; |
No | – | уникальный номер конструкции; |
BegLine | – | номер строки начала конструкции. |
Функция сравнивает событие завершения исполняемой конструкции программы с соответствующей эталонной записью трассировки.
void trc_cmp_iteration( AddrType *index ) | ||
index | – | массив указателей на итерационные переменные. |
Функция сравнивает событие начала нового витка цикла или новой задачи с соответствующей эталонной записью трассировки. Если при формировании эталонной трассировки не был задан режим записи пустых итераций, то реальное сравнение будет произведено только после начала вложенной конструкции или обращения к переменной внутри данного витка.
void trc_cmp_iteration_flash(void) |
Функция сравнивает текущую отложенную запись начала витка цикла или задачи с эталонной записью трассировки. Вызывается из функций trc_cmp_beginloop() и trc_cmp_variable().
void trc_cmp_readvar(char
*File, unsigned long Line, long Type, void *Value, byte Reduct) |
||
File | – | имя файла с исходной DVM-программой; |
Line | – | номер строки в DVM-программе; |
Operand | – | имя переменной; |
Type | – | тип переменной; |
Value | – | адрес переменной; |
Reduct | – | флаг обращения к редукционной переменной. |
Функция сравнивает событие обращения к переменной на чтение с соответствующей эталонной записью трассировки.
void trc_cmp_prewritevar( char *File, unsigned long Line, long Type, byte Reduct ) | ||
File | – | имя файла с исходной DVM-программой; |
Line | – | номер строки в DVM-программе; |
Operand | – | имя переменной; |
Type | – | тип переменной; |
Reduct | – | флаг обращения к редукционной переменной |
Функция сравнивает событие начала вычисления значения переменной с соответствующей эталонной записью трассировки.
void trc_cmp_postwritevar( char *File, unsigned long Line, long Type, void *Value, byte Reduct ) | ||
File | – | имя файла с исходной DVM-программой; |
Line | – | номер строки в DVM-программе; |
Operand | – | имя переменной; |
Type | – | тип переменной; |
Value | – | адрес переменной; |
Reduct | – | флаг обращения к редукционной переменной. |
Функция сравнивает событие завершения вычисления нового значения и модификации переменной с соответствующей эталонной записью трассировки.
void trc_cmp_reductvar( char *File, unsigned long Line, long Type, void *Value ) | ||
File | – | имя файла с исходной DVM-программой; |
Line | – | номер строки в DVM-программе; |
Operand | – | имя переменной; |
Type | – | тип переменной; |
Value | – | адрес редукционной переменной. |
Функция сравнивает событие получения результата редукционной операции с соответствующей эталонной записью трассировки.
void trc_cmp_variable( char *File, unsigned long Line, enum_TraceType iType, long vType, void *Value, byte Reduct ) | ||
File | – | имя файла с исходной DVM-программой; |
Line | – | номер строки в DVM-программе; |
Operand | – | имя переменной; |
iType | – | тип записи; |
Type | – | тип переменной; |
Value | – | адрес переменной; |
Reduct | – | флаг обращения к редукционной переменной. |
Общая функция сравнения события обращения к переменной с соответствующей эталонной записью трассировки.
void trc_cmp_skip( char *File, unsigned long Line ) | ||
File | – | имя файла с исходной DVM-программой; |
Line | – | номер строки в DVM-программе. |
Функция сравнивает событие завершения блока собственных вычислений в последовательной части программы с соответствующей эталонной записью трассировки. При необходимости, функция пропускает некоторые записи эталонной трассировки и позиционируется на нужной записи завершения блока собственных вычислений.
long trc_cmp_forward(long CurTraceRecord, enum_TraceType iType) | ||
CurTraceRecord | – | номер текущей записи трассировки; |
iType | – | тип записи, до которого производится смещение. |
Функция осуществляет поиск ближайшей записи с указанным типом, начиная с текущей записи. Возвращает номер найденной записи. Если между текущей записью и искомой встречаются записи с типом ‘начало конструкции’, ‘конец конструкции’ или ‘начало витка’ или запись с указанным типом отсутствует, то функция возвращает -1.
6.5.6 Модуль обработки редукции
Для обработки редукционных переменных используется своя таблица переменных. Данная таблица содержит в себе записи следующего типа, описывающие редукционные переменные:
typedef struct tag_REDUCT_INFO | ||||
{ | ||||
char* | Current; | |||
char* | Initial; | |||
byte | StartReduct; | |||
s_REDVAR* | RVar; | |||
} | REDUCT_INFO; | |||
Current | – | указатель на буфер, содержащий промежуточный результат редукционной операции; | ||
Initial | – | указатель на буфер, содержащий начальное значение редукционной переменной; | ||
StartReduct | – | флаг начала редукционной операции над переменной; | ||
RVar | – | указатель на RTL-структуру, описывающую редукционную переменную. |
Для проверки правильности заданной операции редукции используется метод ручного просчета редукции. Данный метод основывается на получении промежуточного результата редукционной операции после выполнения каждой итерации цикла и каждой параллельной задачи из области задач. Получив управление после выполнения очередного витка цикла или задачи, функция diter_() вычисляет промежуточный результат редукции, применяя специфицированную редукционную операцию, и восстанавливает исходное значение редукционной переменной. Окончательный результат редукции вычисляется в функции dendl_(), после завершения параллельной конструкции. Таким образом, получая управление и восстанавливая каждый раз начальное значение редукционной переменной перед выполнением очередного витка цикла или задачи, мы можем, применяя специфицированную редукционную операцию, сами просчитать результат редукции.
Следующие функции предназначены для работы с таблицей редукционных переменных и ручного вычисления редукции:
void trcreduct_Insert(s_REDVAR* RVar ) | ||
RVar | – | указатель на RTL-структуру описания редукционной переменной. |
Функция регистрирует редукционную переменную в таблице переменных. Вызывается при объявлении пользователем редукционной переменной.
REDUCT_INFO* trcreduct_Find( void* addr ) | ||
addr | – | адрес переменной. |
Функция возвращает описание редукционной переменной для указанного адреса. Возвращает NULL, если редукционная переменная с соответствующим адресом не зарегистрирована.
void trcreduct_Remove( s_REDVAR* RVar ) | ||
RVar | – | указатель на RTL-структуру описания редукционной переменной. |
Функция удаляет описание редукционной переменной из таблицы переменных. Вызывается при завершении вычисления редукционной операции.
int trcreduct_IsReduct( void *addr ) | ||
addr | – | адрес переменной. |
Функция возвращает значение, отличное от нуля, если редукционная переменная с указанным адресом зарегистрирована в таблице редукционных переменных. Иначе возвращает 0.
void trcreduct_VarDestructor( VarInfo *Var ) | ||
Var | – | ссылка на описание переменной. |
Деструктор описания редукционной переменной для таблицы переменных.
void trcreduct_StoreInitial(s_REDVAR* RVar) | ||
Rvar | – | указатель на RTL-структуру описания редукционной переменной. |
Функция сохраняет текущее значение редукционной переменной как начальное значение для последующего его восстановления в режиме ручного просчета.
void trcreduct_Calculate(void) |
Функция вычисляет промежуточный результат редукционной операции для всех редукционных переменных текущей исполняемой параллельной конструкции. Вызывается после завершения очередного витка цикла или параллельной задачи, а также после завершения параллельной конструкции.
void trcreduct_CalculateVar( VarInfo *Var ) | ||
Var | – | ссылка на описание редукционной переменной. |
Функция вычисляет промежуточный результат редукционной операции для указанной редукционной переменной. Вызывается из функции trcreduct_Calculate().
void trcreduct_Complete( void *addr, long Type ) | ||
addr | – | адрес редукционной переменной; |
Type | – | тип редукционной переменной (константы rt_INT, rt_LONG, rt_FLOAT или rt_DOUBLE). |
Функция помещает в трассировку результат вычисления редукции. Вызывается при завершении вычисления редукционной операции.
void trcreduct_CopyResult( s_COLLECTION *RedVars ) | ||
RedVars | – | коллекция редукционных переменных, вычисляемых в текущей параллельной конструкции. |
Функция копирует результат редукции, вычисленный методом ручного просчета, в соответствующие редукционные переменные.
6.5.7 Параметры системы сравнения результатов выполнения
Системой сравнения результатов выполнения используются тот же механизм задания параметров, что и системой динамического контроля Существуют следующие параметры:
EnableTrace – обработка трассировки выполняется, если параметр больше 0, и не выполняется при значении 0.
ManualReductCalc – режим вычисления редукции. Используется обычный режим, если параметр равен 0, и используется режим ручного просчета редукции, если параметр больше 0.
TraceOptions.FileLoopInfo – имя конфигурационного файла трассировки. Берется из каталога, заданного в параметре TraceOptions.TracePath. Используется только в режиме накопления трассировки.
TraceOptions.TraceFile – имя файла с эталонной трассировкой. Файл берется из директории, указанной в TraceOptions.TracePath. Используется только в режиме сравнения трассировок.
TraceOptions.ErrorFile – имя файла для диагностических сообщений. В данный файл помещаются сообщения об ошибках, если значение параметра TraceOptions.ErrorToScreen равно 0. Если попытки открытия файла окажутся неуспешными, то диагностика будет выводиться на экран.
TraceOptions.Ext – расширения для файлов с накапливаемой трассировкой. Имя файла формируется по правилу: <номер процессора>.<значение TraceOptions.Ext>. Файл с трассировкой создается в каталоге, указанном в TraceOptions.TracePath. Используется только в режиме накопления трассировки.
TraceOptions.Exp – точность сравнения вещественных чисел в режиме сравнения трассировок.
TraceOptions.WrtHeaderProc – номер процессора, который будет создавать конфигурационный файл трассировки. Так как общая структура программы идентична для всех процессоров, то конфигурационный файл трассировки будет одинаков для любого процесса. Отличаться они будут только значениями объема трассировки, т.к. эти значения вычисляются только для текущего процесса. Общий объем трассировки для всех процессов можно получить, запустив программу на одном процессе.
TraceOptions.TracePath – путь, где формируются и располагаются файлы системы сравнения результатов выполнения.
TraceOptions.TraceMode – режим системы сравнения результатов выполнения. Возможны следующие значения:
0 | – | генерация конфигурационного файла трассировки. Файл формирует только процессор с номером TraceOptions.WrtHeaderProc; |
1 | – | накопление трассировки и запись в файл <номер процессора>.<TraceOptions.Ext>; |
2 | – | объединение двух предыдущих режимов; |
3 | – | сравнение трассировки с эталонной, заданной в файле TraceOptions.TraceFile. |
TraceOptions.TraceLevel – степень подробности трассировки по умолчанию. Используется только в режиме сбора трассировки. Возможны следующие значения:
0 | – | отсутствие трассировки (уровень NONE); |
1 | – | трассировка начала и завершения циклов или областей задач и начала витков или задач (уровень MINIMAL); |
2 | – | предыдущий уровень, плюс трассировка модификаций переменных и результатов вычисления редукции (уровень MODIFY); |
3 | – | трассировка всех событий (уровень FULL). |
TraceOptions.SpaceIndent – размер отступа, используемый в файлах трассировки.
TraceOptions.ErrorToScreen – если значение не равно 0, то вся диагностика выводится на экран.
TraceOptions.TableTraceSize – размер приращения таблицы трассировочных записей.
TraceOptions.HashIterIndex и TraceOptions.HashIterSize – параметры хеш-таблиц, используемых для поиска итераций.
TraceOptions.ReductHashIndexSize, TraceOptions.ReductHashTableSize и TraceOptions.ReductVarTableSize – параметры таблицы переменных, используемой для хранения редукционных переменных
TraceOptions.SaveThroughExec – если значение не равно 0, то трассировочные записи записываются в файл в ходе выполнения программы (в память накопление не происходит). В противном случае трассировка записывается по окончании выполнения программы.
TraceOptions.PrintStatistic – вывод статистики по трассировке после завершения программы. Статистика выводится в файл TraceOptions.ErrorFile или на экран в зависимости от значения параметра DebugOptions.ErrorToScreen.
TraceOptions.WriteEmptyIter – если значение не равно 0, то из трассировки исключаются записи, соответствующие началу витка и задачи, если внутри витков и задач нет обращений к переменным или вложенных конструкций.
TraceOptions.AppendErrorFile – определяет режим записи в файл диагностики при его использовании. Если значение равно 0, то предыдущее содержимое стирается при каждом запуске программы.
TraceOptions.MaxErrors – максимальное число ошибок, после которого будет отключено накопление или сравнение трассировки.
DVM отладчик - оглавление | Часть 1 (1 - 4) | Часть 2 (5 - 6.4) | Часть 3 (6.5) | Часть 4 (7) |