当前位置:七道奇文章资讯系统安全Linux安全
日期:2011-01-23 03:26:00  来源:本站整理

<b>在 Linux下调试内存泄露的办法</b>[Linux安全]

赞助商链接



  本文“<b>在 Linux下调试内存泄露的办法</b>[Linux安全]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

由于内存泄露不是显而易见,并且存在内存错误的 C 和 C++ 程序会招致各种问题,所以需求分外关注 C 和 C++ 编程的内存问题,分外是内存泄露.本文先从若何发现内存泄露,然后是用差别的办法和工具定位内存泄露,最后对这些工具举行了对比,别的还简单介绍了资源泄露的处理(以句柄泄露为例).本文利用的测试平台是:Linux (Redhat AS4).但是这些办法和工具很多都不只是范围于 C/C++ 语言以及 linux 操作系统.

内存泄露普通指的是堆内存的泄露.堆内存是指程序从堆中分配的、大小肆意的(内存块的大小可以在程序运行期决意)、利用完后必须显示的释放的内存.利用程序普通利用malloc、realloc、new 等函数从堆中分配到一块内存,利用完后,程序必须负责呼应的调用 free 或 delete 释放该内存块.不然,这块内存就不能被再次利用,我们就说这块内存泄露了.

1. 若何发现内存泄露

有些简单的内存泄露问题可以从在代码的查抄阶段肯定.还有些泄露对比严重的,即在很短的时间内招致程序或系统崩溃,大概系统报告没有充足内存,也对比简单发现.最艰难的就是泄露对比迟钝,需求察看几天、几周乃至几个月才能看到明显非常现象.那么如安在对比短的时间内检测出有没有潜在的内存泄露问题呢?实际上差别的系统都带有内存监督工具,我们可以从监督工具汇集一段时间内的仓库内存信息,察看增长趋向,来肯定能否有内存泄露.在 Linux 平台可以用 ps 号令,来监督内存的利用,比方下面的号令 (察看指定进程的VSZ值):

ps -aux

2. 静态解析

包含手动检测和静态工具解析,这是代价最小的调试办法.

(1)手动检测

当利用 C/C++ 举行开辟时,采取杰出的一致的编程标准是避免内存问题第一道也是最重要的办法.检测是编码尺度的增补.二者各有裨益,但结合利用效果分外好.专业的 C 或 C++ 专业人员乃至可以浏览不熟习的源代码,并以极低的本钱检测内存问题.通过少量的实践和得当的文本搜索,您可以快速考证均衡的 *alloc() 和 free() 大概 new 和 delete 的源主体.人工查看此类内容普通会呈现像清单 1 中一样的问题,可以定位出在函数 LeakTest 中的堆变量 Logmsg 没有释放.

清单1. 简单的内存泄露

  1. #include   
  2.  
  3. #include   
  4.  
  5. #include   
  6.  
  7. int LeakTest(char * Para)  
  8.  
  9. {  
  10.  
  11. if(NULL==Para){  
  12.  
  13. //local_log("LeakTest Func: empty parameter\n");  
  14.  
  15. return -1;  
  16.  
  17. }  
  18.  
  19. char * Logmsg = new char[128];  
  20.  
  21. if(NULL == Logmsg){  
  22.  
  23. //local_log("memeory allocation failed\n");  
  24.  
  25. return -2;  
  26.  
  27. }  
  28.  
  29. sprintf(Logmsg,"LeakTest routine exit: '%s'.\n", Para);  
  30.  
  31. //local_log(Logmsg);  
  32.  
  33. return 0;  
  34.  
  35. }  
  36.  
  37. int main(int argc,char **argv )  
  38.  
  39. {  
  40.  
  41. char szInit [] = "testcase1";  
  42.  
  43. LeakTest(szInit);  
  44.  
  45. return 0;  
  46.  
  47. }  
  48.  

(2)静态代码解析工具

代码静态扫描和解析的工具对比多,比方 splint, PC-LINT, BEAM 等.因为 BEAM 支持的平台对比多,这以 BEAM 为例,做个简单介绍,别的有近似的处理历程.

BEAM 可以检测四类问题: 没有初始化的变量;废弃的空指针;内存泄露;冗余计算.并且支持的平台对比多.

BEAM 支持以下平台:

Linux x86 (glibc 2.2.4)

Linux s390/s390x (glibc 2.3.3 or higher)

Linux (PowerPC, USS) (glibc 2.3.2 or higher)

AIX (4.3.2+)

Window2000 以上

