__cyg_profile_function_enter在gcc和g ++之间的区别是什么?

时间:2016-01-19 01:14:05

标签: c++ gcc g++

我对__ attribute __和__cyg_profile_function_enter知之甚少。当然,它们都是gnu C的功能。

我正在使用C ++来编译Nginx模块。我总是尝试将C代码示例转换为C ++。

以下是C:

的简单示例
#include <stdio.h>
int depth_ = -1;
#ifdef __GNUC__
    void __cyg_profile_func_enter(void *, void *) __attribute__((no_instrument_function));
    void _cyg_profile_func_enter(void *, void *) __attribute__((no_instrument_function));
    #define sustainable(fn, caller) \
        do {\
            printf("%d, %s: fn = %p, caller = %p\n", depth_, __FUNCTION__, fn, caller); \
        } while(0)
    void __cyg_profile_func_enter(void *fn, void *caller){
        printf("Enter:\n");
        depth_++;
        sustainable(fn, caller);
    }
    void __cyg_profile_func_exit(void *fn, void *caller){
        printf("Exit:\n");
        depth_--;
        sustainable(fn, caller);
    }
#endif
void sustain(){    
    depth_ = 100;
}

int main(){
    depth_ = 10;
    sustain();
    //Suture suture;
    //suture.sultry();
    return 0;
}

sh $ gcc -finstrument-functions ...

循环显示Enter: 101, __cyg_profile_func_enter: fn = 0x400645, caller = 0x4006baExit: 100, __cyg_profile_func_exit: fn = 0x400645, caller = 0x4006ba

这是C ++代码:

#include <iostream>
using namespace std;
int depth_ = -1;
#ifdef __GNUC__
extern "C" {

    void __cyg_profile_func_enter(void *, void *) __attribute__((no_instrument_function));
    void __cyg_profile_func_exit(void *, void *) __attribute__((no_instrument_function));
    #define sustainable(fn, caller) \
        do{ \
            printf("%d, %s: fn = %p, caller = %p\n", depth_, __FUNCTION__, fn, caller); \
        } while(0)
    void __cyg_profile_func_enter(void *fn, void *caller){
        printf("Enter:\n");
        depth_++;
        sustainable(fn, caller);
    }
    void __cyg_profile_func_exit(void *fn, void *caller){
        printf("Exit:\n");
        depth_--;
        sustainable(fn, caller);
    }
}
#endif

void sustain(){
    depth_ = 100;
}

class Suture
{
public:
    void sultry(){

    }

};

int main(int argc, char **argv){
    sustain();
    Suture suture;
    suture.sultry;

}

sh $ g ++ -std = c ++ 11 -finstrument-functions ....

循环显示Enter: 2, __cyg_profile_func_enter: fn = 0x400925, caller = 0x40099bExit: 1, __cyg_profile_func_exit: fn = 0x400925, caller = 0x40099b

这很奇怪。为什么depth_ = 100适用于gcc而不适用于g ++?

1 个答案:

答案 0 :(得分:0)

您希望fn成为哪个函数的地址?我没有看到main()中的函数调用应该在分配depth_后发生。

如果你看到重复的呼叫,它们必须归功于库函数,这些函数很可能在depth_ = 100;赋值之前执行。