内存泄露检查工具valgrind--通用命令选项

来源:互联网 发布:智能康复知多少 编辑:程序博客网 时间:2024/06/05 10:12

valgrind [valgrind-options] [your-program] [your-program-options]

valgrind的底层模拟了一个核心,即一个软件模拟的CPU,被调试的程序就是运行在这个假核心上,此外还包含一系列调试工具。它的工具运行依赖于底层的核心,由于是模块化架构,工具可单独开发,只要与核心的版本匹配即可。它的默认工具是memcheck,通过--tool=<toolname>来指定运行的工具。

每个工具可能有自己的命令选项,下面列举所有工具都可用的选项:

-h --help:显示核心和所选工具的所有选项(-h或是--help),若是-h --help,则等效为--help-debug,即同时显示调试选项(一般为Valgrind的开发者所用)。

--version:先是核心版本。

-q, --quiet:安静的运行,只打印错误信息(被调试的程序错误信息)。

-v, --verbose:给的信息就多了,与-q相反。给出被调试程序的全面信息,如加载了哪些共享库,用了哪些suppressions?执行进度,警告信息等。

--trace-children=<yes|no>:如果是yes,被调程序若用exec开启了一个子进程,那valgrind将会追踪此子进程的执行情况。默认是no,但无论如何,valgrind都还是追踪fork产生的子进程。

--trace-children-skip=patt1,patt2…:在上面选项设为yes后,这个选项则标识了哪些子进程是不要被追踪的,这些子进程(名字)patt1,patt2…来决定,pattn可包含”?””*”等通配符。注意,valgrind将停止追踪pattn所指进程下可能产生的所有子进程。

--trace-children-skip-by-arg=patt1,patt2,…:与--trace-childrn-skip选项的不同之处是,跳过的子进程是由给子进程的参数patt1,patt2…来决定,而非程序名字。

--child-silent-after-fork=<yes|no>:若是yes,则不显示由fork调用产生的子进程产生的任何调试或log信息。当调试信息以XML格式输出时(--xml=yes),强烈建议开启此选项。默认是no

--vgdb=<no|yes|full>:若为yesfullvalgrind允许在其上运行的程序,用GDB去调试它(开启gdbsever)。默认是yes

--vgdb-error=<number>:在开启了gdbsever后,有用。报错工具在等待有number个错误报出后,会冻结程序并等你将它连上GDB。因此,当number=0时,在你的程序运行前,gdbserver就开始运行了。典型应用场景是,在运行前插入GDB断点,还有使用那些不报错的工具的情况,如Massif。默认是999999999

--trace-fds=<yes|no>:若是yes,在程序退出时,将打印一系列的程序打开的文件描述符的信息。包括文件是在哪打开的,文件名字或socket细节等。默认是no

--time-stamp=<yes|no>:若 yes,每条信息前将挂个时间信息,指示自程序开始,过去的时间量。

--log-fd=<number>:将vaolgrind的输出信息输向由number这个文件描述符指定的文件,默认是2,即stderr。注意,这可能与用户自己向stderr输出的东西相互交织。

--log-file=<filename>:将信息输向右filename指定的文件。若filename是空,则会引发终止。filename中可有三种格式信息;1%p将被替换为当前进程的ID。当—trace-children=yes,而没用%p时,所有进程的信息都输向同一个文件,会比较混乱,信息也可能不全,最好文件名中包含%p2%q{FOO}被环境变量FOO的值代替,若FOO的内容奇怪的话也可能引发异常。一般不用这种格式,除了极少情况,如基于MPI(一种并行程序开发库)的程序。若用了此种格式,FOO不能为空,否则也引发异常。一些shell里面,”{””}”可能需要反斜杠转义。3%%被代替为%%不能后接任何其他字符,否则会引发异常。

--log-socket=<ip-address:port-number>:将信息输向指定的IP地址。若省了port-number,则默认用1500端口号。若这个IP地址无法接受信息,信息将被写会到stderr

下面是与报错相关的选项。这些选项适用于所有能报错的工具,如memcheck,而cachegrind就用不了。

--xml=<yes|no>:若为yes,错误信息将以XML格式形式输出,而非平面文档。不重要的信息(非错误信息)被打印在平面文档中。XML输出目标由--xml-fd--xml-file—xml-socket指定,而平面文档信息输出目标则由前面的—log-fd—log-file—log-socket指定。输出格式由docs/internals/xml-output-protocol4.txt设定。

--xml-fd=<number>:将XML信息输出到由文件描述符number指定的文件中,必须要--xml=yes

--xml-file=<filename>:与—log-file类似。也必须要—xml=yes

--xml-socket=<ip-address:port-number>:与—log-socket类似,也必须要—xml=yes

