错误内存调试工具 valgrind

内存卡格式化工具  时间:2021-01-15  阅读:()

内存调试工具valgr i nd

精品好文档推荐学习交流

内存调试工具valgrind

来源 linux下面用c++写代码在所难免会遇到segmentation fault(段错误) 。个人在编写ns扩展模块时候遇到过很多段错误虽然运行时刻经常由程序抛出段错误但是段错误的发生的程序级别的原因多种多样不过归结到系统级别上段错误都是由于内存原因引起的(个人总结) 。

会造成内存错误的程序级别的原因也就是我们程序员所经常犯的错误大致可以分为以下几个方面

1使用未初始化的指针-这是必然的指针指空的东西必然出错。

2重复删除一个指针-必然再次删除就会删除一个已经分配给别的程序的数据或者其他。

3 内存冲突-由于程序声明的两块数据区域重叠造成混乱。

4混杂的指针错误-只能具体问题具体分析情况比较复杂。

对于一位刚开始用c++在linux编程的人来说最常遇到的应该的就是1与2了。当工程规模比较大程序由小组完成而后整合等的情况下很容易出现2 3 4的情况。这时候的调试比较麻烦也需要很多耐心。

我在做的wimax mesh的项目就是这样。对于一个timer的使用没有初始化造成的段错误一目了然。工程进展非常顺利。当工程做到50%时候

(11.08号) 遇到了一个段错误结果调试到12.02号才调出来我就来说一下我的调试历程吧真是一波三折阿开始的时候以为是1或者2的情况反复检查不是这样。然后怀疑3或者4结果由于没有使用任何工具只是在仅供学习与交流如有侵权请联系网站删除谢谢2

精品好文档推荐学习交流

代码中加打印信息这时候只能把错误定位到transmit(p)这个函数上。但是这个函数我只写了一行就是transmit(p)

{downtarget_-recv(p, (Handle*)NULL) 

}

程序在这个地方出错实在让人摸不到头绪 因为再往下执行就不是我代码的问题了而是下层已有代码甚至是系统代码的问题阿非常困扰

然后开始用gdb调试 gdb是一个很好的很强大的调试工具我用的命令行的所能完成的功能和vc下的调试工具差不多只是需要看什么变量就是要用print×来看罢了不过功能决不比它差。但是我用了gdb只能把错误定位在

(gdb)bt

#0 0x082d16ba in CheckChannelErrors()

#1 0x082d43a5 in Tcl_Write()

#2 0x081cdb52 in BaseTrace namdump(this=0x90e09d0)at trace/basetrace.cc 109

#3 0x08137aa4 in CMUTracenam_format(this=0x90e10b0,p=0x90fb860,offset=64)at trace/cmu-trace.cc 1123

#4 0x 081384db in CMUTraceformat(this=0x90e10b0,p=0x90fb860,why=0x833ec34"---")at trace/cmu-trace.cc 1137

仅供学习与交流如有侵权请联系网站删除谢谢3

精品好文档推荐学习交流

#5 0x 08138751 in CMUTracerecv(this=0x90e10b0,p=0x90fb860,h=0x0)at trace/cmu-trace.cc 1239#6 0x0821e9e7 in Mac802_16

mac_log(this=0x90d1f08,p=0x90fb860)at wimax/mac802_16.h 909#7 0x 082268e6 in Mac802_16MSS receive(this=0x90d1f08)at wimax/mac802_16MSS.cc 660

#8 0x08228b08 in WimaxRxTimerhandle(this=0x90d29a4,e=0x90d29b4)at wimax/mac802_16timer.cc 98#9 0x 08054332 in Schedulerdispatch(this=0x8eb6a10,p=0x90d29b4, t=10.017116268588)at common/scheduler.cc 150

#10 0x 0805457e in Scheduler run(this=0x8eb6a10)at common/scheduler.cc 129

#11 0x 0805485d in Schedulercommand(this=0x8eb6a10,argc=2,argv=0xbf a20730)at common/scheduler.cc 198

#12 0x0828b7ae in TclClass dispatch_cmd()

#13 0x 082903d0 in OTclDispatch(cd=value optimized out, in=0x8e97250,argc=3,argv=0xbfa2077c)at otcl.c 434

#14 0x 0829712e in TclInvokeStringCommand()

#15 0x08298c4b in TclEvalObjvInternal ()

#16 0x082c2ef1 in TclExecuteByteCode()

#17 0x082c6d1c in TclCompEvalObj()

仅供学习与交流如有侵权请联系网站删除谢谢4

精品好文档推荐学习交流

#18 0x082c2fca in TclExecuteByteCode()

#19 0x082c6d1c in TclCompEvalObj()

