valgrind callgrind,valgrind 性能分析
#包括输入输出流
使用命名空间td
//mytest.cpp
intmain(intargc,char*argv[])
{//line120
constittn=10//# of elementsinarray
constit ng _ nLargeRange=500 * 1024 * 1024;
cout Startoftests endl
int * P1=new int(1);//usetocauseleak
int * p2=new int[N];//allocateanintarray
int * P3=new int(2);//usedtotestwrongdelete
char * CP=0;//cpisnullpointer
charca[3];//uniinitializedarray
char * pLarge=NULL//usedtotestsetaddressrangeperms:大范围
cout Test1:offbyone endl;
for(inti=1;I N 1;I)//一次性循环
p2[I]=I;//err-initializeelementp[N]
cout test 2:accessfreedstorage endl;
删除P1;
* P1=3;//err-accessingfreedstorage
cout Test3:usinguninitializedstorage endl;
if(p2[0])cout Junk endl;//err-usedunitdata
cout Test4:deletearrayusingscalardelete endl;
delete p2//err-deleterarraywithscalardelete
cout test 5:arraydeleteofscalar endl;
删除[]P3;//err-arraydeleteofscalar
cout test 6:overlappingstorageblocks endl;
memcpy(ca,ca[1],2);//err-overlappingstorageblocks
cout test 7:systemcallusinguniinitializedata endl;
睡眠(1ca[0]);//err-uninitdatainsystemcall
cout test 8:setaddressrangeperms:大范围 endl
pLarge=new char[g _ nLargeRange];
cout test 9:assigntonullpointer-seg faults endl;
* CP= a//err-usednullpointer(Segfauilts)
cout Endoftests endl
返回0
}
运行goa a a CPP
valgrind-tool=mem check-num-callers=50-leak-check=full-log-file=mem check ./a
屏幕输出
开始测试
测试1:offbyone
测试2:accessfreedstorage
测试3:使用未初始化存储
测试4:deletearrayusingscalardelete
测试5:arraydeleteofscalar
测试6:重叠存储块
测试7:系统调用使用未初始化数据
测试8:setaddressrangeperms:大范围
测试9:assigntonullpointer-seg故障
段错误
日志
==29816==Memcheck,一个内存错误检测器。
==29816==版权所有2002-2008年,GNU GPLd作者朱利安苏厄德等人。
==29816==使用利维克斯1884年修订版,一个用于动态二进制翻译的库。
==29816==版权所有2004-2008年,GNU GPLd由甲骨文全球大会LLP .
==29816==使用valgrind-3.4.1,一个动态二进制插装框架。
==29816==版权所有2000年至2008年,由朱利安苏厄德等人使用GNU GPL d .
==29816==有关更多详细信息,请使用:-v重新运行
==29816==
==29816==我的PID=29816,父PID=26483 .食物和一个参数名是:
==29816==./a
==29816==
==29816==大小为四的无效写入
==29816==at0x 804887 b:main(a . CPP:20)
==29816==地址0x401c088是大小为40的块分配后的0个字节
==29816==at0x4005515:运算符新[](无符号int) (vg_replace_malloc.c:268)
==29816==by0x 8048819:main(a . CPP:13)
==29816==
==29816==大小为四的无效写入
==29816==在0x 80488 B9:main(a . CPP:23)
==29816==地址0x401c028是一个大小为四的块中的0个字节
==29816==在0x4005BD1:运算符delete(void *)(VG _ replace _ malloc。丙:342)
==29816==by0x 80488 b5:main(a . CPP:22)
==29816==
==29816==条件跳转或移动取决于未初始化的值
==29816==at0x 80488 ea:main(a . CPP:25)
==29816==
==29816==不匹配的free()/delete/delete []
==29816==在0x4005BD1:运算符delete(void *)(VG _ replace _ malloc。丙:342)
==29816==by0x 804893 e:main(a . CPP:27)
==29816==地址0x401c060是大小为40的块内的0个字节
==29816==at0x4005515:运算符新[](无符号int) (vg_replace_malloc.c:268)
==29816==by0x 8048819:main(a . CPP:13)
==29816==
==29816==不匹配的free()/delete/delete []
==29816==在0x4005F61:运算符delete[](void *)(VG _ replace _ malloc。丙:364)
==29816==by0x 8048973:main(a . CPP:29)
==29816==地址0x401c0b8是大小为四的块内的0个字节
==29816==在0x400502D:运算符新(无符号整数)(vg_replace_malloc.c:224)
==29816==by0x 8048828:main(a . CPP:14)
==29816==
==29816==条件跳转或移动取决于未初始化的值
==29816==at 0 xa 8 f 7 AC:sleep(in/lib/libc-2.5。所以)
==29816==by0x 80489 DC:main(a . CPP:33)
==29816==警告:设置地址范围烫发:大范围[0x884a028,0x 27 C4 a028](未定义)
==29816==
==29816==大小为一的无效写入
==29816==at0x 8048 a37:main(a . CPP:37)
==29816==地址0x0未被堆栈、内存分配或(最近)释放
==29816==
==29816==进程以信号11(西格夫)的默认动作终止
==29816==不在地址0x0的映射区域内访问
==29816==at0x 8048 a37:main(a . CPP:37)
==29816==如果您认为这是由于您的
==29816==程序的主线程(不太可能但有可能),可以尝试增加
==29816==使用- main-stacksize=标志的主线程堆栈的大小。
==29816==本次运行中使用的主线程堆栈大小为10485760。
==29816==
==29816==错误摘要:7个上下文中的七个错误(已取消:1中的15个)
==29816==malloc/free:在出口处使用:1块中524,288,000字节。
==29816==malloc/free: 4个分配,3个免费,分配了524,288,048字节。
==29816==对于检测到的错误计数,使用:-v重新运行
==29816==Use - track-origins=yes查看未初始化值的来源
==29816==搜索指向一个未释放块的指针。
==29816==已检查87,856字节。
==29816==
==29816==泄漏汇总:
==29816==肯定丢了:0块0字节。
==29816==可能丢失:0个块中的0个字节。
==29816==仍然可达:1块中524,288,000字节。
==29816==取消:0个块中有0个字节。
==29816==不显示可到达的块(找到指针的那些块)。
==29816==要查看它们,请使用:-泄漏检查=完全显示-可到达=是重新运行