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)
但是,如果不将语言重新设置为原来的语言,这似乎是错误的。
所以,
归档时间: |
|
查看次数: |
78 次 |
最近记录: |