查看:5个内存调试器,用于Linux编码

作为程序员,我知道我倾向于犯错误 - 为什么不呢?甚至程序员也是人。在代码编译期间检测到一些错误,而其他错误则在软件测试期间陷入困境。然而,存在一类错误,这些错误通常不会在这些阶段中检测到,这可能导致软件意外地行事 - 或更差,过早终止。

如果您还没有猜到它,我正在谈论内存相关的错误。手动调试这些错误不仅可以耗时,而且很难找到和正确。此外,值得一提的是,这些错误令人惊讶的是常见的,特别是在以C和C ++等编程语言编写的软件中,这是设计用于的手动内存管理

幸运的是,有一些编程工具可以帮助您找到软件程序中的内存错误。在这篇综述中,我评估了五种流行的、免费的、开源的Linux内存调试器:Dmalloc、Electric Fence、Memcheck、Memwatch和Mtrace。我在日常编程中使用了这五种方法,所以这些评估是基于实际经验的。

dmalloc.

开发人员:灰色沃森
审查的版本:5.5.2
Linux支持:所有的口味
许可:Creative Commons归因 - 共享3.0许可证

DMAlloc是由灰色Watson开发的内存调试工具。它实现为一个库,它提供围绕标准内存管理功能的包装器malloc ()Calloc()自由()更多,使程序员能够检测到有问题的代码。

CW DMALLOC输出

dmalloc.

如在工具的网页上列出,它提供的调试功能包括内存泄漏跟踪,双自由跟踪错误和栅栏写检测.其他功能包括文件/行号报告和统计信息的常规记录。

什么是新的

版本5.5.2主要是一个错误修复释放包含几个构建和安装问题的校正。

有什么好处

Dmalloc最好的部分是它是非常可配置的。例如,您可以将其配置为包括对c++程序和线程应用程序的支持。它提供的一个有用的功能是运行时可配置性,这意味着您可以在执行工具时轻松启用/禁用工具提供的特性。

您也可以使用dmalloc与GNU项目调试器——只要添加内容dmalloc.gdb.文件(位于Dmalloc源包中的contrib子目录中)的.gdbinit.文件存放在主目录中。

我非常喜欢Dmalloc的另一件事是它丰富的文档。只需前往文档部分在它的官方网站上,您将获得从如何下载、安装、运行和使用库到它提供的特性的详细描述和它生成的输出文件的解释的一切信息。还有一个章节包含了一些常见问题的解决方案。

其他考虑因素

像MTRACE一样,DMAlloc需要程序员对其程序的源代码进行更改。在这种情况下,您可能是至少想要添加的dmalloc.h.标题,因为它允许该工具报告生成问题的文件/行号,因为它在调试时节省时间非常有用。

此外,在编译包后生成的DMAlloc库,需要在编译程序时与您的程序链接。

但是,复杂的事情有点是您还需要设置一个环境变量,称为环境变量dmalloc_option.,调试工具用于配置内存调试功能 - 以及运行时在输出文件的位置。虽然您可以手动为环境变量分配值,但初学者可能会发现该过程有点艰难,鉴于要启用的DMalloc功能被列为该值的一部分,实际上表示为其各自的十六进制值的总和- 您可以阅读更多关于它的信息在这里

设置环境变量的更简单方法是使用DMALLOC实用程序,这是为此目的而设计的。

底线

Dmalloc的实力在于它提供的可配置性选项。它也是高度便携的,已成功移植到许多遗传信息,包括AIX,BSD / OS,DG / UX,免费/ NET / OpenBSD,GNU / HURD,HPUX,IRIX,Linux,MS-Dog,Next,OSF,SCO,Solaris,Sunos,Ultix,Unixware甚至UnicoS(在Cray T3e上)。虽然该工具有一点与之相关的学习曲线,但它提供的功能是值得的。

电围栏

开发人员:布鲁斯把
审查的版本:2.2.3
Linux支持:所有的口味
许可:GNU GPL(版本2)

电围栏是Bruce Perens开发的内存调试工具。它以库的形式实现了您的程序需要链接到的,并且能够检测分配在A上的内存的超常)以及已经释放的内存访问。

CW电围栏输出

电围栏

顾名思义,电围栏以任何非法内存访问结果的方式在每个分配的缓冲区周围创建虚拟栅栏段错误.该工具支持C和C ++程序。

什么是新的

版本2.2.3包含了工具构建系统的修复,允许它实际通过-fno-builtin-malloc选择GNU编译器集合(GCC)

有什么好处

我对电围栏的第一件事是 - 与Memwatch,Dmalloc和MTrace不同 - 它不要求您在程序的源代码中进行任何更改。您只需要在编译期间将您的程序与工具库链接。

其次,实施调试工具的方式确保在导致界限的第一指令上生成分段错误,这总是比在稍后阶段检测到的问题。

电气栅栏始终在输出中产生版权消息,而不管是否检测到错误。此行为非常有用,因为它还充当确认您实际上运行了启用电动栅栏的程序版本。

其他考虑因素

另一方面,我真正想念电围栏是能够检测到内存泄漏的能力,因为它是在C / C ++中写的软件的最常见和最潜在的严重问题之一。此外,该工具无法检测到堆栈上分配的内存的超级,并且不是线程安全的。

鉴于该工具在用户分配的内存缓冲区之前和之后分配了一个无法访问的虚拟内存页面,如果您的程序制作过多的动态内存分配,它最终会消耗很多额外的内存。

该工具的另一个局限性是,它不能明确地告诉您的程序代码中的问题所在——它所做的只是在检测到与内存相关的错误时产生一个分段错误。要找出确切的行号,您必须使用类似于GNU项目调试器(GDB),这又取决于-g编译器选项以在输出中产生行号。

最后,虽然电围栏能够检测到大多数缓冲区溢出,但例外是所分配的缓冲区大小不是系统字大小的倍数的场景 - 在这种情况下,overrun(即使它只是几个字节)不会被检测到。

底线

尽管存在所有限制,但电围栏分数是易用性 - 只需将程序与工具联系一次,每次检测到它都能检测到的内存问题就会提醒您。但是,如上所述,该工具要求您使用像GDB这样的源代码调试器。

忆克

开发人员:Valgrind开发人员
审查的版本:3.10.1
Linux支持:所有的口味
许可:GPL.

Valgrind是一套套件,为调试和分析Linux程序提供了多种工具。虽然它适用于以许多不同语言编写的程序 - 例如Java,Perl,Python,汇编代码,Fortran,ADA等 - 但它提供的工具主要针对在C和C ++中编写的程序。

最受欢迎的Valgrind工具是Memcheck,一个内存错误检测器,可以检测内存泄漏,无效的内存访问,未定义值的使用以及与分配和删除堆内存相关的问题的问题。

什么是新的

发布套件(3.10.1)是一个主要包含在3.10.0版本中报告的错误的修复程序。此外,它还“对所有报告的ARCH64 ARMV8指令和SYSCALLS的反口回求修复。”

有什么好处

MEMCHECK,如所有其他Valgrind工具,基本上是一个命令行实用程序。它非常易于使用:如果您通常以诸如的表格中的命令行运行程序PROG ARG1 ARG2.,你只需要添加一些值,像这样:Valgrind - 左侧展示arg1 arg2

连续波memcheck输出

忆克

(注意:您不需要在命令行中的任何地方提到Memcheck,因为它是默认的Valgrind工具。但是,您确实需要首先使用-g选项来编译您的程序——它添加了调试信息——以便Memcheck的错误消息包含准确的行号。)

我真正喜欢memcheck是它提供了很多命令行选项(例如- 左派检查上面提到的选项),允许您不仅可以控制工具如何工作方式,而且还要如何如何产生输出。

例如,您可以启用——track-origins选项查看程序中未初始化数据的来源信息。使——show-mismatched-frees选项将让MEMCHECK匹配内存分配和拒绝技术。对于用C语言编写的代码,Memcheck将确保只有自由()函数用于拒绝分配的内存malloc (),而在C ++中编写的代码,该工具将检查是否删除删除[]运营商用于拒绝分配的内存新的[], 分别。如果检测到不匹配,则报告错误。

但最好的部分(尤其是对初学者来说)是,该工具甚至会提供建议,告诉用户应该使用哪个命令行选项来使输出更有意义。例如,如果你不使用基本- 左派检查选项时,它将产生一个输出,建议:“使用——leak-check=full重新运行,查看泄漏内存的详细信息。”如果程序中有未初始化的变量,该工具将生成一条消息,说:“使用——track-origins=yes查看未初始化的值来自哪里。”

Memcheck的另一个有用特性是它允许您创建抑制文件,允许您抑制您目前无法修复的某些错误 - 以这种方式,每次运行工具时都不会提醒它们。值得一提的是,已经存在一个默认抑制文件,默认抑制文件读取以抑制与操作系统预先安装的系统库中的错误错误的错误。您可以为您的使用创建新的抑制文件,或编辑现有的文件(通常是/usr/lib/valgrind/default.supp.).

对于那些寻求高级功能的人来说,值得知道麦克解也可以检测内存错误在使用的程序中自定义内存分配器.此外,它还提供监控命令可以在使用Valgrind的内置gdbserver时使用客户端请求的机制这允许您不仅要讲述程序的行为,而且允许您的程序行为,但也可以提出查询。

其他考虑因素

虽然难以拒绝麦克解可以节省大量的调试时间和挫败感,但该工具使用很多内存,因此可以使您的程序执行显着慢(约20到30次,根据文件).

除此之外,还有一些其他局限性。根据一些用户评论,Memcheck显然不是线程安全;它没有检测到静态缓冲溢出).还有一些Linux程序,比如GNU Emacs.这一功能目前无法在Memcheck中使用。

如果您对看起来有兴趣,可以找到彻底的Valgrind限制列表在这里

底线

Memcheck是一个方便的内存调试工具,既适合初学者,也适合那些寻求高级特性的人。如果您只需要基本的调试和错误检查,那么它非常容易使用,但如果您想使用抑制文件或监视命令等特性,则需要一点学习曲线。

虽然它在其网站上有很长的限制列表,Valgrind(以及因此MEMCHECK)所用的索赔成千上万的程序员在世界各地——该工具背后的团队表示,他们收到了来自30多个国家用户的反馈,其中一些人的项目代码多达2500万行。

有关的:
12 4.
第1页,共2页
IT薪水调查:结果是