Linux C 获取系统及进程内存状态

一、系统内存

Linux 提供了诸多的方式来获取系统内存状态。在 shell 下,我们可以通过 free 或者 top 等命令来获取。但是在 C/C++ 程序中又该如何获取呢?

这就不得不提到 Linux 提供的 proc 虚拟文件系统了,它提供了一个在 linux 内核空间和用户间之间进行通信的窗口。通过这个窗口,内核可以告诉我们很多系统信息。其中涉及到系统内存的,主要是 /proc/meminfo 文件:

该文件告诉我们关于系统内存的全方位的信息。于是通过读取并解析该文件,就可以到达获取内存状态的目的:

如果我们只是想获取一些常见的内存状态,比如 RAM Free,不需要知道太多细节,那么使用 GNU C 提供 sysinfo 函数是一个不错的方案。

头文件 <sys/sysinfo.h> 中声明了 sysinfo 函数,并定义了 sysinfo 结构体:

通过 sysinfo 函数,我们可以获取上述系统状态:

二、进程内存

进程的内存状态就相对比较复杂了,后续待补充。。。

Valgrind 的交叉编译与使用

关于 valgrind 就不详加介绍了,它大致的原理是模拟一个 CPU 环境,并提供服务给其他工具,其他工具则类似于插件,利用内核提供的服务完成各种特定的内存调试任务。

本文记录的应用场景是使用 Valgrind 调试嵌入式平台(目标系统)如 aarch64 下的应用,宿主系统的环境是 Linux X64。首先获取 Valgrind 的源码,在宿主机上交叉编译:

注:这里的 –host 参数指定的是目标系统的架构, –prefix 参数指定软件的安装路径。

然后将编译好的 valgrind 拷贝到目标机上,如果拷贝到目标机上的路径和上面编译时指定的 –prefix 不一致,运行时需要设置 valgrind 运行时的 LIB 路径:

接下来就可以利用 valgrind 调试内存问题了。调用 Valgrind 的通用格式是:

Valgrind 内置一些很强大的工具。默认使用的是 memcheck,可以通过 “–tool=tool name” 指定使用其他工具。

  • memcheck:    重量级的内存检查器,能够发现绝大多数内存错误使用情况;
  • callgrind:       用来检查程序中函数调用过程中出现的问题;
  • cachegrind:   用来检查程序中缓存使用出现的问题;
  • helgrind:        用来检查多线程程序中出现的竞争问题;
  • massif:            用来检查程序中堆栈使用中出现的问题;
  • extension:      可利用 core 提供的功能自己编写内存调试工具;

Valgrind 的参数分两类,一类是 core 的参数,它对所有的工具都适用;另一类是具体某个工具如 memcheck 的参数。

(关于如何使用 Valgrind 进行内存分析,后续待补充。)

参考:

DirectFB 快速入门

DirectFB(简称 DFB)

参考: