Microchip
直播中

温洁

7年用户 200经验值
私信 关注
[问答]

如何在C函数中获取返回地址?

在一个函数中,我需要记录/保存函数被调用的地方。返回地址只是当前的FP - 4,还是有更多的内容?我必须说,我并不完全理解FP和SP之间的关系,它在文献中并没有得到很好的解释。
                    
                    
以上来自于百度翻译

               
                                                                                      以下为原文

                                                                            Inside a function, I need to log / save where a function was called from.
Is the return address just the current FP- 4  or is there more to it?

I must say that I do not fully understand the relationship between the FP and SP and it is not really explained well enough in the documentation.

Regards
X

回帖(5)

唐红菊

2018-8-24 15:59:53
如果函数是叶函数,返回地址根本不必存储在堆栈上。你唯一可以肯定的是,在函数条目上,它是用$RA保持的。
                    
                    
以上来自于百度翻译

               
                                                                                      以下为原文

                                                                            If the function is a leaf function, the return address is not necessarily stored on the stack at all. The only thing you can say with certainty is that on function entry, it is held in $ra.
举报

陈杰

2018-8-24 16:10:01
也许在函数中,您可以在我的所有函数中添加类似的代码,将函数地址存储到面包屑循环列表中,同时进行调试以找到导致问题的函数序列。
                    
                    
以上来自于百度翻译

               
                                                                                      以下为原文

                                                                            Maybe in the function you could store

(unsigned long)(void*)(main) // to store the address of main in the breadcrumb list

I have added similar code to all my functions to store the function address to a circular list of breadcrumbs while debugging to find the sequence of functions leading up to a problem.
举报

毕凯

2018-8-24 16:18:00
我想这样的事会成功的。
                    
                    
以上来自于百度翻译

               
                                                                                      以下为原文

                                                                            I think something like this will do it.
 
uintptr_t return_addr = 0;

 asm("move %0, $ran"
  : "=r" (return_addr));
举报

胡芝恒

2018-8-24 16:26:59
以上来自于百度翻译

               
                                                                                      以下为原文

                                                                           
uint32_t ret_addr = (uint32_t)__builtin_return_address(0);
举报

更多回帖

发帖
×
20
完善资料,
赚取积分