linux内存检测工具 linux查看内存大小命令
分享几款Linux 下C/C++程序内存泄漏检查工具
Valgrind包括以下一些工具:
1. Memcheck:这是Valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数的内存错误,如未初始化使用。
2. callgrind:用于检查程序中函数调用过程中的问题。
3. cachegrind:用于检查程序中缓存使用的问题。
4. Helgrind:用于检查多线程中出现的竞争问题。
5. Massif:用于检查程序中堆栈使用的问题。
6. Extension:可以使用core提供的功能,自定义编写特定的内存调试工具。
Memcheck检测内存问题的原理图包括:
1. Valid-value表:对于进程的整个地址空间中的每一字节,都有与之对应的8个bits,这些bits负责记录该字节是否具有有效、已初始化的值。
2. Valid-Address表:对于进程整个地址空间中的每一个字节,还有与之对应的1bit,负责记录该地址是否能够被读写。
检测原理:当要读写内存中的某个字节时,首先检查这个字节对应的A bit。如果该A bit显示该位置是无效位置,memcheck则报告读写错误。内核(core)类似于一个虚拟的CPU的环境,当内存中的某个字节被加载到真实的CPU中时,该字节对应的V bit也被加载到虚拟的CPU环境中,一旦寄存器中的值被用来产生内存地址,或者该值能够影响程序的输出,则memcheck会检查对应的vbits,如果该值尚未初始化,则会报告使用未初始化内存错误。
Valgrind的安装步骤包括:
1.解压安装包:tar-jxvf valgrind-3.11.0.tar.bz2-C/usr/local/src
2.进入目录安装:cd/usr/local/src/valgrind-3.11.0
3.运行./autogen.sh设置环境:./autogen.sh
4.配置Valgrind,生成MakeFile文件:./configure--prefix=/usr/local
5.编译和安装Valgrind:make&& make install
Valgrind的使用步骤包括:
第一步:准备好程序:为了Valgrind发现的错误更精确,如能够定位到源代码的行,建议在编译时加上-g参数,编译优化选项选择O0(不要优化)。
第二步:在Valgrind下,运行可执行程序:利用Valgrind调试内存问题,不需要重新编译源程序,它的输入就是二进制的可执行程序。调用Valgrind的通用格式是:valgrind [valgrind-options] your-prog [your-prog-options]。Valgrind的参数分为两类,一类是core的参数,它对所有的工具都适用;另一类就是具体某个工具如memcheck的参数。Valgrind默认的工具就是memcheck,也可以通过“–tool=tool name”指定其他的工具。Valgrind提供了大量的参数满足特定的调试需求,具体可参考其用户手册。
Memcheck发现常见的内存问题总结:Memcheck将内存泄露分为两种,一种是可能的内存泄露(Possibly lost),另一种是确定的内存泄露(Definitely lost)。Possibly lost是指仍然存在某个指针能够访问某块内存,但该指针指向的已经不是该内存首地址。Definitely lost是指已经不能够访问这块内存。而Definitely lost又分为直接的(direct)和间接的(indirect)。直接和间接的区别就是,直接是没有任何指针指向该内存,间接是指指向该内存的指针都位于内存泄露处。在上述的例子中,根节点是directly lost,而其他节点是indirectly lost。
Linux平台下的内存泄漏自动化检测工具
valgrind工具概述
valgrind是 Linux平台上一款主流且功能强大的内存泄漏检测工具,其中内存检查(memcheck)是其众多功能之一。
valgrind工具使用限制
valgrind工具不支持对正在运行的程序进行调试,因为待分析的程序必须在特定环境中运行,才能进行内存分析。
Valgrind体系结构
Valgrind由内核(core)和其他基于内核的调试工具组成。
内核类似于一个框架,它模拟了CPU环境,并为其他工具提供服务。
其他工具则类似于插件,利用内核提供的服务完成各种特定的内存调试任务。
Valgrind工具集
Memcheck:这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,例如:使用未初始化的内存,使用已经释放了的内存,内存访问越界等。
Callgrind:检测程序代码的运行时间和调用过程,以及分析程序性能。
Cachegrind:分析CPU的cache命中率、丢失率,用于进行代码优化。
Helgrind:用来检查多线程程序中出现的竞争问题。
Massif:堆栈分析器,指示程序中使用了多少堆内存等信息。
Extension:可以利用core提供的功能,自己编写特定的内存调试工具。
Memcheck工具主要检查程序错误
使用未初始化的内存
使用已经释放了的内存
使用超过malloc分配的内存空间
对堆栈的非法访问
申请的空间是否有释放
malloc/free/new/delete申请和释放内存的匹配
src和dst的重叠
如何使用valgrind
valgrind官方用户手册目录:valgrind.org/docs/manua...
执行#valgrind的命令如下:
valgrind [valgrind_optons] myprog [myprog_arg1...]
例如:
valgrind--leak-check=full ls-al
参数说明
valgrind有非常多的参数,可以自行通过valgrind--help查看大致说明,也可以翻阅下面常用的文档链接:
valgrind核心命令行参数:valgrind.org/docs/manua...
valgrind memcheck工具命令行参数:valgrind.org/docs/manua...
--tool=[default:memcheck]#
valgrind支持不少检查工具,都有各种功能。但用的更多的是它的内存检查(memcheck)。--tool=用于选择你需要执行的工具,如果不指明则默认为memcheck。
--log-file=And--log-fd=[default:2,stderr]#
valgrind打印日志转存到指定文件或者文件描述符。如果没有这个参数,valgrind的日志会连同用户程序的日志一起输出,对于大多数使用者来说,会显得非常乱。valgrind还支持把错误日志重定向到socket中。
--show-leak-kinds=[default:definite,possible]#
valgrind有4种泄漏类型,这个参数决定显示哪些类型泄漏。definite indirect possible reachable这4种可以设置多个,以逗号相隔,也可以用all表示全部类型,none表示啥都不显示。
--leak-check=[default:summary]#
这个参数决定了输出泄漏结果时,输出的是结果内容。no没有输出,summary只输出统计的结果,yes和full输出详细内容。
常见的使用是:--leak-check=full
--track-fds=[default:no]#
是否跟踪文件打开和关闭?很多时候,文件打开后没关闭也是一个明显的泄漏。
其他使用经验
存在的局限
memcheck无法检测全局变量和静态数组变量的内存溢出,这是由memcheck的工作原理决定的。
Valgrid新增了SGcheck插件,目前SGcheck只是一个实验工具,用来检测堆和全局数组的溢出。它的功能和Memcheck互补:SGcheck找到Memcheck无法找到的问题。
根据Valgrind的官方文档,它会导致可执行文件的速度减慢20至30倍。所以一般来讲,Valgrind是无法应用到压力测试的场景之中的。
内存占用高,因为要维护两张表格,而这两张表的维度正比于程序的内存。
演示案例1:内存越界
演示案例2:重复释放
演示案例3:内存泄漏
结语
Valgrind仅检测实际由测试触发的bug,所以在结合高质量的测试代码,Valgrind才会更有效。
Valgrind不是万能的,Valgrind也有无法找到问题的时候,有些问题只能通过不断的review代码找到了症结。发现问题,解决问题,不是最好的。最好的方法,就是不引入内存问题。
linux内存分析工具linux内存工具
linux如何看内存颗粒信息?
查看内存信息(显示插槽个数和每个插槽里内存条的大小)
dmidecode-tmemory|grepSize查看内存条厂家dmidecode-tmemory|grepManufacturerfree查看当前内存使用情况
linux下有什么检测内存溢出的工具?
内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
可以使用相应的软件测试工具对软件进行检测。
1.ccmalloc-Linux和Solaris下对C和C++程序的简单的使用内存泄漏和malloc调试库。
2.Dmalloc-DebugMallocLibrary.
3.Electric
Fence-Linux分发版中由BrucePerens编写的malloc()调试库。
4.Leaky-Linux下检测内存泄漏的程序。
5.LeakTracer-Linux、Solaris和HP-UX下跟踪和分析C++程序中的内存泄漏。
6.MEMWATCH-由Johan
Lindh编写,是一个开放源代码C语言内存错误检测工具,主要是通过gcc的precessor来进行。
7.Valgrind-DebuggingandprofilingLinuxprograms,aimingat
programswritteninCandC++.
8.KCachegrind-Avisualizationtoolfortheprofilingdata
generatedbyCachegrindandCalltree.
9.Leak
Monitor-一个Firefox扩展,能找出跟Firefox相关的泄漏类型。
10.IELeakDetector
(Drip/IESieve)-Drip和IESieveleak
detectors帮助网页开发员提升动态网页性能通过报告可避免的因为IE局限的内存泄漏。
11.WindowsLeaks
Detector-探测任何Win32应用程序中的任何资源泄漏(内存,句柄等),基于WinAPI调用钩子。
12.SAPMemory
Analyzer-是一款开源的JAVA内存分析软件,可用于辅助查找JAVA程序的内存泄漏,能容易找到大块内存并验证谁在一直占用它,它是基于Eclipse
RCP(RichClientPlatform),可以下载RCP的独立版本或者Eclipse的插件。
13.DTrace-即动态跟踪Dynamic
Tracing,是一款开源软件,能在Unix类似平台运行,用户能够动态检测操作系统内核和用户进程,以更精确地掌握系统的资源使用状况,提高系统性能,减少支持成本,并进行有效的调节。
14.IBMRationalPurifyPlus-帮助开发人员查明C/C++、托管.NET、Java和VB6代码中的性能和可靠性错误。PurifyPlus
将内存错误和泄漏检测、应用程序性能描述、代码覆盖分析等功能组合在一个单一、完整的工具包中。
15.ParasoftInsure++-针对C/C++应用的运行时错误自动检测工具,它能够自动监测C/C++程序,发现其中存在着的内存破坏、内存泄漏、指针错误和I/O等错误。并通过使用一系列独特的技术(SCI技术和变异测试等),彻底的检查和测试我们的代码,精确定位错误的准确位置并给出详细的诊断信息。能作为Microsoft
VisualC++的一个插件运行。
16.CompuwareDevPartnerforVisualC++BoundsChecker
Suite-为C++开发者设计的运行错误检测和调试工具软件。作为MicrosoftVisualStudio和C++6.0的一个插件运行。
17.ElectricSoftwareGlowCode-包括内存泄漏检查,code
profiler,函数调用跟踪等功能。给C++和.Net开发者提供完整的错误诊断,和运行时性能分析工具包。
18.CompuwareDevPartnerJava
Edition-包含Java内存检测,代码覆盖率测试,代码性能测试,线程死锁,分布式应用等几大功能模块。
19.QuestJProbe-分析Java的内存泄漏。
20.ej-technologiesJProfiler-一个全功能的Java剖析工具,专用于分析J2SE和J2EE应用程序。它把CPU、执行绪和内存的剖析组合在一个强大的应用中。JProfiler可提供许多IDE整合和应用服务器整合用途。JProfiler直觉式的GUI让你可以找到效能瓶颈、抓出内存泄漏、并解决执行绪的问题。4.3.2注册码:A-G666#76114F-1olm9mv1i5uuly#0126
21.BEAJRockit-用来诊断Java内存泄漏并指出根本原因,专门针对Intel平台并得到优化,能在Intel硬件上获得最高的性能。
22.SciTechSoftwareAB.NETMemory
Profiler-找到内存泄漏并优化内存使用针对C#,VB.Net,或其它.Net程序。
23.YourKit.NETJavaProfiler-业界领先的Java和.NET程序性能分析工具。
24.AutomatedQAAQTime-AutomatedQA的获奖产品performanceprofiling和memory
debugging工具集的下一代替换产品,支持Microsoft,Borland,Intel,Compaq和
GNU编译器。可以为.NET和Windows程序生成全面细致的报告,从而帮助您轻松隔离并排除代码中含有的性能问题和内存/资源泄露问题。支持.Net
1.0,1.1,2.0,3.0和Windows32/64位应用程序。
25.JavaScriptMemoryLeakDetector-微软全球产品开发欧洲团队(GlobalProduct
Development-Europeteam,GPDE)
发布的一款调试工具,用来探测JavaScript代码中的内存泄漏,运行为IE系列的一个插件。
如何限制linux所有进程可使用的总内存?
下面的shell脚本可以实时的监控系统中各个进程的CPU和内存的占用情况,用于限制进程CPU占用率更加合理。
#!/bin/shPIDS=`top-bn1|grep^*|awk’{if($9>50||$10>25id-u$2>500)print$1}’`forPIDin$PIDSdorenice+10$PIDechorenice+10$PIDdone能够将这个脚本放到cron中运行,比如每分钟检查一次,只需以root身份添加crontab项:
#crontab-e*****limit.sh以后每个一分钟就会检查一次,调整占用50%以上CPU或25%内存的进程的nice值,从而使这样的进程优先级变低,被调度的机会减少,同时会向root发邮件提示该进程被调整过。
但是,限制内存使用最好还是用PAM,RedHat能够在/etc/security/limits.conf中配置。
如何让linux生成内存dump?
在Linux上只要打开coredump文件开关,当程序crash时系统生成相应的core文件。下面是简单的一些步骤:
1.查看当前是否已经打开了此开关通过命令:ulimit-c如果输出为0,则代表没有打开。如果为unlimited则已经打开了,就没必要在做打开。
2.通过命令打开ulimit-cunlimited.然后通过步骤1,可以监测是否打开成功。
3.如果你要取消,很简单:ulimit-c0就可以了通过上面的命令修改后,一般都只是对当前会话起作用,当你下次重新登录后,还是要重新输入上面的命令,所以很麻烦。我们可以把通过修改/etc/profile文件来使系统每次自动打开。步骤如下:1.首先打开/etc/profile文件一般都可以在文件中找到这句语句:ulimit-S-c0>/dev/null2>1.ok,根据上面的例子,我们只要把那个0改为unlimited就ok了。然后保存退出。2.通过source/etc/profile使当期设置生效。3.通过ulimit-c查看下是否已经打开。其实不光这个命令可以加入到/etc/profile文件中,一些其他我们需要每次登录都生效的都可以加入到此文件中,因为登录时linux都会加载此文件。比如一些环境变量的设置。还有一种方法可以通过修改/etc/security/limits.conf文件来设置,这个方法没有试过,也是网上看到。不过上面两种就可以了!最后说一下生成coredump文件的位置,默认位置与可执行程序在同一目录下,文件名是core.***,其中***是一个数字。coredump文件名的模式保存在/proc/sys/kernel/core_pattern中,缺省值是core。通过以下命令可以更改coredump文件的位置(如希望生成到/tmp/cores目录下)echo“/tmp/cores/core”>/proc/sys/kernel/core_pattern设置完以后我们可以做个测试,写个程序,产生一个异常。然后看到当前目录会有个core*的文件。
Linux释放内存页由什么程序实现?
释放内存页由命令free来实现。