#20 0x082eec76 in TclObjInterpProc()

#21 0x082ef092 in TclProcInterpProc()

#22 0x 08290520 in OTclDispatch(cd=value optimized out, in=0x8e97250,argc=2,argv=0xbfa2131c)at otcl.c 477

#23 0x 0829712e in TclInvokeStringCommand()

#24 0x08298c4b in TclEvalObjvInternal ()

#25 0x082c2ef1 in TclExecuteByteCode()

#26 0x082c6d1c in TclCompEvalObj()

#27 0x082eec76 in TclObjInterpProc()

#28 0x082ef092 in TclProcInterpProc()

#29 0x 082903d0 in OTclDispatch(cd=value optimized out, in=0x8e97250,argc=2,argv=0xbfa21c2c)at otcl.c 434

#30 0x 0829712e in TclInvokeStringCommand()

#31 0x08298c4b in TclEvalObjvInternal ()

#32 0x 08299207 in Tcl_EvalEx()

#33 0x082ded12 in Tcl_FSEvalFile()

#34 0x082e2307 in Tcl_Main()

#35 0x0804cafc in main(argc=2747804,argv=0x178b62)at common/tclAppInit.cc 67

仅供学习与交流如有侵权请联系网站删除谢谢5

精品好文档推荐学习交流

这让我更加不解为什么会在调用ns原有代码的地方出问题呢?后来决定再换一个工具。用valgrind

在这里我先贴一下valgrind的用法我自己搜到的很详细的。姑且就不自己写了。

=

Valgrind Valgrind已经在Linux应用程序开发社区中广泛用来调试应用程序。它尤其擅长发现内存管理的问题。它可以检查程序运行时的内存泄漏问题。这个工具目前正由Julian Seward进行开发并由Paul Mackerras移植到了Power架构上。

要安装Valgrind请从Valgrind的Web站点上下载源代码(参阅参考资料) 。切换到Valgrind目录并执行下面的命令

#make

#make check

#make install

堆栈分析器它能测量程序在堆栈中使用了多少内存告诉我们堆块堆管理块和栈的大小。 Massif能帮助我们减少内存的使用在带有虚拟内存的现代系统中它还能够加速我们程序的运行减少程序停留在交换区中的几率。 Valgrind安装

1、到www.valgrind.org下载最新版valgrind-3.2.3. tar.bz2 2、解压安装包 tar– jxvf valgrind-3.2.3. tar.bz2 3、解压后生成目录valgrind-3.2.3 4、 cd valgrind-3.2.3 5、 ./configure 6、 Make make installValgrind使用

仅供学习与交流如有侵权请联系网站删除谢谢6

精品好文档推荐学习交流

用法 valgrind[options]prog-and-args[options] 常用选项适用于所有Valgrind工具

-tool=name最常用的选项。运行valgrind中名为toolname的工具。默认memcheck。 h– help显示帮助信息。 -version显示valgrind内核的版本每个工具都有各自的版本。 q– quiet安静地运行只打印错误信息。v– verbose更详细的信息,增加错误数统计。 -trace-children=no|yes跟踪子线程?[no]-track-fds=no|yes跟踪打开的文件描述?[no]-time-stamp=no|yes增加时间戳到LOG信息?[no]-log-fd=number输出LOG到描述符文件[2=stderr]-log-file=file将输出的信息写入到filename.PID的文件里 PID是运行程序的进行ID-log-file-exactly=file输出LOG信息到file-log-file-qualifier=VAR取得环境变量的值来做为输出信息的文件名。[none]-log-socket=ipaddr port输出LOG到socket ipaddr portLOG信息输出

-xml=yes将信息以xml格式输出只有memcheck可用-num-callers=number show number callers in stack traces[12]-error-limit=no|yes如果太多错误则停止显示新错误?[yes]-error-exitcode=number如果发现错误则返回错误代码[0=disable]-db-attach=no|yes当出现错误 valgrind会自动启动调试器gdb。 [no]-db-command=command启动调试器的命令行选项[gdb-nw%f%p]适用于Memcheck工具的相关选项

-leak-check=no|summary|ful l要求对leak给出详细信息?[summary]-leak-resolution=low|med|high how much bt merging in leak check[low]-show-reachable=no|yes show reachable blocks in leak check?[no]

Valgrind的错误报告

仅供学习与交流如有侵权请联系网站删除谢谢7

精品好文档推荐学习交流

Valgrind的输出格式如下

清单1.Valgrind的输出消息

#valgrind du– x– s

.

.

==29404==Address 0x1189AD84 is 0bytes after ablock of size 12alloc'd

==29404==at 0xFFB9964 malloc(vg_replace_malloc.c 130)