清单2. 用作 Beam 解析的代码

  1. #include   
  2.  
  3. #include   
  4.  
  5. #include   
  6.  
  7. int *p;  
  8.  
  9. void  
  10.  
  11. foo(int a)  
  12.  
  13. {  
  14.  
  15. int b, c;  
  16.  
  17. b = 0;  
  18.  
  19. if(!p)  
  20.  
  21. c = 1;  
  22.  
  23. if(c > a)  
  24.  
  25. c += p[1];  
  26.  
  27. }  
  28.  
  29. int LeakTest(char * Para)  
  30.  
  31. {  
  32.  
  33. char * Logmsg = new char[128];  
  34.  
  35. if((Para==NULL)||(Logmsg == NULL))  
  36.  
  37. return -1;  
  38.  
  39. sprintf(Logmsg,"LeakTest routine exit: '%s'.\n", Para);  
  40.  
  41. return 0;  
  42.  
  43. }  
  44.  
  45. int main(int argc,char **argv )  
  46.  
  47. {  
  48.  
  49. char szInit [] = "testcase1";  
  50.  
  51. LeakTest(szInit);  
  52.  
  53. return 0;  
  54.  
  55. }  
  56.  

下面以 X86 Linux 为例,代码如清单 2,具体的环境以下:

OS: Red Hat Enterprise Linux AS release 4 (Nahant Update 2)

GCC: gcc version 3.4.4

BEAM: 3.4.2; https://w3.eda.ibm.com/beam/

可以把 BEAM 看做一个 C/C++ 编译器,按下面的号令举行编译 (前面两个号令是设置编译器环境变量):

  1. ./beam-3.4.2/bin/beam_configure --c gcc  
  2.  
  3. ./beam-3.4.2/bin/beam_configure --cpp g++  
  4.  
  5. ./beam-3.4.2/bin/beam_compile --beam::compiler=compiler_cpp_config.tcl -cpp code2.cpp  
  6.  

从下面的编译报告中,我们可以看到这段程序中有三个错误:”内存泄露”;“变量未初始化”;“ 空指针操作”

  1. "code2.cpp", line 10: warning: variable "b" was set but never used  
  2.  
  3. int b, c;  
  4.  
  5. ^  
  6.  
  7. BEAM_VERSION=3.4.2  
  8.  
  9. BEAM_ROOT=/home/hanzb/memdetect  
  10.  
  11. BEAM_DIRECTORY_WRITE_INNOCENTS=  
  12.  
  13. BEAM_DIRECTORY_WRITE_ERRORS=  
  14.  
  15. -- ERROR23(heap_memory) /*memory leak*/ >>>ERROR23_LeakTest_7b00071dc5cbb458  
  16.  
  17. "code2.cpp", line 24: memory leak  
  18.  
  19. ONE POSSIBLE PATH LEADING TO THE ERROR:  
  20.  
  21. "code2.cpp", line 22: allocating using `operator new[]' (this memory will not be freed)  
  22.  
  23. "code2.cpp", line 22: assigning into `Logmsg'  
  24.  
  25. "code2.cpp", line 24: deallocating `Logmsg' because exiting its scope  
  26.  
  27. (losing last pointer to the memory)  
  28.  
  29. -- ERROR1 /*uninitialized*/ >>>ERROR1_foo_60c7889b2b608  
  30.  
  31. "code2.cpp", line 16: uninitialized `c'  
  32.  
  33. ONE POSSIBLE PATH LEADING TO THE ERROR:  
  34.  
  35. "code2.cpp", line 10: allocating `c'  
  36.  
  37. "code2.cpp", line 13: the if-condition is false  
  38.  
  39. "code2.cpp", line 16: getting the value of `c'  
  40.  
  41. VALUES AT THE END OF THE PATH:  
  42.  
  43. p != 0  
  44.  
  45. -- ERROR2 /*operating on NULL*/ >>>ERROR2_foo_af57809a2b615  
  46.  
  47. "code2.cpp", line 17: invalid operation involving NULL pointer  
  48.  
  49. ONE POSSIBLE PATH LEADING TO THE ERROR:  
  50.  
  51. "code2.cpp", line 13: the if-condition is true (used as evidence that error is possible)  
  52.  
  53. "code2.cpp", line 16: the if-condition is true  
  54.  
  55. "code2.cpp", line 17: invalid operation `[]' involving NULL pointer `p'  
  56.  
  57. VALUES AT THE END OF THE PATH:  
  58.  
  59. c = 1 
  60.  
  61. p = 0 
  62.  
  63. <= 0  
  64.  



  以上是“<b>在 Linux下调试内存泄露的办法</b>[Linux安全]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .