77范文网 - 专业文章范例文档资料分享平台

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

来源:网络收集 时间:2019-04-23 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

关于这两个函数,作者给出的注释为: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 错误(超过数组末尾运行),程序就会产生保护错误,并立即结束。通过结合 Electric Fence 和 gdb,您可以精确地跟踪到哪一行试图访问受保护内存。Electric Fence 的另一个功能就是能够检测内存泄漏。

五 C/C++代码覆盖、性能profiling工具

C/C++代码覆盖、性能profiling工具一般基于GNU的gprof和gcov。还有一类基于模拟器的profiling工具,如IBM Purify, Valgrind。KCahcegrind是Callgrind,OProfile等的GUI前端。性能测试工具有ggcof,kprof,lcov等等。lcov是Linux Testing Project工具之一,见http://ltp.sourceforge.net/tooltable.php上的工具列表。这儿还有压力测试、WEB Server测试等许多工具。在http://www.testingfaqs.org分类归纳了多种软件测试工具。

5.1 用gcov来测试代码覆盖率

gcov是gnu/gcc工具库中的一个组件, 用来测试代码的覆盖率;当构建一个程序时,gcov会监视一个程序的执行,并且会标识出执行了哪一行源码,哪一行没有执行。更进一步,gcov可以标识出某一行源执行的次数,这样就可以知道程序在哪里花费了大多数的时间。

为什么要测试代码覆盖率?

我是不喜欢在代码中有跑不到的地方,那只是在白白浪费空间,降低效率

当然了,有些时候,我们可以通过跑代码覆盖率来发现我们有什么异常情况没有进行测试,毕竟单元测试的用例,不可能一下就想的很全面的。

例如,你的程序在某个函数的入口前处检测了指针不为空,你进入调用函数以后又检测了一回这个指针,并且对为NULL的情况进行处理,那么两处之中必有一处是在浪费空间,当然你的硬盘大,放的下,但是代码写的精致一些,不是更好么?

? 获得gcov

gcov是gnu/gcc工具库的组件,所以在建立交叉编译工具的时候需要指定创建这个工具。

在arm-linux-的交叉编译工具中,arm-linux-gcov好像默认是存在的;操作系统组给我的交叉编译环境中是有这一工具的;但是uClinux的交叉编译环境中默认好像是没有这个工具的;具体的搭建从下面gprof的讨论也许能够得到一些信息。因为现在我还没有移植操作系统的经验,所以无法对这个进行证实。

关于这个论坛上面的讨论是:

> The gprof program, for historical reasons, is sometimes excluded > from a cross-targeted toolchain. If you have a source tree with > a Cygnus configure script at the top level, or a gcc source tree, > then look for the \

> configure.in, remove \ Then reconfigure the build tree, > and run \

That did it!

Just to be clear, this is what I did:

I untar'd the binutils-2.12.1 tar ball and edited

binutils-2.12.1/configure.in. There's a line containing \ several packages (like gprof, sed,...); I removed gprof from that list.

I then followed the instructions here for building binutils:

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库嵌入式linux应用程序调试方法(5)在线全文阅读。

嵌入式linux应用程序调试方法(5).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/622722.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: