简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
1.前言
本篇目的:理解GCC的-finstrument-functions选项用法
2.GCC编译器:-finstrument-functions介绍
-
GCC编译器的
-finstrument-functions
选项用于在函数调用和返回时插入特定的回调函数,以便在程序执行期间进行函数级跟踪和探查。这个特性可以用于调试、性能分析和代码覆盖率测量等方面。当使用这个选项编译程序时,编译器会在函数的入口和出口处插入指定的函数调用,以便监控函数的执行过程。 -
具体来说,当使用
-finstrument-functions
选项编译程序时,编译器会在函数的入口处调用__cyg_profile_func_enter
函数,以及在函数的出口处调用__cyg_profile_func_exit
函数。这样就可以在这两个函数中实现特定的逻辑,例如记录函数的调用信息、执行时间、参数等等。 -
对于这两个回调函数的具体定义和实现可以根据用户的需求进行自定义。用户可以根据自己的要求来在这两个回调函数中实现特定的逻辑,例如记录函数的执行时间、记录函数调用栈信息、进行性能分析等。
-
需要注意的是,使用
-finstrument-functions
选项会给程序带来额外的开销,因为每个函数的调用和返回都需要执行额外的操作。因此,在生产环境中使用时需要权衡好性能损耗和获取的调试、分析信息的价值。 -
-finstrument-functions
选项提供了一种在函数级别对程序进行跟踪和探查的方法,可以用于调试、性能分析、代码覆盖率测量等方面。
3.代码实例
#include <cstdio>
extern "C" {
void __cyg_profile_func_enter(void *func, void *caller) __attribute__((no_instrument_function));
void __cyg_profile_func_exit(void *func, void *caller) __attribute__((no_instrument_function));
}
void __cyg_profile_func_enter(void *func, void *caller) {
printf("Enter function %p from %p\n", func, caller);
}
void __cyg_profile_func_exit(void *func, void *caller) {
printf("Exit function %p from %p\n", func, caller);
}
void bar() {
printf("Inside bar\n");
}
void foo() {
printf("Inside foo\n");
bar();
}
int main() {
foo();
return 0;
}
编译:g++ -finstrument-functions call_stack.cpp
打印:
Enter function 0x55910ba862ea from 0x7f1f993c2d90
Enter function 0x55910ba8626d from 0x55910ba86312
Inside foo
Enter function 0x55910ba861f5 from 0x55910ba862a4
Inside bar
Exit function 0x55910ba861f5 from 0x55910ba862a4
Exit function 0x55910ba8626d from 0x55910ba86312
Exit function 0x55910ba862ea from 0x7f1f993c2d90