嵌入式linux应用程序调试方法(7)
关于这两个函数,作者给出的注释为:Normally, it is not nessecary to call any of these. MEMWATCH will automatically initialize itself on the first MEMWATCH function call, and set up a call to mwAbort() using atexit()。所以通常我们不需要显式调用这两个函数。
但是问题是,我们的程序可能不会显式的退出,从而atexit()函数不能正常被调用;在这种情况下,我们可以通过显式的调用来完成一定的内存检测工作;
mwInit( void ) 和mwTerm( void )可以多次调用。但是两个和malloc和free一样,必须配对使用。你就可以通过这样方式控制MEMWATCH什么时候开始检测内存,什么时候结束检测内存;
? MEMWATCH日志输出
MEMWATCH会输出日志到程序工作目录的memwatch.log文件中,如果这个文件不能创建的话,程序会尝试创建memwatNN.log,NN 从01 到 99。
如果你觉得没有必要输出日志到文件中,那么可以自己定义输出函数,方法为输出函数必须为void func(int c)类型,然后将输出函数地址作为参数显式调用mwSetOutFunc()指定输出;这样程序就会重定向输出到你定义的输出函数中;
? 野指针
当使用没有初始化的指针,或者指针指向的空间已被移动或者释放时,就会造成野指针问题。
避免这个问题的最好方法是:定义指针时总是初始化为NULL;当释放指针后,显式的将指针设置为NULL;
为了便于追踪这种指针错误,MEMWATCH程序将所有的内存区域赋予特定的数字;例如:刚分配但是未初始化的内存区域全部设置为0xFE;最近释放后没有被重新利用的内存全部设置为0xFD;所以如果你的程序在没有使用MEMWATCH时没有问题,但是加载MEMWATCH后会崩溃的话,可能程序中就存在指针分配后,没有初始化就使用;或者使用了已经释放的内存。
? 更深入的使用
更深入的使用请参见,<
我目前做的实验:在一个进程中(是否多个进程能够同时使用,还由待验证),初始化阶段,显式调用mwInit(), 然后在处理SIGINT,SIGTERM(因为程序运行过程中,我们会利用killall杀死我们不会停止的程序)的函数中显式调用mwTerm()函数; 另外我还修改了static void mwWrite( const char *format, ... )这个函数,在将有关信息输出到日志的过程中,同时利用printf输出到屏幕上(当然你也可以通过调用mwSetOutFunc()指定自己的输出函数)。如果是多线程的话,请定义MW_PTHREADS宏(可以通过在makefile中加 –DMW_PTHREADS)。
? 单线程:
RT-VD4201M和RT-VS4201S的主线程都不存在问题;
? 多线程:
在RT-VD4201M的多线程程序中没有问题, 可以检测出那些没有被释放的内存; 在RT-VS4201S的主线程单独使用时,没有问题,可以检测出内存泄漏;而在RT-VS4201S多个线程中,常会出现在创建线程时程序崩溃现象,有时候程序可能会运行下去;具体原因不明,可能是作者提到的“并不能完全确保函数多线程安全”,或者“程序存在前面提到的野指针问题”,或者其它问题。
使用MEMWATCH初步对RT-VD4201M和RT-VS4201S主程序进行内存检测;除了一些程序初始化阶
段分配的动态内存外(这些内存泄漏是程序已知的,例如RTSP,MP模块初始化分配的内存),近一个小时的运行,并没有发现其他内存泄漏问题。
? 多进程:
多个进程也可以支持。
4.2 YAMD
(说明:资料从网上来,该软件没有试用过)
YAMD 软件包由 Nate Eldredge 编写,可以查找 C 和 C++ 中动态的、与内存分配有关的问题。在撰写本文时,YAMD 的最新版本为 0.32。请下载 yamd-0.32.tar.gz(请参阅参考资料)。执行 make 命令来构建程序;然后执行 make install 命令安装程序并设置工具。
一旦您下载了 YAMD 之后,请在 test1.c 上使用它。请删除 #include memwatch.h 并对 makefile 进行如下小小的修改:
使用 YAMD 的 test1 gcc -g test1.c -o test1 清单 3 展示了来自 test1 上的 YAMD 的输出。 清单 3. 使用 YAMD 的 test1 输出 YAMD version 0.32 Executable: /usr/src/test/yamd-0.32/test1 ... INFO: Normal allocation of this block Address 0x40025e00, size 512 ... INFO: Normal allocation of this block Address 0x40028e00, size 512 ... INFO: Normal deallocation of this block Address 0x40025e00, size 512 ... ERROR: Multiple freeing At free of pointer already freed Address 0x40025e00, size 512 ... WARNING: Memory leak Address 0x40028e00, size 512 WARNING: Total memory leaks:
1 unfreed allocations totaling 512 bytes *** Finished at Tue ... 10:07:15 2002 Allocated a grand total of 1024 bytes 2 allocations Average of 512 bytes per allocation Max bytes allocated at one time: 1024 24 K alloced internally / 12 K mapped now / 8 K max Virtual program size is 1416 K End. YAMD 显示我们已经释放了内存,而且存在内存泄漏。让我们在清单 4 中另一个样本程序上试试 YAMD。
清单 4. 内存代码(test2.c)
#include
清单 5 显示了在样本程序 test2 上使用 YAMD 得到的输出。YAMD 告诉我们在 for 循环中有―越界(out-of-bounds)‖的情况。
清单 5. 使用 YAMD 的 test2 输出 Running /usr/src/test/test2/test2 Temp output to /tmp/yamd-out.1243 *********
./run-yamd: line 101: 1248 Segmentation fault (core dumped) YAMD version 0.32 Starting run: /usr/src/test/test2/test2 Executable: /usr/src/test/test2/test2 Virtual program size is 1380 K ... INFO: Normal allocation of this block Address 0x40025e00, size 512 ... INFO: Normal allocation of this block Address 0x40028e00, size 512 ... INFO: Normal allocation of this block Address 0x4002be00, size 512 ERROR: Crash ... Tried to write address 0x4002c000 Seems to be part of this block: Address 0x4002be00, size 512 ... Address in question is at offset 512 (out of bounds) Will dump core after checking heap. Done. MEMWATCH 和 YAMD 都是很有用的调试工具,它们的使用方法有所不同。对于 MEMWATCH,您需要添加包含文件 memwatch.h 并打开两个编译时间标记。对于链接(link)语句,YAMD 只需要 -g 选项。
4.3 Electric Fence
(说明:资料从网上来,该软件没有试用过)
多数 Linux 分发版包含一个 Electric Fence 包,不过您也可以选择下载它。Electric Fence 是一个由 Bruce Perens 编写的 malloc() 调试库。它就在您分配内存后分配受保护的内存。如果存在 fencepost 错误(超过数组末尾运行),程序 …… 此处隐藏:3740字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [学前教育]MC9S12XS256RMV1 xs128芯片手册4
- [学前教育]安东尼语录经典语录
- [学前教育]e级gps控制测量技术设计书
- [学前教育]苏教版2022-2022学年八年级下学期期末
- [学前教育]装修公司推广 营销
- [学前教育]家政服务合同(完整版)
- [学前教育]湖北省2016届高三联考语文试题
- [学前教育]爱立信无涯学习系统LTE题库1-LTE基础知
- [学前教育]揭秘大众柴油车作弊软件原理
- [学前教育]人才流失原因及对策分析
- [学前教育]房屋建筑施工工程劳务分包合同
- [学前教育]国际贸易实务试卷A卷09.6
- [学前教育]校园废品回收活动计划方案书范文格
- [学前教育]电大成本会计试题及答案
- [学前教育]大学物理实验 华南理工出版社 绪论答案
- [学前教育]爱丁堡产后抑郁量表
- [学前教育]液压冲击的危害、产生原因与防止方法(
- [学前教育]学生工作总结高一学生期中考试总结_020
- [学前教育]人民医院医疗废物管理规章制度大全
- [学前教育]阳光维生素的巨大抗癌潜能阅读题答案.d
- 马云在云锋基金江苏论坛闭幕式的发言
- 试论小学体育教育中的心理健康教育-教
- 语文A版一年级下册《语文乐园一》教学
- 2021四川大学物理化学考研真题经验参考
- [人教A版]2015-2016学年高中数学 第二
- 终端网点销售返利协议书
- 江苏省2015年眼科学主治医师青光眼考试
- 2017年部编人教版八年级语文上册教案
- 十一中学七年级英语上册Unit7Howmuchar
- 以赛促教的创新性实验教学机制建设实践
- 平凉市崆峒区2015七年级下生物期末试题
- 琶洲(地块五)A、B塔楼1、2#塔吊基础
- 一级医院工作制度与人员岗位职责
- 2018北京西城区高三二模理科数学试题及
- 炒股密码线技术 - 图文
- 职高学生生涯发展辅导教案
- 语文人教版四年级上册8 世界地图引出的
- 最新最新人教版二年级上册全册数学教案
- 2017高考英语全国2卷精彩试题(有问题
- 普通心理学笔记




