目录
2、有打开但是使用完未关闭的文件描述符(fd)
-
Ubuntu下Valgrind的安装
sudo apt-get update
sudo apt-get install valgrind
-
Valgrind简单介绍
- 工作原理
-
Valgrind的主要功能
- Valgrind包括以下一些工具:
- Memcheck:这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够给发现开发中绝大多数的内存错误使用的情况,比如:使用未初始化
- callgrind:它主要用来检查程序中函数中调用过程中出现的问题
- cachegrind:它主要用来检查程序中缓存使用出现的问题
- Helgrind:它主要用来检查多线程中出现的竞争问题
- Massif:它主要用来检查程序中堆栈使用中出现的问题
- Extension:可以使用core提供的 功能,自己编写特定的内存调试工具
-
Valgrind的主要应用
- 用法:valgrind[options] prog-and-args [options]: 常用选项,适用于所有Valgrind工具
- -tool=<name> 最常用的选项。运行 valgrind中名为toolname的工具。默认memcheck。
- h –help 显示帮助信息。
- -version 显示valgrind内核的版本,每个工具都有各自的版本。
- q –quiet 安静地运行,只打印错误信息。
- v –verbose 更详细的信息, 增加错误数统计。
- -trace-children=no|yes 跟踪子线程?
- -track-fds=no|yes 跟踪打开的文件描述?
- -time-stamp=no|yes 增加时间戳到LOG信息?
- -log-fd=<number> 输出LOG到描述符文件
- -log-file=<file> 将输出的信息写入到filename.PID的文件里,PID是运行程序的进行ID
- -log-file-exactly=<file> 输出LOG信息到 file
- -log-file-qualifier=<VAR> 取得环境变量的值来做为输出信息的文件名。
- -log-socket=ipaddr:port 输出LOG到socket ,ipaddr:port
LOG信息输出:
- -xml=yes 将信息以xml格式输出,只有memcheck可用
- -num-callers=<number> show <number> callers in stack traces
- -error-limit=no|yes 如果太多错误,则停止显示新错误?
- -error-exitcode=<number> 如果发现错误则返回错误代码
- -db-attach=no|yes 当出现错误,valgrind会自动启动调试器gdb。
- -db-command=<command> 启动调试器的命令行选项
-
应用示例
1、使用malloc/new分配内存但是没有释放空间
-
输入命令
valgrind ./a.out //a.out 为gcc编译后产生的可执行文件
-
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
alarm(10); //时钟计时,让程序跑10秒钟
while (1)
{
char *p = malloc(10000); //分配内存但不释放
}
return 0;
}
-
运行结果
-
探测出有 total heap usage: 264,001 allocs, 但是 0 frees。
2、有打开但是使用完未关闭的文件描述符(fd)
-
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
alarm(10);
while (1)
{
open("text.txt", O_RDWR); //调用系统函数打卡一个文件
}
return 0;
}
-
运行结果
-
探测出有 3个文件描述符未关闭在程序运行结束时。