Linux c/c++ 开发工具链常用功能汇总

 

开发过程中许多工具经常是配置一次用一段时间,记录备查。

编译器:

    • GCC 

  • 性能分析:

    • perf + 火焰图(Flame Graphs)

 

将 perf(Linux 性能分析工具)与火焰图(FlameGraph)结合使用,可以直观地定位系统的性能瓶颈(如 CPU、内存、I/O 等)。以下是两者联动的详细步骤:

 

    • ​​1. 安装必要工具​​

      ​​1.1 安装 perf​​

      在 Linux 系统中安装 perf(通常包含在 linux-tools 包中):

      bash
      sudo apt-get install linux-tools-common linux-tools-generic # Debian/Ubuntu
      sudo yum install perf # CentOS/RHEL

      ​​1.2 下载 FlameGraph 脚本​​

      从 GitHub 克隆火焰图生成工具:

      bash
      git clone https://github.com/brendangregg/FlameGraph.git cd FlameGraph

      ​​2. 使用 perf 采集性能数据​​

      ​​2.1 采集 CPU 热点数据​​

      记录进程或系统的 CPU 调用栈(示例采集 10 秒):

      bash
      sudo perf record -F 99 -a -g -- sleep 10
      • -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 为文本格式​​

      bash
      sudo perf script > perf.script

      ​​3.2 生成火焰图​​

      使用 FlameGraph 脚本处理数据:

      bash
      cd FlameGraph ./stackcollapse-perf.pl < ../perf.script | ./flamegraph.pl > ../flamegraph.svg
      • stackcollapse-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):

      bash
      #!/bin/bash perf record -F 99 -a -g -- sleep 10 perf script > perf.script ./FlameGraph/stackcollapse-perf.pl perf.script | ./FlameGraph/flamegraph.pl > flamegraph.svg

      ​​6. 常见问题​​

      ​​6.1 权限问题​​

      • 若 perf 报错权限不足,尝试:
        bash
        echo 0 | sudo tee /proc/sys/kernel/perf_event_paranoid # 临时关闭安全限制

      ​​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 字节的内存没有被释放。你需要检查相关的代码,确保所有相关的 mallocnew 等调用都有对应的 freedelete 等释放调用。

小贴士:

使用 Valgrind 的 --track-origins=yes 选项可以帮助你更好地理解内存泄漏的原因,它会追踪到导致泄漏的原始分配点。

在开发阶段频繁使用 Valgrind 来检测和修复内存问题是一个好习惯。

通过以上步骤,你可以有效地使用 Valgrind 来检测和解决程序中的内存泄漏问题。

 

    • GDB调试竞态条件

  • IDE

    • vscode(ssh)

posted @ 2025-05-09 23:57  vhao11  阅读(104)  评论(0)    收藏  举报