news 2026/6/9 21:29:51

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/9 22:48:25

Ubuntu入门学习教程,从入门到精通,Ubuntu 22.04的远程登录(6)

Ubuntu 22.04的远程登录 6.1 快速上手&#xff1a;搭建实验环境 6.1.1 物理网络 vs 虚拟机 物理网络&#xff1a;真实硬件组成的网络&#xff0c;适合生产环境&#xff08;如企业服务器&#xff09;。虚拟机&#xff1a;通过软件模拟的虚拟环境&#xff08;如 VMware、Virtu…

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

50、深入探究数据共享:从基础到高级特性

深入探究数据共享:从基础到高级特性 1. 数据共享基础代码 在数据共享的实现中,有一段关键代码用于处理流引用和数据请求: var streamReference = Windows.Storage.Streams.RandomAccessStreamReference .createFromStream(inMemoryStream); request.setData(streamRefe…

作者头像 李华
网站建设 2026/6/10 7:47:31

把 SAP ABAP CDS 视图当成远程 API 来用时,为什么一定要认准稳定性契约 C2

在很多项目里,业务数据并不只在一个 SAP 系统里流转。移动端、供应商门户、外部报表平台、第三方 WMS、甚至你在 SAP BTP 上做的 Side-by-Side 应用,都可能需要读取或查询 S/4HANA 里的业务对象数据。最常见的做法之一,就是通过外部服务把数据开放出去,比如 OData 服务,让…

作者头像 李华
网站建设 2026/6/10 9:01:59

Cowabunga Lite 完全指南:iOS 15+ 设备个性化定制工具深度解析

Cowabunga Lite 完全指南&#xff1a;iOS 15 设备个性化定制工具深度解析 【免费下载链接】CowabungaLite iOS 15 Customization Toolbox 项目地址: https://gitcode.com/gh_mirrors/co/CowabungaLite Cowabunga Lite 是一款功能强大的 iOS 15 设备非越狱定制工具&#…

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

2025 学术工具测评:7 款降重降 AIGC 率工具测评

当 “重复率超标”“AIGC 检测红牌” 成为学术写作的 “高频焦虑”&#xff0c;市面上的降重工具早已从 “单一改字” 进化为 “合规化解决方案”。本文筛选 7 款主流工具&#xff0c;从功能、效果、适配场景三大维度拆解&#xff0c;看看谁能真正解决你的 “学术合规难题”——…

作者头像 李华
网站建设 2026/6/10 9:09:29

Windows 11远程桌面多用户终极解决方案:RDP Wrapper完整指南

还在为Windows系统只能单用户远程连接而苦恼吗&#xff1f;RDP Wrapper Library这款开源工具能够帮你轻松扩展功能&#xff0c;让家庭版系统也能实现多人同时远程访问。无论你是IT爱好者、远程办公用户还是技术支持人员&#xff0c;这份指南都将为你提供简单实用的配置方法。 【…

作者头像 李华