valgrind

http://www.linuxidc.com/Linux/2012-06/63754.htm

still reachable

多数情况不是问题,比如程序是一个服务,一直运行一个while循环,而new出来的对象如果只能在析构delete,那么对象就永远不会被释放,valgrind就会报这样的问题

一 Valgrind工具集简绍

Valgrind包含下列工具:

1、memcheck:检查程序中的内存问题,如泄漏、越界、非法指针等。

2、callgrind:检测程序代码的运行时间和调用过程,以及分析程序性能。

3、cachegrind:分析CPU的cache命中率、丢失率,用于进行代码优化。

4、helgrind:用于检查多线程程序的竞态条件。

5、massif:堆栈分析器,指示程序中使用了多少堆内存等信息。

6、lackey:

7、nulgrind:


1.Memcheck

最常用的工具,用来检测程序中出现的内存问题,所有对内存的读写都会被检测到,一切对malloc、free、new、delete的调用都会被捕获。所以,它能检测以下问题:

1、对未初始化内存的使用;

2、读/写释放后的内存块;

3、读/写超出malloc分配的内存块;

4、读/写不适当的栈中内存块;

5、内存泄漏,指向一块内存的指针永远丢失;

6、不正确的malloc/free或new/delete匹配;

7、memcpy()相关函数中的dst和src指针重叠。





存泄露检测

$ valgrind --leak-check=full --show-reachable=yes --trace-children=yes   ./iquery   -f ../conf/se.conf_forum -t  ~/eragon/forum_thread_data/f.log -NT   -cache 0

其中--leak-check=full 指的是完全检查内存泄漏,--show-reachable=yes是显示内存泄漏的地点,--trace-children=yes是跟入子进程。当程序正常退出的时候valgrind自然会输出内存泄漏的信息。

==4591==

==4591== Thread 1:

==4591== Conditional jump or move depends on uninitialised value(s)

==4591==    at 0x805687B: main (TestQuery.cpp:478)

==4591==

==4591== Conditional jump or move depends on uninitialised value(s)

==4591==    at 0x8056894: main (TestQuery.cpp:478)

==4591==

==4591== Conditional jump or move depends on uninitialised value(s)

==4591==    at 0x80568AD: main (TestQuery.cpp:478)

==4591== Warning: set address range perms: large range 215212032 (noaccess)

==4591== Warning: set address range perms: large range 125145088 (noaccess)

==4591==

==4591== ERROR SUMMARY: 6 errors from 4 contexts (suppressed: 18 from 1)

==4591== malloc/free: in use at exit: 496 bytes in 2 blocks.

==4591== malloc/free: 928,605 allocs, 928,603 frees, 2,514,165,074 bytes allocated.

==4591== For counts of detected errors, rerun with: -v

==4591== searching for pointers to 2 not-freed blocks.

==4591== checked 10,260,564 bytes.

==4591==

==4591==

==4591== 144 bytes in 1 blocks are possibly lost in loss record 1 of 2

==4591==    at 0x4005906: calloc (vg_replace_malloc.c:279)

==4591==    by 0xB3671A: _dl_allocate_tls (in /lib/ld-2.3.4.so)

==4591==    by 0xD9491E: pthread_create@@GLIBC_2.1 (in /lib/tls/libpthread-2.3.4.so)

==4591==    by 0x8200C66: public_unit::CThread::start(void*) (Thread.cpp:25)

==4591==    by 0x80567C3: main (TestQuery.cpp:473)

==4591==

==4591==

==4591== 352 bytes in 1 blocks are still reachable in loss record 2 of 2

==4591==    at 0x40044F6: malloc (vg_replace_malloc.c:149)

==4591==    by 0xB9905E: __fopen_internal (in /lib/tls/libc-2.3.4.so)

==4591==    by 0xB9911C: fopen@@GLIBC_2.1 (in /lib/tls/libc-2.3.4.so)

