valgrind | 调试C/C++程序(基本准备)

总序

我们往往需要时间复杂度更低、占内存更少的算法(尤其是写算法时,注意到哪里发生错误、是什么微妙差别造成了巨大的性能差距是很重要的),valgrind就是可以进行C/C++单步耗时监测、内存开销监测等等监测性能的关键工具。

valgrind中有几个需要重点学习的工具:

  1. Memcheck:检测内存错误
  2. Cachegrind:CPU缓存命中次数、指令信息
  3. Callgrind:CPU缓存 + 函数调用关系
  4. Massif:堆内存使用情况
  5. Helgrind:多线程竞争条件
  6. DRD:多线程分析
  7. DHAT:动态堆分析

自用版本

Ubuntu 20.04 Focal

af7e027113364cff81d86984eeb59fca.png

基本准备

  • 更新软件包,安装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

52f5fd9f73f9452889f081cccddeb36c.png

  • 运行与运行结果

67ce8d9e8455454cb0ac506af2b849a0.png

写程序时有时我们可能会忘记初始化变量的值,造成意外的、不报错返回结果,而如果用到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;
}

然而运行不会报错

72d89472624f426b9fd21b8bd4b7e76c.png

用valgrind检查一下,发现使用了未初始化的变量

a1e0b07b2b2347fcad750ff0b49f0b7a.png

以上的案例当个小引子,具体的memcheck学习将放在下一节

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值