valgrind简介

0 预备工作

  • sudo apt-get update
  • sudo apt-get install valgrind
  • 编译debug版本
    • gcc -g -o your_program your_program.c
    • set(CMAKE_BUILD_TYPE Debug)

1 定位内存泄露

Valgrind最著名的工具是memcheck,它用于内存错误的检测,执行如下代码进行进行内存泄漏检测

  • valgrind --leak-check=full ./your_program # 以下是备选项,会生成不同的输出,都可以试一试;

    • --show-leak-kinds=all
    • -v
    • --track-origins=yes
  • valgrind --leak-check=full --show-leak-kinds=all -- track-origins=yes -v ./your_program 2> valgrind_output.txt: 生成可读性更好的报告

编译C++程序的Debug版本之后,使用valgrind运行可执行程序,如下:

1.1 错误码含义

在 Valgrind 中,5269 和 5213 是特定的错误代码,它们出现在 Valgrind 的错误报告中,用于标识不同类型的错误。具体来说,这些代码是 Valgrind 报告中用于标识各种内存错误的内部标识符。它们的具体含义如下:

  1. 错误代码 5269

代码 5269 通常表示 Valgrind 发现了一个无效的堆内存访问问题。这个错误可能与访问已经释放的内存、越界写入等有关。具体的错误消息通常会描述内存访问违规的详细情况。

  1. 错误代码 5213

代码 5213 通常指示一个未初始化的内存读取问题。当程序读取未初始化的内存区域时,Valgrind 会报告此错误。这种情况可能导致程序的行为不确定或崩溃,因为读取未初始化的内存可能会导致不正确的结果。

查看详细信息

要获得这些错误代码的详细描述和上下文,你可以检查 Valgrind 的输出日志。Valgrind 的报告通常会包括以下内容:

  • 错误的描述:描述错误的具体类型和位置。
  • 代码行:指示发生错误的代码行和函数。
  • 堆栈跟踪:帮助你追踪错误发生的位置和原因。

2 性能优化分析

Valgrind 是一个强大的工具,不仅提供memcheck进行内存调试、内存泄漏检测以及其他程序分析,还提供callgrind进行性能分析。

Valgrind 提供了一个叫做 callgrind 的工具,用于性能分析。callgrind 可以帮助你分析程序的调用图和函数执行的时间,找出性能瓶颈。

2.1 运行 callgrind

valgrind --tool=callgrind ./my_program

这将生成一个名为 callgrind.out.<pid> 的文件,其中 <pid> 是进程 ID。该文件包含了性能数据。

2.2 分析性能数据

要查看 callgrind 生成的性能数据,可以使用 kcachegrind(图形界面工具)或 qcachegrind(另一种图形界面工具)。在 Ubuntu 上,进行如下安装

sudo apt-get install kcachegrind

然后,使用以下命令打开生成的文件:

kcachegrind callgrind.out.<pid>

在 kcachegrind 中,可以查看各个函数的调用次数、每个函数的执行时间以及函数之间的调用关系。

2.3 解释结果

在 kcachegrind 或其他分析工具中,还可以:

  • 查看调用图:分析函数之间的调用关系,找出热点函数。
  • 查看执行时间:找出耗时最多的函数或代码段。
  • 查看函数调用次数:分析函数调用的频率,以优化性能。

2.4 总结

使用 Valgrind 的 callgrind 工具进行性能分析的基本步骤是:

  1. 安装 Valgrind。
  2. 编译程序时包括调试信息。
  3. 使用 valgrind --tool=callgrind ./my_program 运行程序。
  4. 使用 kcachegrind 或 qcachegrind 查看分析结果。

这种方法可以帮助深入了解程序的性能瓶颈,并进行相应的优化

posted @ 2024-08-07 12:26  绍荣  阅读(28)  评论(0编辑  收藏  举报