教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 学前教育 >

嵌入式linux应用程序调试方法(7)

来源:网络收集 时间:2026-07-29
导读: 关于这两个函数,作者给出的注释为: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()

关于这两个函数,作者给出的注释为: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 #include int main(void) { char *ptr1; char *ptr2; char *chptr; int i = 1; ptr1 = malloc(512); ptr2 = malloc(512); chptr = (char *)malloc(512); for (i; i <= 512; i++) { chptr[i] = 'S'; } ptr2 = ptr1; free(ptr2); free(ptr1); free(chptr); } 您可以使用下面的命令来启动 YAMD: ./run-yamd /usr/src/test/test2/test2

清单 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字,全部文档内容请下载后查看。喜欢就下载吧 ……

嵌入式linux应用程序调试方法(7).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/594924.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)