Linux c/c++ 开发工具链常用功能汇总
开发过程中许多工具经常是配置一次用一段时间,记录备查。
编译器:
-
-
GCC
-
-
性能分析:
-
火焰图(Flame Graphs)perf +
-
将 perf(Linux 性能分析工具)与火焰图(FlameGraph)结合使用,可以直观地定位系统的性能瓶颈(如 CPU、内存、I/O 等)。以下是两者联动的详细步骤:
-
-
1. 安装必要工具
1.1 安装
perf在 Linux 系统中安装
perf(通常包含在linux-tools包中):bash1.2 下载 FlameGraph 脚本
从 GitHub 克隆火焰图生成工具:
bash2. 使用
perf采集性能数据2.1 采集 CPU 热点数据
记录进程或系统的 CPU 调用栈(示例采集 10 秒):
bash-F 99: 采样频率为 99 Hz(避免与某些硬件计数器冲突)-a: 监控所有 CPU-g: 记录调用栈(生成火焰图的关键)sleep 10: 采集持续 10 秒
2.2 其他常用选项
- 监控特定进程:
-p <PID> - 监控特定线程:
-t <TID> - 记录事件类型:
-e <event>(如-e cache-misses内存缓存未命中)
3. 生成火焰图
3.1 导出
perf.data为文本格式bash3.2 生成火焰图
使用 FlameGraph 脚本处理数据:
bashstackcollapse-perf.pl: 折叠perf输出的调用栈flamegraph.pl: 生成 SVG 格式火焰图
4. 查看火焰图
用浏览器打开生成的
flamegraph.svg:- 横向宽度:表示函数或代码路径的耗时占比。
- 纵向堆叠:表示调用栈层级,顶层是正在执行的函数,底层是调用链的起点。
- 交互操作:点击可放大特定区域,悬停显示详细信息。
5. 高级用法
5.1 按需生成特定火焰图
- CPU 火焰图:默认生成。
- 内存火焰图:使用
perf mem record采集内存事件。 - Off-CPU 火焰图:分析进程阻塞时间(需结合
perf sched)。
5.2 自动化脚本
将以下命令保存为脚本(如
gen_flamegraph.sh):bash6. 常见问题
6.1 权限问题
- 若
perf报错权限不足,尝试:bash
6.2 火焰图不清晰
- 确保采样时间足够长(如 30 秒以上)。
- 检查是否启用了调试符号(编译时加
-g选项)。
6.3 无符号名称
- 安装调试符号包(如
linux-image-$(uname -r)-dbgsym)。
7. 参考工具
- 实时火焰图:使用 perf-map-agent 分析 Java 程序。
- 动态追踪:结合 eBPF 和 BCC 进行更细粒度的分析。
通过
perf和火焰图的联动,你可以快速定位系统性能瓶颈(如高 CPU 使用率、锁竞争、I/O 延迟等),大幅提升优化效率。
-
-
调试工具:
-
Valgrind检测内存泄漏(使用复杂,性能影响大,不适合生产环境常规使用,开发阶段。)
-
在软件开发中,内存泄漏是一个常见的问题,它会导致程序运行效率下降,甚至可能导致程序崩溃。Valgrind 是一个强大的内存调试工具,可以帮助开发者检测内存泄漏。下面是如何使用 Valgrind 来检测内存泄漏的步骤:
1. 安装 Valgrind
首先,确保你的系统上安装了 Valgrind。在 Ubuntu 上,你可以通过以下命令安装:
sudo apt-get update
sudo apt-get install valgrind
在 CentOS 上,你可以使用:
sudo yum install valgrind
2. 编译你的程序
为了更好地使用 Valgrind,建议使用 GCC 或 Clang 编译器编译你的程序,并带上 -g 选项来包含调试信息。例如:
gcc -g your_program.c -o your_program
3. 运行 Valgrind
使用 Valgrind 运行你的程序。在命令行中输入以下命令:
valgrind --leak-check=full ./your_program
这里,--leak-check=full 选项告诉 Valgrind 进行全面的内存泄漏检查。你也可以使用 --leak-check=summary 来获取一个简要的泄漏报告。
4. 分析输出结果
Valgrind 会运行你的程序,并在结束后显示内存泄漏的详细报告。报告中会列出所有检测到的内存泄漏,包括泄漏的数量、大小以及发生泄漏的代码位置。
5. 解决内存泄漏问题
根据 Valgrind 提供的报告,找到并解决代码中的内存泄漏问题。通常,你需要检查那些报告中出现泄漏的代码部分,确保所有动态分配的内存在使用完毕后都被正确释放(例如,通过 free() 函数释放 malloc() 分配的内存)。
示例输出分析
一个典型的 Valgrind 输出示例可能包含以下内容:
==12345== HEAP SUMMARY:
==12345== in use at exit: 1,024 bytes in 1 blocks
==12345== total heap usage: 1 allocs, 0 frees, 1,024 bytes allocated
==12345==
==12345== LEAK SUMMARY:
==12345== definitely lost: 1,024 bytes in 1 blocks
==12345== indirectly lost: 0 bytes in 0 blocks
==12345== possibly lost: 0 bytes in 0 blocks
==12345== still reachable: 0 bytes in 0 blocks
==12345== suppressed: 0 bytes in 0 blocks
在这个例子中,Valgrind 报告了有 1,024 字节的内存没有被释放。你需要检查相关的代码,确保所有相关的 malloc、new 等调用都有对应的 free、delete 等释放调用。
小贴士:
使用 Valgrind 的 --track-origins=yes 选项可以帮助你更好地理解内存泄漏的原因,它会追踪到导致泄漏的原始分配点。
在开发阶段频繁使用 Valgrind 来检测和修复内存问题是一个好习惯。
通过以上步骤,你可以有效地使用 Valgrind 来检测和解决程序中的内存泄漏问题。
-
-
GDB调试竞态条件
-
-
IDE
-
vscode(ssh)
-

浙公网安备 33010602011771号