-3

您能否提供任何示例如何验证函数 X() 是从函数 Y() 而不是从函数 Z() 调用的?

使用“C”或汇编语言?

提前致谢。

更新:02-03-2015

  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)); 返回字节输入;}

    uint8_t GPIO_read_write(uint8_t byte_out, char *s)// 函数2 { bzero(s,sizeof(struct_global2)); 返回字节输入;}

    int main()// 测试驱动 { SPI_read_write(arg1,arg2);// 当我从测试驱动调用这个函数时,它会调用 bzero
    }

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

更新 15-04-2017

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

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

4

2 回答 2

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()

演示。

于 2017-02-12T16:31:19.520 回答
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()的手册页,它可以让您更深入地了解如何查看在进入当前函数之前调用的函数。

于 2017-02-12T16:37:45.343 回答