文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>揭开Linux系统内核调试器的神秘面纱(二)

揭开Linux系统内核调试器的神秘面纱(二)

时间:2007-05-22  来源:lingfen1552

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

  [code:1:ff78191c7b]#include

  #include

  #include "memwatch.h"

  int main(void)

  {

  char *ptr1;

  char *ptr2;

  ptr1 = malloc(512);

  ptr2 = malloc(512);

  ptr2 = ptr1;

  free(ptr2);

  free(ptr1);

  }[/code:1:ff78191c7b]

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

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

  test1

  [code:1:ff78191c7b]gcc -DMEMWATCH -DMW_STDIO test1.c memwatch c -o test1[/code:1:ff78191c7b]

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

  清单 2. test1 memwatch.log 文件

  [code:1:ff78191c7b]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[/code:1:ff78191c7b]

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

  [color=blue:ff78191c7b]YAMD[/color:ff78191c7b]

  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 输出

  [code:1:ff78191c7b]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.[/code:1:ff78191c7b]

  YAMD 显示我们已经释放了内存,而且存在内存泄漏。让我们在清单 4 中另一个样本程序上试试 YAMD。

  清单 4. 内存代码(test2.c)

  [code:1:ff78191c7b]#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);

  }[/code:1:ff78191c7b]

  您可以使用下面的命令来启动 YAMD:

  [code:1:ff78191c7b]./run-yamd /usr/src/test/test2/test2 [/code:1:ff78191c7b]

  清单 5 显示了在样本程序 test2 上使用 YAMD 得到的输出。YAMD 告诉我们在 for 循环中有“越界(out-of-bounds)”的情况。

  清单 5. 使用 YAMD 的 test2 输出

  [code:1:ff78191c7b]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.[/code:1:ff78191c7b]

  MEMWATCH 和 YAMD 都是很有用的调试工具,它们的使用方法有所不同。对于 MEMWATCH,您需要添加包含文件 memwatch.h 并打开两个编译时间标记。对于链接(link)语句,YAMD 只需要 -g 选项。

  [color=blue:ff78191c7b]Electric Fence[/color:ff78191c7b]
相关阅读 更多 +
排行榜 更多 +
rento大富翁手游

rento大富翁手游

休闲益智 下载
冲撞赛车3无限金币版

冲撞赛车3无限金币版

赛车竞速 下载
电动火车模拟器内置菜单

电动火车模拟器内置菜单

赛车竞速 下载