2012-11-20 59 views
2

我想在我的示踪剂打印返回值,有两个问题如何获取函数内的函数返回地址?

  1. 如何获得返回地址?
  2. 返回位置在〜Tracer()之前或之前更新?

在这里需要这样的文本格式#2的代码:

struct Tracer 
{ 
    int* _retval; 
    ~Tracer() 
    { printf("return value is %d", *_retval); } 
}; 


int foo() 
{ 
    Tracer __tracter = { __Question_1_how_to_get_return_address_here__ }; 

    if(cond) { 
    return 0; 
    } else { 
    return 99; 
    } 

    //Question-2: 
    // return postion is updated before OR after ~Tracer() called ??? 
} 

回答

2

您不能可移植或可靠地做到这一点在C++。返回值可能在内存中或寄存器中,可能会或可能不会在不同情况下中断。

您可能可以使用内联汇编在某些硬件/编译器上工作。

一种可能的方法是让您的Tracer模板引用返回值变量(适当时),并在破坏之前打印

另请注意,带有__(双下划线)的标识符是为实现保留的。

3

,我发现了一些线索问题-1,检查的VC代码现在

对于GCC,__builtin_return_address http://gcc.gnu.org/onlinedocs/gcc/Return-Address.html

对于Visual C++,_ReturnAddress

+0

我认为 “返回地址” 是指可执行文件代码位置将返回控制,*不*从当前函数返回的值。 –

+0

这是我的老问题,我尝试过VC,但是失败了...... – Raymond