2017年11月7日 星期二

[C] How to build up the call tree?


實驗:
利用 compiler tool( https://gcc.godbolt.org/)翻譯為組語
並做說明(留意下註解中的順序)


當呼叫printCallTree即可將call tree上的函式位置printf出來(或存在ram),
然後再用腳本(offline)將位置對應到map檔中的symbo,
得到call tree
這樣的程式可以放在Exception ISR中,
得知fun的呼叫關係,
增加debug的資訊。

p.s 實作時需要參考IC的calling convertion

C:
void printCallTree(){}

void callee(){ callee2();}

void caller(void){callee();}

assembly:
callStack(): #1 暫存器RA可以反查到 text.callee()

...

callee():
addiu $sp,$sp,-32
sw $31,28($sp) #3, 從這可反推RA放在stack的哪,而RA又可以找到caller()_
sw $fp,24($sp)
move $fp,$sp
jal callee2() #2 從text這往上找到 push ra的指令
nop

nop
move $sp,$fp
lw $31,28($sp)
lw $fp,24($sp)
addiu $sp,$sp,32
j $31
nop

caller():
addiu $sp,$sp,-32
sw $31,28($sp) #5 同理
sw $fp,24($sp)
move $fp,$sp
jal callee() #4 同理
nop

nop
move $sp,$fp
lw $31,28($sp)
lw $fp,24($sp)
addiu $sp,$sp,32
j $31
nop

沒有留言:

張貼留言