如何验证从函数Y()调用函数X()而不是函数Z()?

时间:2017-02-12 16:21:41

标签: c gcc assembly lynxos

你能告诉我任何一个例子如何验证从函数Y()调用函数X()而不是函数Z()?

使用'C'或汇编语言?

提前致谢。

更新:2015年2月3日

  1. 假设内核源代码有很多驱动程序调用相同的函数,如SPI(串行外设接口)的驱动程序源代码和GPIO(通用输入输出)调用相同的函数,例如“bzero()”。

      

    void bzero(void * s,size_t n);

  2. 我将测试SPI和GPIO驱动程序(无法修改驱动程序代码)。为此我写了测试驱动程序。我只能调用从我的测试驱动程序中公开的函数。

    uint8_t SPI_read_write(uint8_t byte_out,char * s)//功能1 {     bzero(S,的sizeof(struct_global1));     return byte_in; }

    uint8_t GPIO_read_write(uint8_t byte_out,char * s)//功能2 {     bzero(S,的sizeof(struct_global2));     return byte_in; }

    int main()//测试驱动程序 {     SPI_read_write(arg1,arg2); //当我从测试驱动程序调用此函数时,它将调用bzero
    }

  3. finlect SPI_read_write()和GPIO_read_write()函数都调用“bzero”函数。 我需要确保只在SPI_read_write()函数的任何实例中调用“bzero”。

  4. 更新15-04-2017

    我无法确定哪条线不清楚?一些函数fun1()可以从N个其他函数中调用。如何确定哪个函数叫做fun1()?

    可能它与堆栈,链接寄存器有关...

2 个答案:

答案 0 :(得分:2)

无法确定调用函数的函数的名称。这完全是设计的,因为函数旨在提供封装独立于调用站点的计算或活动的抽象。因此,如果您想知道哪个函数正在调用您的函数,则调用者需要提供此信息。

符合C99标准的编译器提供了一种确定当前函数名称的方法,可用于传递给目标函数,如下所示:

#define X() x(__func__)

void x(const char* caller) {
    printf("x() is called from %s()\n", caller);
}
void y() {
    X();
}
void z() {
    X();
}

以上打印

x() is called from y()
x() is called from z()

Demo.

答案 1 :(得分:0)

 #include <execinfo.h>
 #include <stdio.h>

 void print_function(void *p) {
    char cmd[128];
    FILE *fp;
    snprintf(cmd, sizeof(cmd), "addr2line -e %s -f %p", "print_caller", p);
    fp = popen(cmd, "r");
    if (fp) {
        char buf[128];
        while (fgets(buf, sizeof(buf), fp)) {
           printf("%s", buf);
        }
    }
 }

 void Y() 
{
    print_function(__builtin_return_address(0));
}

void X()
{
    Y();
}

int main()
{
   X();
   return 0;
}

 $ gcc -g -o print_caller print_caller.c
 $ ./print_caller
 X
 /home/viswesn/print_caller.c:24

我还建议您查看BACKTRACE()的手册页,它可以让您更深入地了解如何在进入当前功能之前查看已调用的函数。