Valgrind 和gdb内存调式工具

Valgrind

Valgrind是一套linux下,开放源代码的仿真调试工具的集合。它由内核以及基于内核的其他调试工具组成。内核类似于一个框架,模拟了一个CPU环境,并提供服务给其他工具;而其他工具类似于插件。

其中使用最广泛的插件是Memcheck,用以检查内存使用中出现的问题,比如:使用未初始化、已经释放了的、越界了的、重叠了的内存问题
编译安装

wget https://fossies.org/linux/misc/valgrind-3.15.0.tar.bz2
tar -jxvf valgrind-3.15.0.tar.bz2
cd valgrind-3.15.0
./configure
make
sudo make install

valgrind的使用
  1. 准备好源代码
  2. 编译
    gcc -g -O0 sample.c -o sample
  3. 使用valgrind运行程序
    valgrind [valgrind-options] sample [your-prog-options]
  • valgrind-options可以指定插件种类,默认是memcheck,可以使用 --tool=来修改
  1. 分析valgrind输出信息
valgrind可以发现的内存错误
  • 使用未初始化的内存,对于局部的和动态申请的这种初始值为随机值的变量会引起程序行为不可预期
  • 内存读写越界,访问了没有分配,或者没有权限的内存地址空间
  • 内存覆盖,strcpy,strncpy,memcpy,strcat等可能会出现地址重叠的问题
  • 内存动态管理的错误,堆上分配内存的管理出现了问题,主要包括申请和释放不匹配,重复释放等
  • 内存泄漏,堆上内存没有回收

GDB

GDB做以下4件事来捕获程序中的bug

  • 在程序启动之前指定一些可以影响程序行为的变量或者条件
  • 在某个指定的地方或者条件下暂定程序,断点设置
  • 程序停止检查当前发生的事情
  • 在程序执行过程中修改程序中的变量或者条件
调试信息和调试原理
  • 使用-g 选项编译程序可以保留调试符号信息
  • 使用编译优化选项去掉编译优化,这样保证程序的运行和预期保持一致
  • 使用gdb显示调试信息
    gdb filename、attach pid、filename corename
  • 在程序已经启动的情况下,可以使用进程号调试,然后使用detach退出调试
  • 有时候服务器程序宕机,我们可以使用ulimit -c来查看是否产生core文件,如果没有,则使用以下命令修改
    sudo sh -c "ulimit -c unlimited && exec su $LOGNAME"
    可以使用以下命令设置corefile的统一格式和路径
    sysctl -w kernal.core_pattern=/corefile/core-%e-%p-%t
    然后就可以通过调试core文件获得错误信息
gdb常见命令
Valgrind 和gdb内存调式工具_第1张图片
image.png

Valgrind 和gdb内存调式工具_第2张图片
image.png
dissemble,汇编调试
断点调试
  • 条件断点,设置行号和条件
    break 11 if i==5000
  • 硬件断点,数据断点,通过watch添加的部分断点,该断点是通过监视内存地址或者变量值的变化实现的,软中断实现的不算。
  • 普通断点,其他断点就是普通断点
调试多线程
  • info threads ,显示线程的信息
  • set scheduler-locking on,可以将当前执行流锁定在当前调试线程
调式多进程
  • 第一种方式
    show follow-fork mode
    set follow-fork child
  • 第二种方式
    先调试父进程,然后使用gdb attach 到子进程的调试,需要重开一个session

你可能感兴趣的:(Valgrind 和gdb内存调式工具)