话说“工欲善其事,必先得其器”,用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工具及打印出的地址也是可以知道行号的。

dmalloc arm-linux平台使用的更多相关文章

  1. Windows平台交叉编译Arm Linux平台的QT5.7库

    1.准备交叉编译环境 环境说明:Windows 7 64位 此过程需要: (1)Qt库开源代码,我使用的是5.7.0版本: (2)Perl语言环境5.12版本以上: (3)Python语言环境 2.7 ...

  2. golang 2行代码在基于arm linux的树莓派、orangepi上运行http web服务

    go语言(golang)简化了跨平台交叉编译步骤,支持在windows系统下交叉编译基于arm+linux平台的应用,运行时无需其它依赖库.以下以一个简单的http server为例,先上源码: ** ...

  3. jsoncpp linux平台编译和arm移植

    下载 http://sourceforge.net/projects/jsoncpp/ 或者 http://download.csdn.net/detail/chinaeran/8631141 Lin ...

  4. ARM Linux从Bootloader、kernel到filesystem启动流程

    转自:http://www.veryarm.com/1491.html ARM Linux启动流程大致为:bootloader ---->kernel---->root filesyste ...

  5. arm linux kernel 从入口到start_kernel 的代码分析

    参考资料: <ARM体系结构与编程> <嵌入式Linux应用开发完全手册> Linux_Memory_Address_Mapping http://www.chinaunix. ...

  6. ARM linux解析之压缩内核zImage的启动过程

    ARM linux解析之压缩内核zImage的启动过程 semilog@163.com 首先,我们要知道在zImage的生成过程中,是把arch/arm/boot/compressed/head.s  ...

  7. ARM Linux中断发生时内核堆栈切换

    转载注明出处:http://www.wowotech.net/forum/viewtopic.php?id=54 对ARM Linux中断非常简洁.精确的描述. 发生了中断,最重要的是保存现场,在中断 ...

  8. Kernel Memory Layout on ARM Linux

    这是内核自带的文档,讲解ARM芯片的内存是如何布局的!比较简单,对于初学者可以看一下!但要想深入理解Linux内存管理,建议还是找几本好书看看,如深入理解Linux虚拟内存,嵌入系统分析,Linux内 ...

  9. ARM Linux 内核 panic 之cache 一致性 ——cci-400 cache一致互联

    ARM Linux 内核 panic 之cache 一致性 ——cci-400 cache一致互联 CCI-400 集合了互联和一致性功能,有 2 个 ACE slave 接口和 3 个 ACE-Li ...

  10. ARM linux电源管理——Cortex A系列CPU(32位)睡眠和唤醒的底层汇编实现

    ARM linux电源管理——Cortex A系列CPU(32位)睡眠和唤醒的底层汇编实现 承接 http://www.wowotech.net/pm_subsystem/suspend_and_re ...

随机推荐

  1. Python笔记---错误笔记

    Python---错误笔记 1. Python编码问题: 我们在编写 Python 脚本时,往往会写上中文凝视. 可是有时候,当我们执行程序时.却发现例如以下错误:SyntaxError: Non-A ...

  2. 使用注解的方式配置Servlet

    提到Servlet的配置,大多数人想到的应该都是在web.xml中配置吧.有没有更简洁的方式呢?今天就学到了採用注解的方式配置Servlet. 此方式尽管简便.但当然也存在问题. 採用注解的有点:你能 ...

  3. js12--块作用域函数作用域

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  4. mysql 压力测试之批量插入自增字段不连续问题

    Gaps in auto-increment values for “bulk inserts” With innodb_autoinc_lock_mode set to 0 (“traditiona ...

  5. 洛谷 【P1252】马拉松接力赛

    洛谷 [P1252]马拉松接力赛 题目描述 某城市冬季举办环城25km马拉松接力赛,每个代表队有5人参加比赛,比赛要求每个的每名参赛选手只能跑一次,一次至少跑1km.最多只能跑10km,而且每个选手所 ...

  6. HTML基础第三讲---字体

    转自:https://i.cnblogs.com/posts?categoryid=1121494 同样我们在这里继续讲一下它的body,因为它能直观的让大家观察到你所学到的成果. 这一讲,我们来学习 ...

  7. React评论展示案例(包含知识点:state、props、ref、React声明周期、localStorage本地存储等)

    本案例在上一篇的案例(React组件之间通过Props传值的技巧(小案例,帮助体会理解props.state.受控组件和非受控组件等))的基础上加强功能和用户体验,但是当然还有很多需要改进的地方,后期 ...

  8. JS学习笔记 - fgm练习 - 限制输入框的字符类型 正则 和 || 或运算符的运用 i++和++i

    <script> window.onload = function(){ var aInp = document.getElementsByTagName('input'); var oS ...

  9. TC Hangs when using quick search extended on win10 (1703)

    https://ghisler.ch/board/viewtopic.php?t=47682 I recently updated windows 10 to the latest released ...

  10. amazeui学习笔记--css(常用组件11)--分页Pagination

    amazeui学习笔记--css(常用组件11)--分页Pagination 一.总结 1.分页使用:还是ul包li的形式: 分页组件,<ul> / <ol> 添加 .am-p ...