--xml-user-comment-<string>:在输出的XML文件开头,加的注释信息,没有—xml=yes的话,将被忽略。

--demangle=<yes|no>:这个选项开启的话,会试图还原目标代码中的C++符号名,使其与源码中的相关符号名字尽量一致。默认是yes

--num-callers=<number>:定义了在堆栈追踪过程中显示的最大嵌套调用数。注意,valgrind只显示四层嵌套调用的错误信息,故这个选项不影响最终报道的错误信息量。Number最大值是50,默认值是12

--error-limit=<yes|no>:若为yes,则当报道出的错误总数超过10000000或有1000个不同类型的,则停止报错。这么多错误的程序也就没必要再调试了,默认是yes

--error-exitcode=<number>:设置在发现任何错误信息时的valgrind的返回码。默认是0,这样返回码就是被调程序的返回码。若设为非0值,则此值将代替默认的返回码。

--show-below-main=<yes|no>:默认是no,追踪堆栈错误时,不显示在那些在main函数下一层那些函数调用的错误信息。

 --fullpath-after=<string>:string的默认 值是“don't show source paths”,即在堆栈追踪过程中只显示文件名,而不显示源文件的完全路径。对于大的项目,众多源文件分布在不同路径下,这个默认行为就不方便了。设置了string后,将会显示每个源文件的路径,但若路径中含有string的内容,则路径中与string的重合部分直至路径开头(根目录)将被省略。如一个源文件的全路径为/home/janedoe/ blah/src/foo/bar/xyzzy.c,选项设置为--fullpath-after=/home/janedoe/blash/src/,则显示的文件名将是foo/bar/xyzzy.c。由于string不需要加路径前缀,故--fullpath-after=/blash/src/,效果是一样的。若要显示全路径的话,不要为string赋值即可,即--fullpath-after=。这个选项还可以多次使用,以它们在命令行出现的次序为先后顺序,依次按照上面的规则对路径进行截断。

--gen-suppressions=<yes|no|all>:若选择yes,则每显示一条error,valgrind就暂停,并打印一行:----Print suppression ?---[Return/N/n?Y/y/C/c]---(y=yes,n=no,c=cancle)这条提示信息与下面的--db-attach选项相同,选y,则打印针对这个error的suppressions。若该选项为all,则打印每个error的suppression,不在询问了。Also, the suppression name is given as <insert a suppression name here>; the name doesn't really matter, it's only used with the -v option which prints out all used suppression records.

--db-attach=<yes|no>:若选yes,则每显示一条error,valgrind就暂停,并打印一行:----Attach to debugger ?---[RegurnN/n/Y/y/C/c]---。若选y,则在此处启动调试器,调试完了要退出调试器,valgrind才可继续。若你用的是GDB,则选项--vgdb=yes或ful会使得调试器功能更强(它启动了valgrind内部的gdbsever,几乎模拟了 GDB的全部功能)。

--db-command=<command>:开启--db-attach选项时,实际用的命令,默认是"gdb -nw %f %p",其中%f是被调试的程序名,%p是被调进程的ID,默认的调试器是valgrind安装时它发现的,一般是/usr/bin/gdb。command应该放在双引号内。

--input-fd=<number>:当--db-attach=yes或--gen-suppressions=yes时,valgrind在发现错误时会等待键盘输入即便进行下一步操作,即number默认是0(stdin),通过修改number,可以使得valgrind读取指定文件来执行下一步操作,在关闭了stdin时,这个选项有用。

--dsymutil=no|yes:这个选项只在MacOS上跑valgrind才有用。

--max-stackframe=<number>:该选项规定了被调程序能使用的最大栈帧空间。默认是2000000。这个选项一般在valgrind的调试输出建议你用时,再用。其实若被valgrind建议了,说明你的程序有问题,最好别在栈上分配太大的数据结构,大的数据最好在堆上分配。

--main-stacksize=<number>:规定了主线程的栈大小。默认情况用ulimit值,一般是16MB或低一点。一般用8~16M能满足绝大部分应用程序的需求。Linux上可最大申请2GB。若valgrid无法分配这么多空间,便会终止。这个选项只影响initial thread,对其他线程栈无影响。 You will have to work out the --main-stacksize value for yourself (usually, if your applications segfaults). But Valgrind will tell you the needed --max-stackframe size, if necessary.

与malloc()函数有关的选项:

--alignment=<number>:默认是8或16,取决于系统平台。这个选项对那些有自己版本的malloc的工具有用,如Memcheck和Massif,它设定了对分配地址的对齐性要求。number必须大于等于默认值,小于4096,必须是2的几次方。

原创粉丝点击