news 2026/6/15 16:20:44

gcc插桩函数功能及使用方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
gcc插桩函数功能及使用方法

gcc -finstrument-functions是一个编译选项,它用于在编译时对函数进行插桩(instrumentation),主要用于程序的调试、性能分析和调用跟踪。

主要功能

1.自动插入跟踪代码

  • 在每个函数的入口处自动插入对__cyg_profile_func_enter()的调用
  • 在每个函数的出口处自动插入对__cyg_profile_func_exit()的调用

2.实现原理

// 编译前voidmy_function(){// 你的代码}// 编译后(概念上)voidmy_function(){__cyg_profile_func_enter(__func__,__call_site__);// 你的代码__cyg_profile_func_exit(__func__,__call_site__);}

使用方法

1.编译时

gcc -finstrument-functions -o program program.c

2.需要实现的回调函数

你需要自己实现这两个函数:

// 在你的代码中定义void__cyg_profile_func_enter(void*func_addr,void*call_site){// 记录函数进入printf("Enter: %p called from %p\n",func_addr,call_site);}void__cyg_profile_func_exit(void*func_addr,void*call_site){// 记录函数退出printf("Exit: %p called from %p\n",func_addr,call_site);}

实际应用示例

#include<stdio.h>// 插桩回调函数void__cyg_profile_func_enter(void*func_addr,void*call_site){printf("--> %p\n",func_addr);}void__cyg_profile_func_exit(void*func_addr,void*call_site){printf("<-- %p\n",func_addr);}// 测试函数voidfoo(){printf("In foo\n");}voidbar(){printf("In bar\n");foo();}intmain(){printf("Starting...\n");bar();return0;}

编译运行:

gcc -finstrument-functions -otesttest.c ./test

输出可能类似:

--> 0x40057d # main 进入 Starting... --> 0x400547 # bar 进入 In bar --> 0x400536 # foo 进入 In foo <-- 0x400536 # foo 退出 <-- 0x400547 # bar 退出 <-- 0x40057d # main 退出

常见用途

  1. 性能分析:统计函数调用次数和执行时间
  2. 调试:跟踪函数调用序列
  3. 调用图生成:分析程序结构
  4. 内存分析:配合其他工具进行内存跟踪

注意事项

  1. 性能开销:每个函数调用都会增加额外开销
  2. 递归函数:需要小心处理,避免无限递归
  3. 排除特定函数:可以使用__attribute__((no_instrument_function))
    __attribute__((no_instrument_function))voiddont_instrument_this(){// 这个函数不会被插桩}

相关选项

  • -finstrument-functions-exclude-file-list=:排除特定文件的函数
  • -finstrument-functions-exclude-function-list=:排除特定函数

这个功能在需要深入分析程序行为时非常有用,特别是在没有源代码或需要全局跟踪的情况下。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 14:58:55

网盘直链下载助手:解锁六大云盘高速下载权限的完整指南

网盘直链下载助手&#xff1a;解锁六大云盘高速下载权限的完整指南 【免费下载链接】baiduyun 油猴脚本 - 一个免费开源的网盘下载助手 项目地址: https://gitcode.com/gh_mirrors/ba/baiduyun 还在为网盘下载速度缓慢而苦恼吗&#xff1f;网盘直链下载助手作为一款免费…

作者头像 李华
网站建设 2026/6/10 10:55:28

新库上线 | CnOpenData 1998-2025.10月美国企业社会责任报告数据

一、数据简介本数据库系统收录了美国上市公司及大型企业发布的年度社会责任报告。这些报告是企业自愿披露其在可持续发展、员工权益、环境保护、社区贡献等非财务绩效的关键文档&#xff0c;反映了企业的社会责任实践和长期发展理念。数据包含完整的企业基本信息、报告元数据以…

作者头像 李华
网站建设 2026/6/15 13:00:44

全面掌握UEFI固件分析工具:从入门到实战应用

全面掌握UEFI固件分析工具&#xff1a;从入门到实战应用 【免费下载链接】UEFITool UEFI firmware image viewer and editor 项目地址: https://gitcode.com/gh_mirrors/ue/UEFITool UEFI固件分析工具是现代计算机系统研究不可或缺的利器&#xff0c;它让复杂的固件结构…

作者头像 李华
网站建设 2026/6/15 14:20:24

零基础学习T触发器:一文说清工作方式

从翻转到分频&#xff1a;彻底搞懂T触发器的底层逻辑你有没有想过&#xff0c;一个简单的“0变1、1变0”操作&#xff0c;是如何支撑起整个数字世界的节奏控制的&#xff1f;在嵌入式系统里&#xff0c;LED为什么能稳定闪烁&#xff1f;ADC采样为何总能精准同步&#xff1f;这些…

作者头像 李华
网站建设 2026/6/15 14:12:35

8分钟精通Scarab:重新定义空洞骑士模组管理体验

8分钟精通Scarab&#xff1a;重新定义空洞骑士模组管理体验 【免费下载链接】Scarab An installer for Hollow Knight mods written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 还在为空洞骑士模组安装的繁琐流程而苦恼吗&#xff1f;每次手动复…

作者头像 李华
网站建设 2026/6/15 15:14:14

Cowabunga Lite终极指南:5分钟上手iOS深度个性化

Cowabunga Lite终极指南&#xff1a;5分钟上手iOS深度个性化 【免费下载链接】CowabungaLite iOS 15 Customization Toolbox 项目地址: https://gitcode.com/gh_mirrors/co/CowabungaLite 想要让你的iPhone焕然一新&#xff0c;却又不想越狱&#xff1f;Cowabunga Lite就…

作者头像 李华