==4591==    by 0x805940C: CSearchThread::run(void*) (TestQuery.cpp:363)

==4591==    by 0x8200D09: public_unit::CThread::thread_func(void*) (Thread.cpp:44)

==4591==    by 0xD94370: start_thread (in /lib/tls/libpthread-2.3.4.so)

==4591==    by 0xC0DFFD: clone (in /lib/tls/libc-2.3.4.so)

==4591==

==4591== LEAK SUMMARY:

==4591==    definitely lost: 0 bytes in 0 blocks.

==4591==       possibly lost: 144 bytes in 1 blocks.

==4591==    still reachable: 352 bytes in 1 blocks.

==4591==           suppressed: 0 bytes in 0 blocks.

关键字在:ERROR SUMMARY, LEAK SUMMARY

"definitely lost" means your program is leaking memory -- fix it!

"possibly lost" means your program is probably leaking memory, unless you're doing funny things with pointers.

"still reachable" means your program is probably ok -- it didn't freesome memory it could have. This is quite common and often reasonable.Don't use --show-reachable=yes if you don't want to see these reports.

"suppressed" means that a leak error has been suppressed. There aresome suppressions in the default suppression files. You can ignoresuppressed errors

另外一种方式,激活加载调试器

gcc -Wall   -g   -pg   -o get_XMLDOC   get_XMLDOC.c

$ valgrind   --db-attach=yes   --leak-check=full        ./get_XMLDOC   ~/eragon/data/offer_gb.xml   1.xml   10

==8956== Memcheck, a memory error detector.

==8956== Copyright (C) 2002-2006, and GNU GPL'd, by Julian Seward et al.

==8956== Using LibVEX rev 1606, a library for dynamic binary translation.

==8956== Copyright (C) 2004-2006, and GNU GPL'd, by OpenWorks LLP.

==8956== Using valgrind-3.2.0, a dynamic binary instrumentation framework.

==8956== Copyright (C) 2000-2006, and GNU GPL'd, by Julian Seward et al.

==8956== For more details, rerun with: -v

==8956==

==8956==

==8956== ---- Attach to debugger ? --- [Return/N/n/Y/y/C/c] ----

==8956==

==8956== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 12 from 1)

==8956== malloc/free: in use at exit: 1,953 bytes in 2 blocks.

==8956== malloc/free: 4 allocs, 2 frees, 2,657 bytes allocated.

==8956== For counts of detected errors, rerun with: -v

==8956== searching for pointers to 2 not-freed blocks.

==8956== checked 52,840 bytes.

==8956==

==8956== 1 bytes in 1 blocks are definitely lost in loss record 1 of 2

==8956==    at 0x40044F6: malloc (vg_replace_malloc.c:149)

==8956==    by 0x80488C0: main (get_XMLDOC.c:38)

==8956==

==8956== LEAK SUMMARY:

==8956==    definitely lost: 1 bytes in 1 blocks.

==8956==       possibly lost: 0 bytes in 0 blocks.

==8956==    still reachable: 1,952 bytes in 1 blocks.

==8956==           suppressed: 0 bytes in 0 blocks.

==8956== Reachable blocks (those to which a pointer was found) are not shown.

==8956== To see them, rerun with: --show-reachable=yes

Profiling timer expired

2.4.        检查性能瓶颈

$valgrind --tool=callgrind ./iquery   -f ../conf/se.conf_forum   -s "forum_thread?q=mp4"

==4607==

==4607== Events    : Ir

==4607== Collected : 251772397

==4607==

==4607== I   refs:       251,772,397

4607为进程号。

$ ll

-rw-------   1 search search   712159   7月   9 22:31 callgrind.out.4607

$ callgrind_annotate --auto=yes   callgrind.out.4607

WARNING: header line 2 malformed, ignoring

line: 'creator: callgrind-3.2.0'

--------------------------------------------------------------------------------

I1 cache:

D1 cache:

L2 cache:

