dmalloc arm-linux平台使用

简介: 话说“工欲善其事,必先得其器”,用C语言写程序,最怕遇到个什么内存泄漏,内存越界访问了,心里那个急啊。。。 如果在i368-linlux上,valgrind工具是首选,但在arm-linux平台上,如何呢,dmalloc就是一个不错的选择。

话说“工欲善其事,必先得其器”,用C语言写程序,最怕遇到个什么内存泄漏,内存越界访问了,心里那个急啊。。。

如果在i368-linlux上,valgrind工具是首选,但在arm-linux平台上,如何呢,dmalloc就是一个不错的选择。当然,IBM的purify是另外一个级别的选手,不提也罢。

 

1. 到官方网站下载dmalloc: www.dmalloc.com

2. 交叉编译dmalloc

2.1 configure

因为configure过程中要在PC上执行test程序,而交叉编译的test程序在PC上无法运行,导致configure通不过,因此,我没有加上--host=arm-linux选项

./configure --prefix=/opt/crosstool/arm-linux/gcc-3.4.4-glibc-2.3.5/arm-linux/arm-linux/ --enable-cxx --enable-threads

其中opt/crosstool/arm-linux/gcc-3.4.4-glibc-2.3.5/arm-linux/arm-linux/是我的交叉编译环境的目录

2.2

修改环境变量,偷梁换柱

export PATH=/opt/crosstool/arm-linux/gcc-3.4.4-glibc-2.3.5/arm-linux/arm-linux/bin/:$PATH

其中交叉编译工具在/opt/crosstool/arm-linux/gcc-3.4.4-glibc-2.3.5/arm-linux/arm-linux/bin/下,且名字为gcc, g++等。

这时,用which gcc命令看到的将是交叉编译工具gcc

 

2.3

make threadscxx

make install

 这样,就编译出了支持线程和c++的dmalloc版本。

 

3. 环境配置

将交叉编译后的dmalloc放入嵌入式板子上,执行./dmalloc -b -l logfile -i 100 low

会看到有两行输出:

DMALLOC_OPTIONS=debug=0x4e48503,inter=100,log=logfile

export DMALLOC_OPTIONS

把这两行作为shell脚本执行一下,即是设置环境变量

 

4. 写代码测试dmalloc啦

简单的程序:

#include <signal.h>
#include <unistd.h>
#include <cstdlib>
 
int main()
{
 
    char *p = (char *)malloc(10);
 
    for(int i = 0; i < 11; ++i)
        p[i] = 'a';
 
    return 0;
}

上面的程序有明显的内存越界访问。

用如下命令编译之:

$ arm-linux-g++ try.cpp -DDMALLOC_FUNC_CHECK -ldmalloc

生成a.out

 

在板子上执行./a.out

会有logfile产生,内容如下:

948436802: 1: Dmalloc version '5.5.2' from 'http://dmalloc.com/'
948436802: 1: flags = 0x4e48503, logfile 'logfile'
948436802: 1: interval = 100, addr = 0, seen # = 0, limit = 0
948436802: 1: starting time = 948436802
948436802: 1: process pid = 5091
948436802: 1:   error details: checking user pointer
948436802: 1:   pointer '0x40016fe8' from 'unknown' prev access 'try.cpp:11'
948436802: 1:   dump of proper fence-top bytes: 'i\336\312\372'
948436802: 1:   dump of '0x40016fe8'-6: '\300\300\033\253\300\300aaaaaaaaaaa\336\312\372'
948436802: 1:   next pointer '0x40017000' (size 0) may have run under from 'unknown'
948436802: 1: ERROR: _dmalloc_chunk_heap_check: failed OVER picket-fence magic-number check (err 27)

哈哈,OK

从上面的输出可以看到,在访问try.cpp 第11行分配的内存时,出现了越界访问。

 

5. dmalloc也支持c++,但不完善,打印不出出错的行号

用c++时,要用-ldmallocthcxx选项,不能用-ldmalloc

其实没行号也没关系,用gdb工具及打印出的地址也是可以知道行号的。

目录
相关文章
|
28天前
|
数据采集 监控 安全
精简高效与安全兼备:ARM32与MCU32平台上的信息协议设计新思路
精简高效与安全兼备:ARM32与MCU32平台上的信息协议设计新思路
214 1
|
1月前
|
边缘计算 Kubernetes Devops
KubeSphere平台安装系列之二【Linux单节点部署KubeSphere】(2/3)
KubeSphere平台安装系列之二【Linux单节点部署KubeSphere】(2/3)
37 3
|
4月前
|
监控 关系型数据库 机器人
小白带你学习linux的监控平台zabbix
小白带你学习linux的监控平台zabbix
136 0
|
5月前
|
Java Linux 程序员
Linux平台中调试C/C++内存泄漏方法 (腾讯和MTK面试的时候问到的)
Linux平台中调试C/C++内存泄漏方法 (腾讯和MTK面试的时候问到的)
|
6月前
|
NoSQL 关系型数据库 MySQL
Linux平台下安装部署MongoDB数据库及基本使用(1)
Linux平台下安装部署MongoDB数据库及基本使用(1)
253 0
|
7月前
|
编解码 Linux 数据安全/隐私保护
Linux平台如何实现采集音视频数据并注入轻量级RTSP服务?
Linux平台如何实现采集音视频数据并注入轻量级RTSP服务?
211 1
|
1月前
|
边缘计算 Kubernetes Linux
KubeSphere平台安装系列之三【Linux多节点部署KubeSphere】(3/3)
KubeSphere平台安装系列之三【Linux多节点部署KubeSphere】(3/3)
29 1
|
15天前
|
Linux Shell 虚拟化
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
26 0
|
30天前
|
安全 Linux 数据安全/隐私保护
【SPI协议】了解ARM平台上的SPI的基本应用
【SPI协议】了解ARM平台上的SPI的基本应用
378 0
|
1月前
|
NoSQL 关系型数据库 Linux
Star 1.6k!当Web遇上Linux和数据库!一站式管理平台的开源之旅!
Star 1.6k!当Web遇上Linux和数据库!一站式管理平台的开源之旅!