我有一个脚本来计算每个 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")
但是不将语言设置回原来的样子似乎是错误的。
所以,
- 有没有办法从 Python 检测当前的 GDB 语言设置?
- 是否有另一种不依赖于当前 GDB 语言设置的索引方式?