Timerange: Basic block 0 - 46942078

Trigger: Program termination

Profiled target:   ./iquery -f ../conf/se.conf_forum -s forum_thread?q=mp4 (PID 4607, part 1)

Events recorded:   Ir

Events shown:      Ir

Event sort order: Ir

Thresholds:        99

Include dirs:

User annotated:

Auto-annotation:   on

--------------------------------------------------------------------------------

Ir

--------------------------------------------------------------------------------

251,772,397   PROGRAM TOTALS

--------------------------------------------------------------------------------

Ir   file:function

--------------------------------------------------------------------------------

54,769,656   ???:__mcount_internal [/lib/tls/libc-2.3.4.so]

26,418,450   GBKNormalString.cpp:dictionary::CGBKNormalString::initNormalChars() [/home/search/eragon_yb/bin/iquery]

22,820,690   ???:mcount [/lib/tls/libc-2.3.4.so]

11,559,615   GBKNormalString.cpp:dictionary::CGBKNormalString::initCharKinds() [/home/search/eragon_yb/bin/iquery]

更多说明参考:

http://www-128.ibm.com/developerworks/cn/linux/l-pow-debug/

2.5.        cache测试

参考:http://www.wangcong.org/articles/valgrind.html

[search@alitest146 /home/search/eragon_yb/bin]

$ valgrind   --tool=cachegrind   ./iquery   -f ../conf/se.conf_forum   -s "forum_thread?q=mp3"

==8742==

==8742== I   refs:       267,968,791

==8742== I1   misses:           98,845

==8742== L2i misses:           13,382

==8742== I1   miss rate:          0.03%

==8742== L2i miss rate:          0.00%

==8742==

==8742== D   refs:       182,288,669   (120,222,370 rd + 62,066,299 wr)

==8742== D1   misses:          962,816   (    537,889 rd +    424,927 wr)

==8742== L2d misses:          707,813   (    340,925 rd +    366,888 wr)

==8742== D1   miss rate:           0.5% (          0.4%   +          0.6%   )

==8742== L2d miss rate:           0.3% (          0.2%   +          0.5%   )

==8742==

==8742== L2 refs:           1,061,661   (    636,734 rd +    424,927 wr)

==8742== L2 misses:           721,195   (    354,307 rd +    366,888 wr)

==8742== L2 miss rate:            0.1% (          0.0%   +          0.5%   )

上面的是指令缓存,I1和L2i缓存,的访问信息,包括总的访问次数,丢失次数,丢失率。

中间的是数据缓存,D1和L2d缓存,的访问的相关信息,下面的L2缓存单独的信息。Cachegrind也生成一个文件,名为cachegrind.out.pid,可以通过cg_annotate来读取。输出是一个更详细的列表。Massif的使用和cachegrind类似,不过它也会生成一个名为massif.pid.ps的PostScript文件,里面只有一幅描述堆栈使用状况的彩图。

[search@alitest146 /home/search/Isearchv3_Script_yb/tools]

$ ll   cachegrind.out*

-rw-------   1 search search   7283 Jul 11 11:21 cachegrind.out. 8633

$   cg_annotate   --8633   --auto=yes  ~/isearch_yb/src/test/core/TestQuery.cpp

--------------------------------------------------------------------------------

I1 cache:           16384 B, 32 B, 8-way associative

D1 cache:           16384 B, 64 B, 8-way associative

L2 cache:           2097152 B, 64 B, 8-way associative

Command:            ./iquery -f ../conf/se.conf_forum -s forum_thread?q=mp3

Data file:          cachegrind.out.8633

Events recorded:   Ir I1mr I2mr Dr D1mr D2mr Dw D1mw D2mw

Events shown:      Ir I1mr I2mr Dr D1mr D2mr Dw D1mw D2mw

Event sort order: Ir I1mr I2mr Dr D1mr D2mr Dw D1mw D2mw

Thresholds:        99 0 0 0 0 0 0 0 0

