valgrind工具
valgrind在ARM开发板上的交叉编译与运用
- valgrind简介
- valgrind的交叉编译
- 环境:
- 源码:
- 配置:
- valgrind的memcheck的使用
valgrind简介
借用valgrind的百度百科的解释:Valgrind是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具。而且它遵守GNU通用公共许可证条款,是一款自由软件。链接: valgrind官网.
内存的使用产生问题,对于偏向于嵌入式的程序员来说,是很难避免的。虽然靠编码规范,规矩的开发流程,严格的单元测试,以及自身的底子的实力程度能很大程度避开这些问题,但是遇到了,就最好从根源上解决。
valgrind包含很多工具,如下:
工具 | 作用 |
---|---|
Memcheck | 专门用于检测内存的问题,如:内存泄漏,内存覆盖,未初始化的内存的使用,越界访问等等 |
Cachegrind | 主要用来检查程序中缓存使用时出现的问题 |
Callgrind | 主要用来检查程序中函数调用过程中出现的问题 |
Helgrind | 主要用来检查多线程程序中可能存在的竞争问题 |
Massif | 主要用来检查程序中堆栈使用中存在的问题 |
Extension | 通过core提供的功能,来编写特定的内存调试工具 |
本文着重于Memcheck的使用。
valgrind的交叉编译
环境:
目标机:ZLG的m1808核心板(基于Rockchip 的RK1808 AIoT处理器)
宿主机:Ubuntu18.04
源码:
首先在自己的开发宿主机上下载份最新的valgrind源码。
wget https://sourceware.org/pub/valgrind/valgrind-3.17.0.tar.bz2
配置:
1.先找到自己的交叉编译工具链的位置。然后进入解压后的valgrind-3.17.0中,执行以下命令:
./autogen.sh
./configure CC=xxx/aarch64-linux-gnu-gcc CXX=xxx/aarch64-linux-gnu-g++ LD=xxx/aarch64-linux-gnu-ld AR=xxx/aarch64-linux-gnu-ar --host=aarch64-linux --prefix=PATH#其中xxx为交叉编译工具链的路径 "aarch64-linux"为configure文件中可选的选项(选择适合自己目标机的)
#PATH为编译后生成的文件存放位置
着重说明一点,按照其README给的建议,–prefix的路径最好与目标机中的位置一样,不然容易出现问题,比如:
“valgrind: failed to start tool ‘memcheck’ for platform ‘arm-linux’: No such file or directory”
这步配置完后,剩下的步骤很简单:
sudo make -j4
sudo make install
2.找到生成的文件,打包传入一样位置的路径中。如果不想传入一样的路径,那就在目标机的系统文件/etc/profile中添加:“export VALGRIND_LIB=/opt/valgrind-3.17.0/lib/valgrind
当然,还可以在其中PATH路径的”/usr/bin:/usr/sbin:/bin:"后面把“xxx/valgrind-3.17.0/bin”加上,执行下source /etc/profile ,就可以当valgrind命令使用了。
3.最后直接在目标机上任意位置输入命令:
valgrind --version
返回对应的版本号就成功了。否则,根据提示的信息找问题。如下图:
valgrind的memcheck的使用
–tool=< toolname > [default: memcheck] :toolname为选择的工具,默认为memecheck
–log-file= < filename >:filename 为日志输出的文件名。
————————————————————————————————————————
从官方文档看,对于memcheck使用,常用的有以下的选项指令:
–leak-check=<no|summary|yes|full> [default: summary]:
启用后,在客户端程序完成时搜索内存泄漏。如果设置为summary,则说明发生了多少泄漏。如果设置为full或 yes,则每个泄漏都将详细显示和/或计为错误,如选项–show-leak-kinds和 所指定 --errors-for-leak-kinds。如果–xml=yes给出,则memcheck将自动使用value --leak-check=full。–show-leak-kinds=none如果您对泄漏结果不感兴趣,可以使用减少xml输出的大小。
–leak-resolution=<low|med|high> [default: high]:
在执行泄漏检查时,确定为了将多个泄漏合并到一个泄漏报告中,Memcheck如何考虑将不同的回溯痕迹视为相同。设置为时low,仅前两个条目需要匹配。当med为时,必须匹配四个条目。当为时high,所有条目都必须匹配。
核心泄漏调试,您可能希望 --leak-resolution=high与–num-callers=40或如此多一起使用 。
请注意,该–leak-resolution设置不会影响Memcheck的发现泄漏的能力。它仅更改结果的显示方式。
–show-leak-kinds= [default: definite,possible]:
full 通过以下方式之一指定要在泄漏搜索中显示的泄漏类型:
用逗号分隔的一个或多个列表 definite indirect possible reachable。
all指定全套(所有泄漏种类)。等同于 --show-leak-kinds=definite,indirect,possible,reachable。
none 为空集。
–errors-for-leak-kinds= [default: definite,possible]:
指定要在full泄漏搜索中计为错误的泄漏种类 。的 指定方式类似于 --show-leak-kinds
–leak-check-heuristics= [default: all]:
指定在泄漏搜索期间要使用的一组泄漏检查启发式方法。启发式方法控制哪个内部指针指向一个块,使其被认为是可到达的。启发式集是通过以下方式之一指定的:
用逗号分隔的一个或多个列表 stdstring length64 newarray multipleinheritance。
all激活完整的启发式方法。等同于 --leak-check-heuristics=stdstring,length64,newarray,multipleinheritance。
none 为空集。
–show-reachable=<yes|no> , --show-possibly-lost=<yes|no>
这些选项提供了一种选择的方式来指定要显示的泄漏类型:
–show-reachable=no --show-possibly-lost=yes等同于 --show-leak-kinds=definite,possible。
–show-reachable=no --show-possibly-lost=no等同于 --show-leak-kinds=definite。
–show-reachable=yes等同于 --show-leak-kinds=all。
【注意,–show-possibly-lost=no如果–show-reachable=yes指定,则无效。】
–undef-value-errors=<yes|no> [default: yes]:
控制Memcheck报告是否使用未定义的值错误。no如果您不想看到未定义的值错误,请将此设置为 。它还具有一定程度加快Memcheck速度的副作用。AddrCheck(在Valgrind 3.1.0中删除)的功能类似于Memcheck(带有) --undef-value-errors=no。
–track-origins=<yes|no> [default: no]:
控制Memcheck是否跟踪未初始化值的来源。默认情况下,它不是,这意味着,尽管它可以告诉您未初始化的值正在以危险的方式使用,但是它无法告诉您未初始化的值是从哪里来的。这通常使得很难找到根本问题。
设置yes为时,Memcheck会跟踪所有未初始化值的来源。然后,当报告未初始化的值错误时,Memcheck将尝试显示值的来源。源可以是以下四个位置之一:堆块,堆栈分配,客户端请求或其他各种源(例如的调用brk)。
对于源自堆块的未初始化值,Memcheck将显示该块的分配位置。对于源自堆栈分配的未初始化值,Memcheck可以告诉您哪个函数分配了该值,但仅此而已-通常它会向您显示该函数的左括号的源位置。因此,您应该仔细检查函数的所有局部变量是否已正确初始化。
请注意,组合 --track-origins=yes 和–undef-value-errors=no是荒谬的。Memcheck在启动时会检查并拒绝此组合。
使用示例:
void func(void)
{float* t = (float*)malloc(sizeof(float)*4); float* p = t;for(int i=0; i<4;i++){p++;}*p =4.4; //未分配内存,无效的写入printf("%f\n",*p); //无效的读出//t指针未释放!
}int main(void)
{func();return 0;
}
结果如下图:
如愿的检查出三处地方:
- “Invalid write of size 4”:无效的写入。
- “Invalid read of size 4”:无效的读出。
- “16 byte in 1blocks are definitely lost…”:确定地泄漏了16字节。
总的来说,valgrind对于项目上内存问题地检测还是不小的帮助,可以较快速地定位问题。
valgrind工具相关推荐
- 【linux】Valgrind工具集详解(八):Memcheck命令行参数详解
[linux]Valgrind工具集详解(五):命令行详解中不够全,在此专门针对Memcheck工具中的命令行参数做一次详细的解释. Memcheck命令行选项 –leak-check=<no| ...
- 【linux】Valgrind工具集详解(五):命令行详解
一.使用方法 usage: valgrind [options] prog-and-args 使用方法:valgrind [参数选项] 程序和参数 二.选择工具 tool-selection opti ...
- 【linux】Valgrind工具集详解(二):入门
一.使用valgrind 1.安装 安装超级简单: sudo apt-get install valgrind 2.使用 运行valgrind -h可以查看详细使用方法,命令格式如下: valgrin ...
- 【linux】Valgrind工具集详解(一):简介
一.Valgrind概述 Valgrind是用于构建动态分析工具的仪器框架.它附带了一组工具,每个工具都执行某种调试,分析或类似任务,可帮助您改进程序.Valgrind的架构采用模块化设计,因此可以轻 ...
- linux下利用valgrind工具进行内存泄露检测和性能分析
http://blog.csdn.net/yanghao23/article/details/7514587 valgrind通常用来成分析程序性能及程序中的内存泄露错误 一 Valgrind工具集简 ...
- Qt Creator在外部应用程序上运行Valgrind工具
Qt Creator在外部应用程序上运行Valgrind工具 在外部应用程序上运行Valgrind工具 在外部应用程序上运行Valgrind工具 Qt Creator集成了Valgrind代码分析工具 ...
- valgrind工具使用详解
zz自 http://blog.csdn.net/destina/article/details/6198443 感谢作者的分享! 一 valgrind是什么? Valgrind是一套Linux下 ...
- Nulgrind:最小的Valgrind工具
14.1.概观 要使用此工具,必须--tool=none在Valgrind命令行上指定 . 14.1.概观 Nulgrind是最简单的Valgrind工具.它不执行程序的测试或分析,只是正常运行.它主 ...
- arm linux下交叉编译valgrind工具进行内存泄露检测和性能分析
C/C++等底层语言在提供强大功能及性能的同时,其灵活的内存访问也带来了各种纠结的问题.如果crash的地方正是内存使用错误的地方,说明你人品好.如果crash的地方内存明显不是consistent的 ...
- Linux valgrind java_linux下利用valgrind工具进行内存泄露检测和性能分析
valgrind通常用来成分析程序性能及程序中的内存泄露错误 一 Valgrind工具集简绍 Valgrind包含下列工具: 1.memcheck:检查程序中的内存问题,如泄漏.越界.非法指针等. 2 ...
最新文章
- TypePerf收集服务器性能
- 关于数据访问模式(三)—— Data Accessor模式
- 遥控器按键不灵的修复方法
- python程序详细描述_如何逐行描述Python代码?
- CV初级研究工程师,苏黎世联邦理工学院招聘
- php元类,iOS中类、元类、isa详解
- Flutter音频播放插件just_audio入门指南
- C语言中的循环结构与选择结构
- tomcat的工作原理
- 调研报告格式种类及相关调研报告的写法
- mina框架CumulativeProtocolDecoder.doDecode方法浅析
- 利用java制作桌面应用程序_Java桌面应用
- mysql 与文件系统_MySQL文件系统
- IE可以打开网页 但是chrome和火狐打不开网页解决办法
- 父级fixed_CSS3--改变固定定位(fixed)的父级定位元素
- Telegram Android开源源码运行
- @Autowired的基本使用
- Linux-新建用户/群组以及修改文件权限
- yu bie diu
- 2022年危险化学品经营单位主要负责人操作证考试题及模拟考试