Тип трассировки стека

Тип трассировки стека

Значение, возвращаемое функцией ProbeVue get_stktrace и содержащее трассировку текущего стека, имеет тип stktrace_t. Это трассировка стека текущей нити. Переменную с трассировкой можно хранить в именованном массиве как ключ или как значение. Тип stktrace_t - это абстрактный тип данных. Переменную такого типа нельзя использовать напрямую в стандартных унарных или бинарных операторах C. Во внутреннем представлении такая переменная являет собой массив значений unsigned long.

Vue поддерживает следующие свойства и операции для переменных типа "трассировка стека":

Объявление переменной типа "трассировка стека"

Переменную можно объявить следующим образом:
      stktrace_t  st;              // st - переменная типа stktrace_t.
      st = get_stktrace(5);        //  Получить трассировку до пятого уровня. 
      a_st[0] = get_stktrace(-1);  // Получить всю доступную трассировку и
                                  // сохранить ее в именованном массиве a_st как одно значение.
Переменные типа stktrace_t не поддерживают спецификаторы signed, unsigned, register, static, auto, thread, kernel и const.

Операции присвоения

Оператор присвоения (=) позволяет присвоить одной переменной типа stktrace_t значение другой переменной типа stktrace_t. Исходное значение переменной stktrace_t, которой присваивается значение, будет утеряно. Преобразования типов между переменными типа stktrace_t и других типов не допускаются. В следующем примере содержимое трассировки стека t1 присваивается переменной t2.
      stktrace_t     t1, t2;          // Объявление двух переменных типа "трассировка стека".
      t1 = get_stktrace();            // Запись трассировки текущего стека в t1.
      t2 = t1 ;                       // Копирование содержимого t1 в переменную t2.

Операция сравнения

Только операции проверки равенства (==) и неравенства (! =) допустимы между переменными типа stktrace_t. Результатом этих операторов будет либо True(1), либо False(0), в зависимости от полных значений переменных stktrace_t. Сравнение отдельных записей стека stktrace_t недопустимо. Другие операции сравнения (>=, >, < or =<) для типа stktrace_t не поддерживаются.
            if( t1 == t2)                  // сравнение двух переменных типа stktrace_t.
                     printf(“Записи равны”);
              else
                     printf(“Записи не равны”);

Печать переменной типа "трассировка стека"

Для вывода переменной stktrace_t можно воспользоваться функцией Vue printf со спецификаторами формата %t или %T. Трассировка стека будет выведена в символьном формате. Если в переменной stktrace_t хранится стек нити, которая в данный момент активна, и если для печати трассировки стека используется спецификатор формата %t, то печатается адрес с символом (символ плюс адрес), иначе печатается только трассировка стека в виде адреса.

Переменные типа stktrace_t хранятся в именованном массиве в качестве ключа или значения и могут быть напечатаны с помощью функций print такого массива. В если в переменной stktrace_t хранится стек нити, которая выполняется на текущий момент, то адреса будут напечатаны с символами, иначе будут напечатаны только значения адресов. Если установлен флаг STKTRC_NO_SYM в функции set_aso_print_options(), то эта переменная печатает непреобразованные адреса работающей нити.
    stktrace_t t1;
    t1 = get_stktrace (5);
    printf (“%t”, t1);       // Показывает трассировку стека из переменной t1.         
    printf (“%T”, t1);      // Показывает трассировку стека в переменной t1 с непреобразованным адресом.
    a[__tid] = t1;           // Сохраняет t1 как элемент именованного массива a.
    print(a) ;              // Печатает именованный массив 
																			//	с элементами типа stktrace_t. 
                                                     

Ограничения переменных типа "трассировка стека"

  • Нельзя объявить массив переменных stktrace_t.
  • Переменные stktrace_t не могут быть часть структуры или объединения.
  • Запрещен доступ к отдельным элементам трассировки стека.
  • Операции (присвоение, сравнение и печать) над переменными типа stktrace_t не поддерживаются в тестах systrace.