У меня есть скрипт , чтобы определить, сколько свободного места в стеке имеется в каждой задаче FreeRTOS.Язык GDB установлен на auto
.Сценарий прекрасно работает, когда текущий язык c
, но не работает, если текущий язык ada
.
У меня в классе Stacks
,
tcb_t = gdb.lookup_type("TCB_t")
int_t = gdb.lookup_type("int")
в:
find {блок управления задачами Ada} .Common.Thread,
thread = atcb["common"]["thread"]
преобразовать в указатель на блок управления задачами FreeRTOS,
tcb = thread.cast(Stacks.tcb_t.pointer()).dereference()
findлогическая вершина стека
stk = tcb["pxStack"].cast(Stacks.int_t.pointer())
Теперь мне нужно логически зацикливаться в стеке, пока не найду запись, не равную инициализированному значению,
free = 0
while stk[free] == 0xa5a5a5a5:
free = free + 1
, которая отлично работает, еслиязык текущего фрейма c
, но если он ada
, я получаю
Python Exceptionне массив или строка: в команде Python произошла ошибка: не массив или строка
Я проследил это до выражения stk[free]
, которое интерпретируется с использованием правил текущего языка (в Аде при индексировании массива используются скобки, поэтому это будет stk(free)
, что, конечно, недопустимо, поскольку Python рассматривает его как вызов функции).
Я обошел это с помощью
def invoke(self, arg, from_tty):
gdb.execute("set language c")
...
gdb.execute("set language auto")
но кажется неправильным не возвращать язык к тому, что было изначально.
Итак,
- Есть ли способ определения текущей настройки языка GDB из Python?
- существует ли альтернативный способ индексации, который не зависит от текущей настройки языка GDB?