首页 > 解决方案 > 在 GDB Python 脚本中,如果框架的语言是 Ada,则数组索引将失败

问题描述

我有一个脚本来计算每个 FreeRTOS 任务中有多少可用堆栈空间。GDB 的语言设置为auto. 当前语言为 时脚本工作正常c,但当前语言为时失败ada

我在课堂Stacks上,

tcb_t = gdb.lookup_type("TCB_t")
int_t = gdb.lookup_type("int")

用于:

找到{Ada任务控制块}.Common.Thread,

thread = atcb["common"]["thread"]

转换为指向 FreeRTOS 任务控制块的指针,

tcb = thread.cast(Stacks.tcb_t.pointer()).dereference()

找到堆栈的逻辑顶部

stk = tcb["pxStack"].cast(Stacks.int_t.pointer())

现在我需要在堆栈中进行逻辑循环,直到找到不等于初始化值的条目,

free = 0
while stk[free] == 0xa5a5a5a5:
    free = free + 1

如果当前框架的语言是 ,则效果很好c,但如果是ada我得到

Python Exception <class 'gdb.error'> 不是数组或字符串:Python 命令中发生错误:不是数组或字符串

我已经将此追溯到表达式stk[free],它正在使用当前语言的规则进行解释(在 Ada 中,数组索引使用括号,所以它会是stk(free),这当然是非法的,因为 Python 将其视为函数调用)。

我已经解决了这个问题

def invoke(self, arg, from_tty):
    gdb.execute("set language c")
    ...
    gdb.execute("set language auto")

但是不将语言设置回原来的样子似乎是错误的。

所以,

标签: adafreertosgdb-python

解决方案


推荐阅读