关于 valgrind 就不详加介绍了,它大致的原理是模拟一个 CPU 环境,并提供服务给其他工具,其他工具则类似于插件,利用内核提供的服务完成各种特定的内存调试任务。
本文记录的应用场景是使用 Valgrind 调试嵌入式平台(目标系统)如 aarch64 下的应用,宿主系统的环境是 Linux X64。首先获取 Valgrind 的源码,在宿主机上交叉编译:
1
2
3
4
5
|
$
apt
-
get
source
valgrind
$
cd
valgrind
$
.
/
configure
--
host
=
aarch64
-
linux
-
gnu
--
prefix
=
$
HOME
/
output
/
valgrind
-
aarch64
\
CC
=
aarch64
-
linux
-
gnu
-
gcc
CXX
=
aarch64
-
linux
-
gnu
-
c
++
$
make
&&
make
install
|
注:这里的 –host 参数指定的是目标系统的架构, –prefix 参数指定软件的安装路径。
然后将编译好的 valgrind 拷贝到目标机上,如果拷贝到目标机上的路径和上面编译时指定的 –prefix 不一致,运行时需要设置 valgrind 运行时的 LIB 路径:
1
|
$
export
VALGRIND_LIB
=/
tmp
/
nfs
/
valgrind
-
aarch64
/
lib
/
valgrind
|
接下来就可以利用 valgrind 调试内存问题了。调用 Valgrind 的通用格式是:
1
|
$
valgrind
[
valgrind
-
options
]
your
-
prog
[
your
-
prog
-
options
]
|
Valgrind 内置一些很强大的工具。默认使用的是 memcheck,可以通过 “–tool= tool name ” 指定使用其他工具。
- memcheck: 重量级的内存检查器,能够发现绝大多数内存错误使用情况;
- callgrind: 用来检查程序中函数调用过程中出现的问题;
- cachegrind: 用来检查程序中缓存使用出现的问题;
- helgrind: 用来检查多线程程序中出现的竞争问题;
- massif: 用来检查程序中堆栈使用中出现的问题;
- extension: 可利用 core 提供的功能自己编写内存调试工具;
Valgrind 的参数分两类,一类是 core 的参数,它对所有的工具都适用;另一类是具体某个工具如 memcheck 的参数。
(关于如何使用 Valgrind 进行内存分析,后续待补充。)
参考:
发表回复 取消回复