memcheck

2024-03-23 04:32
文章标签 memcheck

本文主要是介绍memcheck,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

常用选项:

valgrind --tool=memcheck --leak-check=full --xml=yes --xml-file=test.xml yourprog

--leak-check=<no|summary|yes|full>:如果设为yes或full,在被调程序结束后,valgrind会详细叙述每一个内存泄露情况,默认是summary,只报道发生了几次内存泄露。

--show-possibly-lost=<yes|no>:默认是yes。若设为no,则内存泄露检查将不显示那些“possibly lost”块。

--leak-resolution=<low|med|high>:这个选项设定内存检查工具在检测出多个内存泄露时,如何将这些内存泄露归结为同一个泄露(合并那些由相同原因引起的)。设为low时,试图合并前两个泄露情况,设为med,则是前四个,默认是high,试图合并所有的泄露情况。这个选项不影响memcheck找泄露的能力,只是影响它的检测结果显示。

--show-reachable=<yes|no>:默认情况是no,即内存泄露检测工具只显示"definitely lost"和“possibly lost”块,若启动的话(yes),还会显示“reachable”和“indirectly lost”块,也就是说,除了被suppressed的那些,可能泄露的块都会被显示出来,其实这个选项的名字改为--show-all更合适。

--undef-value-errors=<yes|no>:默认是yes,即memcheck会报道引用未定义错误(uses of undefined value errors),这对检测速度有点影响。

--track-origins=<yes|no>:这个选项控制memcheck是否追踪对未初始化值引用错误的根源。默认情况是不追踪,即它会告诉你程序引用了一个未初始化的值,但不知这个未初始化的值来自何处。若设为yes,memcheck将会追踪到未初始化的源。这个源可能出现在如下四种情况:堆上的、栈上的、clent requist、其他的。对于来自堆块上的未初始化值,memcheck会显示这个块是在哪分配的。对于栈上的未初始化值,memcheck会告诉你是哪个函数干的。这个选项的开销是相当大的。该选项不能与--undef-value-errors=no连用。

--partial-loads-ok=<yes|no>:这个选项决定memcheck如何处理word-sized和word-aligned数据(来自addresses)的加载情况,addresses处的一些字节块的地址是可重分配地址的,其余的不可。若设为yes,这种加载不会产生任何错误,当从非法地址处加载字节时会被标记为uninitialised,从合法地址加载的则按正常方式处理。默认是no,即将从部分无效的地址处的加载与从完全无效地址处的加载作同等处理,非法地址错误会被报道出来,相应的字节块被标记为initialised。其实这样的代码是不符ISO C/C++标准的,它应该被视为broken,不管如何,应该修正这样的代码,这个选项应该被作为最后的手段。

--freelist-vol=<number>:当客户程序用free或delete释放一个内存块时,这个内存块不会立即可用于再分配,它只会被放在一个freed blocks的队列中(freelist)并被标记为不可访问,这是为了尽可能延迟被释放的块再次被循环利用的(时间?)点,这样有利于探测到在一段很重要的时间后,客户程序又对被释放的块进行访问的错误。这个选项规定了队列所占的字节块大小,默认是20MB。增大这个选项的会增大memcheck的内存开销,但查错的能力也会提升。

--freelist-big-blocks=<number>:当从freelist队列中取可用内存块用于再分配时,memcheck将会从那些比number大的内存块中按优先级取出一个块出来用。这个选项就防止了freelist中那些小的内存块的频繁调用,这个选项提高了 查到针对小内存块的野指针错误的几率。若这个选项设为0,则所有的块将按先进先出的原则用于再分配。默认是1M。

--workaround-gcc296-bugs=<yes|no>:若开启这个选项,则当对栈顶指针下不远处进行读写时不会报错(gcc2.96的bug),这个不远距离默认是256B,默认是no。尽量不要开启这个选项,因为它真有可能造成错误而又不易被察觉,解决方法是用最新的GCC,它会修正这个错误。在老一点的GCC版本上,可能要用到这个选项。

--ignore-ranges=0xPP-0xQQ[,0xRR-0xSS]:这些区间之间的地址,在memcheck的寻址检查时将被省略,可以有多个地址区间,逗号隔开。(字母要被数字代替)

--malloc-fill=<hexnumber>:对用malloc和new分配出的内存块,用hexnumber对其进行初始化填充,但calloc分配的则不用。这个选项可能对那些不易察觉的memory corruption问题有用(就是你分配了大量的内存,都被hexnumber填充的话,说明你也没用这个内存块)。被分配的内存块仍被标记为undefined,它只影响里面的内容。

--free-fill=<hexnumber>:当用free和new释放一个内存块是,用hexnumber对内存块进行填充。它的好处与--malloc-fill的相同,被填充的内存仍不能被访问,它只影响它里面的内容。

这篇关于memcheck的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/837146

相关文章

DEBUG神器valgrind之memcheck报告分析

memcheck怎么运行 valgrind --log-file=valgrind.log --tool=memcheck --leak-check=full --show-reachable=no --workaround-gcc296-bugs=yes ./mcsample arg1 arg2 –log-file 表示输出报告文件,可以是相对路径或完全路径 –tool=memcheck 做内

Valgrind Memcheck 内存检查

原文 Valgrind Memcheck是一种检测内存泄漏和内存错误的工具。一些最困难的C错误来自内存管理不当:分配错误的大小、使用未初始化的指针、释放内存后访问内存、缓冲区溢出等等。这些类型的错误很棘手,因为它们提供的调试信息很少,将观察到的问题追溯到潜在的根本原因可能是一项挑战。Valgrind是来帮忙的! 内存错误与内存泄漏 Valgrind报告两种类型的问题:内存错误和内存泄漏。当一

cuda-memcheck/compute-sanitizer工具使用

cuda-memcheck是CUDA工具包中的一个功能正确性检查套件。它包含多个可以执行不同类型检查的工具。这些工具可以精确地检测和归因CUDA应用程序中的越界和未对齐的内存访问错误。具体包括 memcheck、 racecheck、initcheck、 synccheck 共 4 个工具。它们可由可执行文件 cuda-memcheck 调用: $ cuda-memcheck -

valgrind---memcheck工具命令选项

转载地址:http://blog.csdn.net/strategycn/article/details/7865525 --leak-check=<no|summary|yes|full>:如果设为yes或full,在被调程序结束后,valgrind会详细叙述每一个内存泄露情况,默认是summary,只报道发生了几次内存泄露。 --show-possibly-l

【PE】如何使用Valgrind memcheck工具进行C/C++的内存泄漏检测

系统编程中一个重要的方面就是有效地处理与内存相关的问题。你的工作越接近系统,你就需要面对越多的内存问题。有时这些问题非常琐碎,而更多时候它会演变成一个调试内存问题的恶梦。所以,在实践中会用到很多工具来调试内存问题。 在本文中,我们将讨论最流行的开源内存管理框架 VALGRIND。 摘自 Valgrind.org: Valgrind是用于构建动态分析工具的探测框架。它包括一个工具集,每个工具