В скрипте GDB Python индексация массива завершается ошибкой, если язык фрейма - Ada - PullRequest
0 голосов
/ 25 октября 2018

У меня есть скрипт , чтобы определить, сколько свободного места в стеке имеется в каждой задаче 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?
...