Тип трассировки стека
Тип трассировки стека
Значение, возвращаемое функцией 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 t1, t2; // Объявление двух переменных типа "трассировка стека".
t1 = get_stktrace(); // Запись трассировки текущего стека в t1.
t2 = t1 ; // Копирование содержимого t1 в переменную t2.Операция сравнения
if( t1 == t2) // сравнение двух переменных типа stktrace_t.
printf(“Записи равны”);
else
printf(“Записи не равны”);Печать переменной типа "трассировка стека"
Для вывода переменной stktrace_t можно воспользоваться функцией Vue printf со спецификаторами формата %t или %T. Трассировка стека будет выведена в символьном формате. Если в переменной stktrace_t хранится стек нити, которая в данный момент активна, и если для печати трассировки стека используется спецификатор формата %t, то печатается адрес с символом (символ плюс адрес), иначе печатается только трассировка стека в виде адреса.
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.