查看:5个内存调试器,用于Linux编码
memwatch.
开发人员:约翰林德
审查的版本:2.71
Linux支持:所有的口味
执照:GNU GPL.
Memwatch是Johan Lindh开发的记忆调试工具。虽然它主要是内存泄漏探测器,但它也能够(根据其网页)检测其他与其他内存相关的问题双自由错误跟踪和错误的释放,缓冲区溢出和下溢,狂野指针写道,更多。
该工具与在C中编写的程序配合使用。虽然您也可以使用C ++程序,但不推荐(根据工具源包附带的Q和文件)。
什么是新的
此版本添加了Ulong_Long_Max.检测程序是否为32位或64位。
有什么好处
像Dmalloc一样,Memwatch附带了良好的文档。如果要了解工具如何运作的情况,可以参考使用文件;它如何执行初始化,清理和I / O操作;和更多。然后有一个常见问题文件,用于帮助用户在使用Memcheck时面临任何常见错误。最后,有一个test.c.包含用于参考工具的工作示例的文件。
memwatch.
与MTrace不同,MemWatch写入输出的日志文件(通常memwatch.log.)是人类可读的形式。而且,Memwatch不是截断,而是在每次运行工具时将内存调试输出附加到文件中,这样您就可以在需要时轻松地引用前面的输出。
还值得一提的是,当您启用MemWatch执行程序时,该工具会产生单行输出stdout.通知您发现了一些错误——然后可以前往日志文件获取详细信息。如果没有产生这样的错误消息,您可以放心,日志文件不会包含任何错误——如果多次运行该工具,这实际上可以节省时间。
我喜欢Memwatch的另一件事是它还提供了一种方法,您可以通过它从代码中捕获工具的输出,并以您的方式处理(参见mwsetoutfunc()函数在Memwatch源代码中有更多关于此问题)。
其他考虑因素
与mtrace和dmalloc一样,memwatch要求您向源文件添加额外的代码 - 您必须包含memwatch.h.代码中的标题文件。此外,在编译程序时,您需要编译memwatch.c与程序的源文件一起编译或包含从文件编译的对象模块,以及定义memwatch.和mw_stdio.命令行上的变量。毋庸置疑,如果希望输出中的确切行号,也需要-g编译器选项。
有一些功能它不包含。例如,该工具无法检测到从分配的内存外部已经释放或读取数据的地址的尝试。此外,它不是线程安全的。最后,正如我在开始时已经指出的那样,如果使用用C ++编写的程序,则无法保证该工具的行为。
底线
MEMCHECK可以检测到许多内存相关的问题,使其成为在C.中写入的项目时成为一个方便的调试工具。鉴于它有一个非常小的源代码,您可以了解工具的工作原理,如果需要,调试它,甚至根据您的要求扩展或更新其功能。
MTRACE.
开发人员:罗兰·麦格拉思和乌尔里希·德雷珀
审查的版本:2.21
Linux支持:所有的口味
执照:GNU LGPL.
MTRACE是包含在内的内存调试工具GNU C库。它适用于Linux上的C和C ++程序,并检测由不平衡呼叫引起的内存泄漏Malloc()和自由()功能。
MTRACE.
该工具以调用的函数的形式实现MTRACE(),它跟踪程序所做的所有Malloc /免费调用,并在用户指定的文件中记录信息。由于该文件包含计算机可读格式的数据,因此Perl脚本 - 也名为MTrace - 用于转换和显示其以人类可读的形式。
什么是新的
MTrace源和perl文件GNU C库(版本2.21)提供的版本,除了更新了版权日期之外,没有给工具添加任何新内容。
有什么好处
关于MTRACE的最佳部分是它的学习曲线并不陡峭;所有你需要理解的是如何以及哪里添加MTRACE()- 和相应的Muntrace()- 在代码中的函数,以及如何使用mtrace perl脚本。后者非常简单 - 你所要做的就是运行mtrace()<程序可执行文件>
我喜欢MTRACE的另一件事是它是可扩展的 - 这意味着您不仅可以使用它来调试完整的程序,但也可以使用它来检测程序中的单个模块中的内存泄漏。只需打电话给MTRACE()和Muntrace()每个模块内的函数。
最后,由于该工具被触发时MTRACE()函数 - 您在程序的源代码中添加了哪些功能,您可以灵活地动态启用工具(在程序执行期间)使用信号。
其他考虑因素
因为呼叫MTRACE()和Mauntrace()函数 - 被宣布为mcheck.h.您需要在程序的源中包含的文件 - 是MTrace的操作的基础(Mauntrace()功能不是总是要求),该工具需要程序员至少一次在代码中进行更改。
请注意,您需要使用-g选项编译程序(由两者提供)GCC.和G ++编译器),它可以启用调试工具在输出中显示确切的行号。此外,一些程序(根据他们的源代码有多大)可能需要很长时间才能编译。最后,使用-g编译增加可执行文件的大小(因为它会产生调试的额外信息),因此您必须记住测试完成后,需要在没有-g的情况下重新编译。
要使用MTRACE,您需要在Linux中具有一些基本的环境变量的知识,鉴于用户指定文件的路径 - 哪个MTRACE()函数用于记录所有信息 - 必须设置为值malloc_trace.执行程序之前的环境变量。
功能明智,MTrace仅限于检测内存泄漏并尝试释放从未分配的内存。它无法检测到其他与内存相关的问题,例如非法内存访问或使用未初始化内存。还,有抱怨这不是线程安全。
底线
如果您正在寻找的所有内容,MTrace是一个很好的选择是Linux中易于使用的内存泄漏探测器。由于它作为GNU C库的一部分,它可能会在您的Linux系统上预安装,因此为什么不使用它?
结论
毋庸置疑,我在这里讨论的每个内存调试器都有自己的品质和局限性。因此,哪一个最适合您,主要取决于您所需要的功能,但易于设置和使用也可能是某些情况下的决定因素。
MTrace最适合您只想捕获软件程序中内存泄漏的情况。它也可以节省一些时间,因为该工具可以预先安装在您的Linux系统上,这也有助于开发机器未连接到互联网的情况,或者您不允许下载第三方任何类型调试的工具。
另一方面,DMAlloc不仅可以检测到MTrace相比的错误类型,还可以提供更多功能,例如运行时可配置性和GDB集成。此外,与此处讨论的任何其他工具不同,Dmalloc是线程安全的。更不用说它附带了详细的文档,使其成为初学者的理想选择。
虽然Memwatch伴随着比Dmalloc更全面的文档,并且可以检测更多的错误类型,但您只能使用用C编程语言编写的软件使用它。其中一个特点是,它允许您从程序的代码中处理其输出,以防您想要自定义输出格式的情况下有用。
如果对您的程序的源代码进行更改不是您想要的,可以使用电围栏。但是,请记住它只能检测到几种错误类型,并且不包括内存泄漏。此外,您还需要知道GDB基础知识,以充分利用此内存调试工具。
Memcheck可能是最全面的。它检测到更多错误类型并提供比此处讨论的任何其他工具更多的特征 - 并且它不需要您在程序的源代码中进行任何更改。但是要注意,而学习曲线对于基本使用率不是很高如果您想使用其高级功能,肯定需要一定程度的专业知识。
这个故事,“审查:Linux编码的5个内存调试器”最初发布Computerworld. 。
版权所有©2015.Raybet2