news 2026/4/23 12:42:22

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/4/23 11:46:23

告别窗口迷失:DockDoor如何用3个技巧让Mac多任务效率翻倍

作为一名每天需要同时处理十几个窗口的设计师&#xff0c;李明经常陷入这样的困境&#xff1a;在Photoshop、Sketch和浏览器参考页面之间来回切换时&#xff0c;总是花费大量时间寻找正确的窗口。直到他发现了DockDoor&#xff0c;这个macOS窗口预览工具彻底改变了他的工作方式…

作者头像 李华
网站建设 2026/4/23 11:46:26

毕设开源 基于协同过滤的电影推荐系统

文章目录0 简介1 设计概要2 课题背景和目的3 协同过滤算法原理3.1 基于用户的协同过滤推荐算法实现原理3.1.1 步骤13.1.2 步骤23.1.3 步骤33.1.4 步骤44 系统实现4.1 开发环境4.2 系统功能描述4.3 系统数据流程4.3.1 用户端数据流程4.3.2 管理员端数据流程4.4 系统功能设计5 主…

作者头像 李华
网站建设 2026/3/17 15:55:41

抖音批量下载助手完整使用指南:告别手动保存烦恼

抖音批量下载助手完整使用指南&#xff1a;告别手动保存烦恼 【免费下载链接】douyinhelper 抖音批量下载助手 项目地址: https://gitcode.com/gh_mirrors/do/douyinhelper 还在为一个个手动保存抖音视频而烦恼吗&#xff1f;想要高效收集喜欢的创作者内容却不知从何下手…

作者头像 李华
网站建设 2026/4/23 11:50:11

科研数据管理新思路:基于anything-llm的元数据检索系统

科研数据管理新思路&#xff1a;基于anything-LLM的元数据检索系统 在今天的科研环境中&#xff0c;一个再普通不过的课题组可能已经积累了上百GB的PDF论文、实验记录、项目报告和会议纪要。这些文档大多以非结构化形式散落在个人电脑、U盘或共享文件夹中&#xff0c;查找某一…

作者头像 李华
网站建设 2026/4/22 23:04:53

47、WinJS 动画与 CSS 动画和过渡的使用指南

WinJS 动画与 CSS 动画和过渡的使用指南 在开发中,动画的选择不应仅仅基于视觉效果,而应考虑其语义含义,在合适的时间和地点使用合适的动画。下面将详细介绍 WinJS 动画以及 CSS 动画和过渡的相关内容。 WinJS 动画使用提示 提示 1 :所有 WinJS 动画都是使用 WinJS.UI.…

作者头像 李华
网站建设 2026/4/23 11:33:39

48、CSS动画与Windows 8合约:从基础到优化

CSS动画与Windows 8合约:从基础到优化 1. HTML独立动画示例 在HTML独立动画示例中,场景1通过滑块占用UI线程的时间(即阻塞该线程),展示了独立动画与依赖动画的区别。当你移动滑块增加UI线程的工作量时,顶部的红色球移动变得不流畅,而底部的绿色球则始终平滑移动。 这里…

作者头像 李华