Include dirs:

User annotated:   /home/search/isearch_yb/src/test/core/TestQuery.cpp

Auto-annotation:   on

--------------------------------------------------------------------------------

Ir   I1mr   I2mr            Dr    D1mr    D2mr           Dw    D1mw    D2mw

--------------------------------------------------------------------------------

267,968,791 98,845 13,395 120,222,370 537,889 340,938 62,066,299 424,927 366,883   PROGRAM TOTALS

--------------------------------------------------------------------------------

Ir   I1mr   I2mr           Dr    D1mr    D2mr           Dw    D1mw    D2mw   file:function

--------------------------------------------------------------------------------

56,779,152    28      6 14,194,788       82        3 14,194,788       34       13   ???:__mcount_internal

26,418,450 108 54 12,868,530   22,710 3,028   1,943,010   79,943  30,480  GBKNormalString.cpp:dictionary::CGBKNormalString::initNormalChars()

……

-- User-annotated source: get_XMLDOC.c

--------------------------------------------------------------------------------

Ir I1mr I2mr    Dr D1mr D2mr    Dw D1mw D2mw

.    .    .      .    .    .      .    .    .   #include "stdio.h"

.    .    .      .    .    .      .    .    .   #define LINE_MAX_LEN   10240

.    .    .      .    .    .      .    .    .   //get part of   xml

.    .    .      .    .    .      .    .    .   main(int argc,char *argv[])

10    1    1      0    0    0      1    0    0   {

.    .    .      .    .    .      .    .    .        FILE *fp;

1    0    0      0    0    0      1    0    0        FILE *fpDst =NULL;

.    .    .      .    .    .      .    .    .

8    1    0      0    0    0      4    1    1        char content[LINE_MAX_LEN+1]={0};

.    .    .      .    .    .      .    .    .        int   inumOfdocs;

1    0    0      0    0    0      1    0    0        int   currentdocs=0;

1    1    1      0    0    0      1    0    0        int   isDocBegin = 0;

1    0    0      0    0    0      1    0    0        int   isDocEnd = 0;

.    .    .      .    .    .      .    .    .

2    0    0      1    0    0      0    0    0       if (argc < 4)

.    .    .      .    .    .      .    .    .        {

.    .    .      .    .    .      .    .    .          printf("usage: get_XMLDOC srcxml dstxml   numOfdocs\\n");

.    .    .      .    .    .      .    .    .          exit(1);

.    .    .      .    .    .      .    .    .        }

.    .    .      .    .    .      .    .    .

7    2    1      2    0    0      3    0    0        inumOfdocs = atoi(argv[3]);

2    0    0      1    0    0      0    0    0        if (inumOfdocs <=0 )

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,009评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,808评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,891评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,283评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,285评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,409评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,809评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,487评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,680评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,499评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,548评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,268评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,815评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,872评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,102评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,683评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,253评论 2 341

推荐阅读更多精彩内容

  • 一. 简述valgrind是什么,为何能进行内存泄露 valgrind是一个程序调试及性能分析的工具集,涵盖mem...
    Shirley_奋进中的虾米阅读 11,271评论 0 2
  • 1. 引言 最近写python用unittest模块做单元测试,才发现自己过去写C++居然都是手工测试。查了一番资...
    kophy阅读 4,411评论 1 3
  • 时隔32天,在游动的时光里再次穿梭回道场,于是又开始续写关于Amma道场的第27篇简书。 此程抵...
    兆辕阅读 479评论 0 1
  • 此刻时间:5点20分 一周总结个人-五点钟起床6天-写日记6天-运动40分钟6天-阅读一本书《公众号思维》:完成 ...
    5点起床阅读 301评论 0 0
  • 我们这一生, 要走很多条路, 有笔直坦途, 有羊肠阡陌; 有繁华,也有荒凉。 无论如何, 路要自己走, 苦要自己吃...
    白乐随心阅读 241评论 2 1