c++ dtrace/systemtap c++如何使用动态追踪工具分析程序

冬伟酱_7517

冬伟酱_7517

2026-03-19

882人浏览

原创

c++oding="utf-8" ?>

linux 上基本不能直接用 dtrace 分析 c++ 程序,因其原生不支持 linux,第三方移植版对 c++ name mangling 解析极弱,连 main 都常漏掉。

c++ dtrace/systemtap c++如何使用动态追踪工具分析程序

为什么 dtrace 在 Linux 上基本不能直接用 C++ 程序

Linux 默认没有 dtrace,它原生属于 Solaris/macOS;你装的所谓“Linux dtrace”大概率是 systemtap 或第三方移植版(如 DTrace for Linux),但支持极弱——尤其对 C++ 符号解析几乎失效。C++ 的 name mangling 让 dtrace -n 'pid$target::foo:entry' 这类写法十有八九找不到函数,连 main 都可能漏掉。

实操建议:

C++14
C++14

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

下载
  • 别在 Linux 上强推 dtrace 分析 C++,除非你用的是 Oracle Linux + UEK 内核且已确认 dtplink 支持你的编译器版本
  • 用 readelf -sW your_binary | c++filt 手动确认符号是否存在、是否被内联或优化掉
  • 若必须用 dtrace,优先选 macOS(Clang 编译 + -fno-omit-frame-pointer)

systemtap 怎么安全 hook C++ 成员函数

systemtap 本身不理解 C++ 语法,所有函数名都得按 mangled 名匹配。但硬写 mangled 名极易出错,且不同编译器(GCC/Clang)、不同标准库(libstdc++/libc++)生成的符号完全不同。

实操建议:

  • 用 nm -C your_binary | grep 'YourClass::yourMethod' 查可识别的 demangled 名,再用 c++filt 反查对应 mangled 名
  • 在 .stp 脚本里写 probe process("a.out").function("Z12YourClass7yourMethodv"),而不是 .function("YourClass::yourMethod")
  • 加 -g -O0 编译,避免内联;否则 yourMethod 可能根本不出现在符号表里
  • 成员函数的 this 指针在 $self 中,但需用 cast($self, "YourClass", "your_binary") 才能访问成员变量

用 perf + libbcc(BPF)替代方案更靠谱

Linux 上真正实用的 C++ 动态追踪,是绕过传统 probe 工具,直接用 perf 采样栈 + bcc(如 funccount、trace)做用户态函数计数。它依赖 DWARF 信息,对 C++ 支持远好于 systemtap。

实操建议:

  • 编译时加 -g -fno-omit-frame-pointer,确保 DWARF 和调用栈完整
  • 用 sudo /usr/share/bcc/tools/funccount -p $(pidof your_app) 'YourClass::yourMethod' —— 这里支持 demangled 名,funccount 会自动查符号表
  • 遇到 failed to resolve symbol?说明函数被 inlined 或符号被 strip,检查 file your_binary 输出是否含 not stripped
  • 高频调用函数慎用 trace,BPF eBPF verifier 对指令数有限制,容易报 invalid bpf program

调试符号缺失时,addr2line 是唯一可信 fallback

当 systemtap 或 bcc 报 “symbol not found”,又没法重编译加 -g,别猜函数名——直接用地址定位。

实操建议:

  • 运行中用 cat /proc/$(pidof your_app)/maps 找代码段起始地址,结合 gdb -p $(pidof your_app) -ex 'info proc mappings' -ex q
  • 用 perf record -e cycles:u -g -p $(pidof your_app) 录一段,再 perf script | head -20 看原始地址
  • 最后用 addr2line -e your_binary -f -C 0x7f8b2c1a1234(地址来自 perf 输出)反查函数名和行号
  • 注意:addr2line 不依赖运行时符号表,只靠 ELF 中的 .debug_* 段,哪怕二进制被 strip 过,只要没删 debug info 就有效

事情说清了就结束。C++ 动态追踪最卡壳的地方从来不是工具选型,而是你手上的二进制有没有留下足够线索——符号、帧指针、DWARF,缺一不可。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

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

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

下载

相关标签:

c++

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

相关专题

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

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

2026.04.23

359

31

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

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

2023.07.18

5647

5

堆和栈区别
堆和栈区别

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

2023.08.10

2448

6

function是什么
function是什么

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果。本专题为大家提供function是什么的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.04

3020

5

js函数function用法
js函数function用法

js函数function用法有:1、声明函数;2、调用函数;3、函数参数;4、函数返回值;5、匿名函数;6、函数作为参数;7、函数作用域;8、递归函数。本专题提供js函数function用法的相关文章内容,大家可以免费阅读。

2023.10.07

514

5

macOS怎么切换用户账户
macOS怎么切换用户账户

在 macOS 系统中,可通过多种方式切换用户账户。如点击苹果图标选择 “系统偏好设置”,打开 “用户与群组” 进行切换;或启用快速用户切换功能,通过菜单栏或控制中心的账户名称切换;还能使用快捷键 “Control+Command+Q” 锁定屏幕后切换。

2025.05.09

4504

14

oracle清空表数据
oracle清空表数据

当表中的数据不需要时,则应该删除该数据并释放所占用的空间。本专题为大家提供oracle清空表数据的相关文章,帮助大家解决该问题。

2023.08.16

961

5

Oracle中declare的使用
Oracle中declare的使用

Oracle DECLARE语句是PL/SQL编程语言中用于声明变量、常量、游标或异常的关键字。它的主要作用是在程序中定义这些对象,以便在后续的代码中使用。DECLARE语句的语法简单明了,可以根据需要声明多个对象。通过使用这些声明的对象,可以进行各种操作,如计算、查询数据库、处理异常等 。

2023.09.15

2793

5

oracle怎么分页
oracle怎么分页

实现分页的步骤:1、使用ROWNUM进行分页查询;2、在执行查询之前进行设置分页参数;3、使用"COUNT(*)"函数来获取总行数,并使用"CEIL"函数来向上取整计算总页数;4、在外部查询中使用"WHERE"子句来筛选出特定的行号范围,以实现分页查询。想了解更多oracle怎么分页的文章,可以来阅读本专题先的文章。

2023.09.18

2810

5

热门下载

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

精品课程

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

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

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

共0课时 | 0人学习