黑客风云——风云网络
设为首页 加入收藏 我要投稿 网站地图
您现在的位置: 黑客风云 >> 黑客文章 >> 操作系统 >> LINIX UNIX >> 文章正文
[推荐]Linux系统中找出并解决程序错误方法
        ★★★
Linux系统中找出并解决程序错误方法
文章整理发布:黑客风云 文章来源:www.05112.com 更新时间:2006-11-14

  第 1 种情况:内存调试工具

  C 语言作为 Linux 系统上标准的编程语言给予了我们对动态内存分配很大的控制权。然而,这种自由可能会导致严重的内存管理问题,而这些问题可能导致程序崩溃或随时间的推移导致性能降级。

  内存泄漏(即 malloc() 内存在对应的 free() 调用执行后永不被释放)和缓冲区溢出(例如对以前分配到某数组的内存进行写操作)是一些常见的问题,它们可能很难检测到。这一部分将讨论几个调试工具,它们极大地简化了检测和找出内存问题的过程。

  MEMWATCH

  MEMWATCH 由 Johan Lindh 编写,是一个开放源代码 C 语言内存错误检测工具,您可以自己下载它(请参阅本文后面部分的参考资料)。只要在代码中添加一个头文件并在 gcc 语句中定义了 MEMWATCH 之后,您就可以跟踪程序中的内存泄漏和错误了。MEMWATCH 支持 ANSI C,它提供结果日志纪录,能检测双重释放(double-free)、错误释放(erroneous free)、没有释放的内存(unfreed memory)、溢出和下溢等等。

CODE:#include "STDLIB.H" 
#include "STDIO.H" 
#include "memwatch.h" 

int main(void) 
{ 
char *ptr1; 
char *ptr2; 

ptr1 = malloc(512); 
ptr2 = malloc(512); 

ptr2 = ptr1; 
free(ptr2); 
free(ptr1); 
}

清单 1. 内存样本(test1.c)

  清单 1 中的代码将分配两个 512 字节的内存块,然后指向第一个内存块的指针被设定为指向第二个内存块。结果,第二个内存块的地址丢失,从而产生了内存泄漏。

  现在我们编译清单 1 的 memwatch.c。下面是一个 makefile 示例:

CODE:test1 
gcc -DMEMWATCH -DMW_STDIO test1.c memwatch 
c -o test1

  当您运行 test1 程序后,它会生成一个关于泄漏的内存的报告。清单 2 展示了示例 memwatch.log 输出文件。

CODE:MEMWATCH 2.67 Copyright (C) 1992-1999 Johan Lindh 

... 
double-free: <4> test1.c(15), 0x80517b4 was freed from test1.c(14) 
... 
unfreed: <2> test1.c(11), 512 bytes at 0x80519e4 
{FE FE FE FE FE FE FE FE FE FE FE FE ..............} 

Memory usage statistics (global): 
N)umber of allocations made: 2 
L)argest memory usage : 1024 
T)otal of all alloc() calls: 1024 
U)nfreed bytes totals : 512

清单 2. test1 memwatch.log 文件

  MEMWATCH 为您显示真正导致问题的行。如果您释放一个已经释放过的指针,它会告诉您。对于没有释放的内存也一样。日志结尾部分显示统计信息,包括泄漏了多少内存,使用了多少内存,以及总共分配了多少内存。

上一页  [1] [2] [3] [4] [5] [6] 下一页  

文章录入:sygbox    责任编辑:sygbox 
【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
Copyright @2006 黑客风云 ●业务联系:QQ 联系怪人 联系奇人 Email:给怪人发邮件 给奇人发邮件
ICP备案:冀06009886