==29404==by 0xFEE1AD0 strdup(in/lib/tls/libc. so.6)

==29404==by 0xFE94D30 setlocale(in/lib/tls/libc. so.6)

==29404==by 0x 10001414 main(in/usr/bin/du)

==29404==是进程的ID。消息Address 0x1189AD84 is 0bytes after ablock of size 12 alloc'd说明在这个12字节的数组后面没有存储空间了。第二行以及后续几行说明内存是在130行(vg_replace_malloc.c)的strdup()程序中进行分配的。 strdup()是在libc. so.6库的setlocale()中调用的 main()调用了setlocale() 。

未初始化的内存

最为常见的一个bug是程序使用了未初始化的内存。未初始化的数据可能来源于

未经初始化的变量malloc函数所分配的数据在写入值之前使用了

下面这个例子使用了一个未初始化的数组

清单2.使用未初始化的内存

仅供学习与交流如有侵权请联系网站删除谢谢8

精品好文档推荐学习交流

2{

3 int i [5] 

4 5if(i [0]==0)

6 i [1]=1

7 return 0

8}

在这个例子中整数数组i[5]没有进行初始化 因此 i [0]包含的是一个随机数。因此使用i [0]的值来判断一个条件分支就会导致不可预期的问题。 Valgrind可以很容易捕获这种错误条件。当您使用Valgrind运行这个程序时就会接收到下面的消息

清单3.Valgrind的输出消息

#gcc– g– otest1 test1.c

#valgrind./test1

.

.

==31363==

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

==31363==at 0x 1000041C main(test1.c 5)

==31363==

==31363==ERROR SUMMARY 1 errors from 1contexts(suppressed 7from 1)

仅供学习与交流如有侵权请联系网站删除谢谢9

RAKsmart秒杀服务器$30/月,洛杉矶/圣何塞/香港/日本站群特价

RAKsmart发布了9月份优惠促销活动,从9月1日~9月30日期间,爆款美国服务器每日限量抢购最低$30.62-$46/月起,洛杉矶/圣何塞/香港/日本站群大量补货特价销售,美国1-10Gbps大带宽不限流量服务器低价热卖等。RAKsmart是一家华人运营的国外主机商,提供的产品包括独立服务器租用和VPS等,可选数据中心包括美国加州圣何塞、洛杉矶、中国香港、韩国、日本、荷兰等国家和地区数据中心(...

青云互联:美国洛杉矶CN2弹性云限时八折,15元/月起,可选Windows/可自定义配置

青云互联怎么样?青云互联是一家成立于2020年6月的主机服务商,致力于为用户提供高性价比稳定快速的主机托管服务,目前提供有美国免费主机、香港主机、香港服务器、美国云服务器,让您的网站高速、稳定运行。美国cn2弹性云主机限时8折起,可选1-20个IP,仅15元/月起,附8折优惠码使用!点击进入:青云互联官方网站地址青云互联优惠码:八折优惠码:ltY8sHMh (续费同价)青云互联活动方案:美国洛杉矶...

Webhosting24:$1.48/月起,日本东京NTT直连/AMD Ryzen 高性能VPS/美国洛杉矶5950X平台大流量VPS/1Gbps端口/

Webhosting24宣布自7月1日起开始对日本机房的VPS进行NVMe和流量大升级,几乎是翻倍了硬盘和流量,价格依旧不变。目前来看,日本VPS国内过去走的是NTT直连,服务器托管机房应该是CDN77*(也就是datapacket.com),加上高性能平台(AMD Ryzen 9 3900X+NVMe),还是有相当大的性价比的。此外在6月30日,又新增了洛杉矶机房,CPU为AMD Ryzen 9...

内存卡格式化工具为你推荐
电脑管家和360哪个好电脑安装360好,还是电脑管家好?江门旅游景点哪个好玩的地方江门有什么地方好玩的?手动挡和自动挡哪个好自动挡手动挡哪个好?少儿英语哪个好少儿英语哪套教材好哪里好呢?苹果手机助手哪个好苹果手机助手哪个好用些谁知道尼康和佳能单反哪个好请问佳能和尼康的单反哪个好?清理手机垃圾软件哪个好手机垃圾清理软件哪个好qq空间登录网页版求这张图的原图,是QQ空间最近网页版登录界面的背景群空间登录为什么QQ群空间登陆不了qq空间登录电脑手机怎么登qq空间电脑版?
长沙服务器租用 东莞服务器租用 photonvps locvps 美国主机论坛 国外私服 512m内存 绍兴高防 怎样建立邮箱 爱奇艺会员免费试用 电信托管 联通网站 1元域名 789 rewritecond 电信主机托管 上海联通 .htaccess apachetomcat ipower 更多