总序
我们往往需要时间复杂度更低、占内存更少的算法(尤其是写算法时,注意到哪里发生错误、是什么微妙差别造成了巨大的性能差距是很重要的),valgrind就是可以进行C/C++单步耗时监测、内存开销监测等等监测性能的关键工具。
valgrind中有几个需要重点学习的工具:
- Memcheck:检测内存错误
- Cachegrind:CPU缓存命中次数、指令信息
- Callgrind:CPU缓存 + 函数调用关系
- Massif:堆内存使用情况
- Helgrind:多线程竞争条件
- DRD:多线程分析
- DHAT:动态堆分析
自用版本
Ubuntu 20.04 Focal
基本准备
- 更新软件包,安装vim
sudo apt update
sudo apt install vim
- 安装编译器(c用gcc,c++用g++)
sudo apt install gcc
sudo apt install g++
- 先创建文件,进入编辑界面
touch test.cpp
vim test.cpp
-
写入测试代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
int x = 310;
printf("%d\n", x);
return 0;
}
- 编译
g++ -g ./test.cpp -o test
# -g 生成调试信息 ./test.cpp为编译文件 -o后跟输出文件名
生成完的编译文件即为test
- 运行与运行结果
写程序时有时我们可能会忘记初始化变量的值,造成意外的、不报错返回结果,而如果用到valgrind,就可以查出此时出现的内存访问错误,现在来尝试一下~
先修改test.cpp为错误代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
// int x = 310;
int x;
printf("%d\n", x);
return 0;
}
然而运行不会报错
用valgrind检查一下,发现使用了未初始化的变量
以上的案例当个小引子,具体的memcheck学习将放在下一节