讲师中心 微信公众号
AI工具推荐 视频效率加速

c++ linux perf探针 c++如何为程序添加sd t探针

冬伟酱_7517

冬伟酱_7517

发布时间:2026-03-19 22:21:31

|

340人浏览过

|

来源于php中文网

原创

添加SDT探针前必须确认程序含debuginfo和.note.stapsdt段,编译需加-g并用asm volatile插入标记,perf probe须指定绝对路径,参数解析需手动处理。

c++ linux perf探针 c++如何为程序添加sd t探针

perf probe 添加 SDT 探针前,先确认程序带 debuginfo 和 SDT 标记

没符号、没标记,perf probe 就是盲人摸象。SDT(Statically Defined Tracing)探针不是自动埋点,得你自己加,而且编译时得保留调试信息和特殊 section。

  • 编译 C++ 程序时必须加 -g(生成 DWARF),否则 perf probe -l 看不到任何用户探针
  • 用 gcc 或 g++ 时,需链接 libstapsdt(或直接内联宏),但更常用的是用 asm volatile 写原始标记 —— 因为 libstapsdt 在多数发行版默认不装,且 C++ name mangling 会让探针名难匹配
  • 检查是否真有 SDT section:readelf -x .note.stapsdt ./myapp;为空就说明没埋成功

用 asm volatile 埋点,绕过 C++ 名字修饰问题

别信“只要函数名对就能 probe”,C++ 函数经过 mangling 后,perf probe 根本不认识。直接在关键位置插汇编标记最稳。

  • 在源码里插入类似这样的代码(注意:必须在函数体内、不能在头文件里重复定义):
#ifdef __linux__
#define MY_SDT_PROBE() \
  asm volatile (".note.stapsdt.1; .asciz \"provider\"; .asciz \"probe_name\"; .asciz \"\"; .quad 0; .quad 0; .quad 0; .previous" ::: "r0", "r1", "r2")
#else
#define MY_SDT_PROBE()
#endif
  • 实际使用时,在你想观测的逻辑点调用 MY_SDT_PROBE(),比如 if (verbose) { MY_SDT_PROBE(); }
  • 标记里的 provider 和 probe_name 会出现在 perf probe -l 输出中,例如 myapp:provider:probe_name
  • 不要用变量名或 this 指针做参数传入 asm —— SDT 不支持动态参数绑定,只占位,后续靠 perf script 解析寄存器/栈

perf probe 命令要带 -x 并指定绝对路径

perf probe 默认查当前目录或 PATH 下的二进制,但实际运行的可能是带版本号的路径、或被 systemd 拉起的非标准路径。错路径 = 找不到探针。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 务必用 perf probe -x /path/to/myapp -l 列出所有可用 SDT 探针,确认输出里有你的 provider:probe_name
  • 添加时也必须带 -x:perf probe -x /path/to/myapp 'provider:probe_name'
  • 如果提示 No symbol found for probe,八成是路径不对,或者二进制被 strip 过(检查 file ./myapp 是否含 not stripped)
  • 加完后用 perf list | grep sdt 验证是否注册成功

perf record + script 抓到探针后,参数解析得自己写逻辑

SDT 探针本身不带类型信息,perf script 输出只有地址和 raw 字节,没有自动解包的 %arg1 之类 —— 这点和 USDT(BCC/eBPF)完全不同。

立即学习“C++免费学习笔记(深入)”;

  • perf script -F trace_fields,comm,pid,tid,event,ip,sym 能看到触发事件,但参数列全是空或十六进制 dump
  • 想读取探针附近栈或寄存器值,得结合 perf script -F ip,sym,brstack --no-children,再人工对照汇编定位参数位置
  • 如果用了 libstapsdt 的 STAP_PROBE 宏,它会在标记里写入参数偏移,但需要你用 perf script -F event,ip,args(仅较新 kernel + perf 支持),且 C++ 成员函数仍可能因 this 调整导致 offset 偏移
  • 简单场景建议只用探针做「打点计数」或「触发时机判断」,别指望自动抓 std::string 或对象字段

真正麻烦的从来不是加 probe,而是怎么让那个 .note.stapsdt section 在 strip、RPM 构建、容器镜像分层里不被删掉 —— 这部分没标准流程,得盯紧构建链路每一步。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6419

2023.08.02

c++中volatile关键字的作用
c++中volatile关键字的作用

本专题整合了c++中volatile关键字的相关内容,阅读专题下面的文章了解更多详细内容。

774

2025.10.23

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

359

2026.04.23

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

5867

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2508

2023.08.10

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

4130

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

3493

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

2713

2023.06.30

Playwright 测试失败怎么办
Playwright 测试失败怎么办

Playwright测试失败专题汇集超时、定位器匹配、浏览器提前关闭、依赖与插件配置、文件上传、SSL及Docker启动等故障文章,并介绍通过截图、报告和Trace定位错误。

0

2026.10.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn