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 报告中用于标识各种内存错误的内部标识符。它们的具体含义如下:
- 错误代码 5269
代码 5269 通常表示 Valgrind 发现了一个无效的堆内存访问问题。这个错误可能与访问已经释放的内存、越界写入等有关。具体的错误消息通常会描述内存访问违规的详细情况。
- 错误代码 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 工具进行性能分析的基本步骤是:
- 安装 Valgrind。
- 编译程序时包括调试信息。
- 使用 valgrind --tool=callgrind ./my_program 运行程序。
- 使用 kcachegrind 或 qcachegrind 查看分析结果。
这种方法可以帮助深入了解程序的性能瓶颈,并进行相应的优化