在GDB Python脚本中,如果框架的语言为Ada,则数组索引编制将失败

Sim*_*ght 5 ada freertos gdb-python

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

我,在班上Stacks

tcb_t = gdb.lookup_type("TCB_t")
int_t = gdb.lookup_type("int")
Run Code Online (Sandbox Code Playgroud)

过去曾:

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

thread = atcb["common"]["thread"]
Run Code Online (Sandbox Code Playgroud)

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

tcb = thread.cast(Stacks.tcb_t.pointer()).dereference()
Run Code Online (Sandbox Code Playgroud)

找到堆栈的逻辑顶部

stk = tcb["pxStack"].cast(Stacks.int_t.pointer())
Run Code Online (Sandbox Code Playgroud)

现在,我需要在逻辑上向下循环堆栈,直到找到与初始化值不相等的条目为止,

free = 0
while stk[free] == 0xa5a5a5a5:
    free = free + 1
Run Code Online (Sandbox Code Playgroud)

如果当前帧的语言是工作正常c,但如果这是ada我得到的

Python异常<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")
Run Code Online (Sandbox Code Playgroud)

但是,如果不将语言重新设置为原来的语言,这似乎是错误的。

所以,

  • 有没有一种方法可以从Python中检测当前的GDB语言设置?
  • 是否有不依赖于当前GDB语言设置的替代索引方式?