Chinaunix首页 | 论坛 | 博客
  • 博客访问: 518981
  • 博文数量: 137
  • 博客积分: 3170
  • 博客等级: 中校
  • 技术积分: 1455
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-17 11:47
文章分类

全部博文(137)

文章存档

2015年(2)

2013年(1)

2012年(6)

2011年(5)

2010年(62)

2009年(61)

我的朋友

分类: C/C++

2009-12-12 16:41:57


[11:56] valgrind --tool=memcheck --leak-check=yes ./LoginServer

[11:58] valgrind --leak-check=full --show-reachable=yes --trace-children=yes --xml=yes --xml-file='log.xml'   ./uworld
命令选项的历程:
时间
valgrind  --run-libc-freeres=no  --leak-check=full --show-reachable=yes --leak-resolution=med --log-file=log1001181542 ./exe

0.总的原则:
0.1 先改log前面的错误,原因前面的错误可能是后面错误的成因。
0.2 一定要结合gdb调试来查找问题,单看错误log可能搞不定。

1.注意编译选项的设置-g,-O0,-O1,-O2,...,-O0可能是最容易查出问题的选项,具体可查看

2. Preparing your program
2.
-num-callers
可能增大调用的栈
3.最好是按顺序解决error,后面的error可能由于前面产生
4.memcheck不能告诉你为什么leak,unfortunately
5.valgrind-3.5.0  关于leak的关键词
definitely lost
possibly lost
6.
Memcheck also reports uses of uninitialised values

这个难于找到root 原因。可以使用选项
--track-origins=yes
7.valgrind可以查出问题,但是并不能阻止错误
8.查看使用未初始化data选项
To see information on the sources of uninitialised data in your program,
使用
--track-origins=yes option,此选项可能会使程序运行更慢
10.内存泄露错误提示及典型分析
10.1 Syscall param write(buf) points to uninitialised byte(s)

Address 0x555de46 is 6 bytes inside a block of size 273,360 alloc'd
错误原因:一般伴随系统调用。
解释:写进系统内核的buf并没有初始化,典型例子:

char* arr = malloc(10);
  int* arr2 = malloc(sizeof(int));
  write( 1 /* stdout */, arr, 10 );  //arr未初始化
  exit(arr2[0]);

另外,如果buf的长度为4,而如果写入的长度为10或其他(>4),则也会出现这个问题。
10.2 Conditional jump or move depends on uninitialised value(s)
解释:用于逻辑判断的数据没有初始化,检查相应的一些跳转语句,例如:if。
深入分析逻辑数据的来世今生!!

阅读(5173) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~