【linux】Valgrind工具集详解(五):命令行详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010168781/article/details/83744778

一、使用方法

usage: valgrind [options] prog-and-args
使用方法:valgrind [参数选项] 程序和参数

二、选择工具

tool-selection option, with default in [ ]:
工具选择选项,默认值在[]中:
–tool= use the Valgrind tool named [memcheck]
name取值如下:
1、memcheck:检查程序中的内存问题,如泄漏、越界、非法指针等。
2、callgrind:检测程序代码覆盖,以及分析程序性能。
3、cachegrind:分析CPU的cache命中率、丢失率,用于进行代码优化。
4、helgrind:用于检查多线程程序的竞态条件。
5、massif:堆栈分析器,指示程序中使用了多少堆内存等信息。
6、lackey:Lackey是小型工具,很少用到
7、nulgrind:Nulgrind只是为开发者展示如何创建一个工具

三、工具集基本选项

basic user options for all Valgrind tools, with defaults in [ ]:
针对Valgrind工具集的基本选项,默认值在[]中:
-h --help show this message
–help-debug show this message, plus debugging options
–version show version
-q --quiet run silently; only print error msgs //安静的运行,只打印错误
-v --verbose be more verbose – show misc extra info//更加冗长。提供有关程序各个方面的额外信息,例如:加载的共享对象,使用的抑制,检测和执行引擎的进度以及有关异常行为的警告。重复该选项会增加详细程度。
–trace-children=no|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=no|yes omit child output between fork & exec? [no] //若是yes,则不显示由fork调用产生的子进程产生的任何调试或log信息。当调试信息以XML格式输出时(–xml=yes),强烈建议开启此选项。默认是no。
–vgdb=no|yes|full 激活gdb调试? [yes]//若为yes或full,valgrind允许在其上运行的程序,用GDB去调试它(开启gdbsever)。默认是yes。full比较慢,但是提供了精确的观察点/步骤
–vgdb-error= invoke gdbserver after errors [999999999]
to get started quickly, use --vgdb-error=0
and follow the on-screen directions
//在开启了gdbsever后,有用。报错工具在等待有number个错误报出后,会冻结程序并等你将它连上GDB。因此,当number=0时,在你的程序运行前,gdbserver就开始运行了。典型应用场景是,在运行前插入GDB断点,还有使用那些不报错的工具的情况,如Massif。默认是999999999。
–vgdb-stop-at=event1,event2,… invoke gdbserver for given events [none]
where event is one of:
startup exit valgrindabexit all none
–track-fds=no|yes track open file descriptors? [no] //若是yes,在程序退出时,将打印一系列的程序打开的文件描述符的信息。包括文件是在哪打开的,文件名字或socket细节等。默认是no。
–time-stamp=no|yes add timestamps to log messages? [no] //若 yes,每条信息前将挂个时间信息,指示自程序开始,过去的时间量。
–log-fd= log messages to file descriptor [2=stderr] //将vaolgrind的输出信息输向由number这个文件描述符指定的文件,默认是2,即stderr。注意,这可能与用户自己向stderr输出的东西相互交织。
–log-file= log messages to //将信息输向右filename指定的文件。若filename是空,则会引发终止。filename中可有三种格式信息;1,%p将被替换为当前进程的ID。当—trace-children=yes,而没用%p时,所有进程的信息都输向同一个文件,会比较混乱,信息也可能不全,最好文件名中包含%p。2,%q{FOO}被环境变量FOO的值代替,若FOO的内容奇怪的话也可能引发异常。一般不用这种格式,除了极少情况,如基于MPI(一种并行程序开发库)的程序。若用了此种格式,FOO不能为空,否则也引发异常。一些shell里面,”{””}”可能需要反斜杠转义。3,%%被代替为%,%不能后接任何其他字符,否则会引发异常。
–log-socket=ipaddr:port log messages to socket ipaddr:port //将信息输向指定的IP地址。若省了port-number,则默认用1500端口号。若这个IP地址无法接受信息,信息将被写会到stderr。

四、报错相关的错误

user options for Valgrind tools that report errors:
下面是与报错相关的选项。这些选项适用于所有能报错的工具,如memcheck,而cachegrind就用不了。
–xml=yes emit error output in XML (some tools only) //若为yes,启用后,输出的重要部分(例如工具错误消息)将采用XML格式而不是纯文本格式。不重要的信息(非错误信息)被打印在纯文本中。XML输出目标由–xml-fd或–xml-file或—xml-socket指定,而纯文本信息输出目标则由前面的—log-fd或—log-file或—log-socket指定。输出格式由docs/internals/xml-output-protocol4.txt设定。
–xml-fd= XML output to file descriptor //将XML信息输出到由文件描述符number指定的文件中,必须要–xml=yes。
–xml-file= XML output to //与—log-file类似。也必须要—xml=yes。
–xml-socket=ipaddr:port XML output to socket ipaddr:port //与—log-socket类似,也必须要—xml=yes。
–xml-user-comment=STR copy STR verbatim into XML output //在输出的XML文件开头,加的注释信息,没有—xml=yes的话,将被忽略。
–demangle=no|yes automatically demangle C++ names? [yes] //这个选项开启的话,会试图还原目标代码中的C++符号名,使其与源码中的相关符号名字尽量一致。默认是yes。需要注意的是,抑制文件中提到的函数名称应该是错误的形式。在搜索适用的抑制时,Valgrind不会对函数名称进行解码,因为否则会使抑制文件内容依赖于Valgrind的demangling机制的状态,并且还会降低抑制匹配的速度。
–num-callers= show callers in stack traces [12] //定义了在堆栈追踪过程中显示的最大嵌套调用数。注意,valgrind只显示四层嵌套调用的错误信息,故这个选项不影响最终报道的错误信息量。Number最大值是50,默认值是12。
–error-limit=no|yes stop showing new errors if too many? [yes] //若为yes,则当报道出的错误总数超过10000000或有1000个不同类型的,则停止报错。这么多错误的程序也就没必要再调试了,默认是yes。
–error-exitcode= exit code to return if errors found [0=disable] //设置在发现任何错误信息时的valgrind的返回码。
默认是0,这样返回码就是被调程序的返回码。若设为非0值,则此值将代替默认的返回码。如果Valgrind在运行中报告任何错误,则指定要返回的备用退出代码。设置为默认值(零)时,Valgrind的返回值将始终是正在模拟的过程的返回值。设置为非零值时,如果Valgrind检测到任何错误,则返回该值。这对于将Valgrind用作自动化测试套件的一部分非常有用,因为只需检查返回代码,就可以轻松检测Valgrind报告错误的测试用例。
–exit-on-first-error=<yes|no> [default: no]
如果启用此选项,Valgrind将在第一个错误时退出。必须使用–error-exitcode选项定义非零退出值 。如果您正在运行回归测试或使用其他一些自动测试机器,则非常有用
–show-below-main=no|yes continue stack traces below main() [no] //默认是no,追踪堆栈错误时,不显示在那些在main函数下一层那些函数调用的错误信息。
–default-suppressions=yes|no load default suppressions [yes] //抑制错误
–suppressions= suppress errors described in //从其他文件添加抑制
–gen-suppressions=no|yes|all print suppressions for errors? [no] //若选择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,不在询问了。此选项对于C ++程序特别有用,因为它根据需要打印出带有错位名称的抑制。
–db-attach=no|yes start debugger when errors detected? [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 to start debugger [/usr/bin/gdb -nw %f %p] //开启–db-attach选项时,实际用的命令,默认是"gdb -nw %f %p",其中%f是被调试的程序名,%p是被调进程的ID,默认的调试器是valgrind安装时它发现的,一般是/usr/bin/gdb。command应该放在双引号内。
–input-fd= file descriptor for input [0=stdin] //当–db-attach=yes或–gen-suppressions=yes时,valgrind在发现错误时会等待键盘输入即便进行下一步操作,即number默认是0(stdin),通过修改number,可以使得valgrind读取指定文件来执行下一步操作,在关闭了stdin时,这个选项有用。
–dsymutil=no|yes run dsymutil on Mac OS X when helpful? [no] //这个选项只在MacOS上跑valgrind才有用。
–max-stackframe= assume stack switch for SP changes larger than bytes [2000000] //该选项规定了被调程序能使用的最大栈帧空间。默认是2000000。这个选项一般在valgrind的调试输出建议你用时,再用。其实若被valgrind建议了,说明你的程序有问题,最好别在栈上分配太大的数据结构,大的数据最好在堆上分配。
–main-stacksize= set size of main thread’s stack (in bytes) [min(max(current ‘ulimit’ value,1MB),16MB)] //规定了主线程的栈大小。默认情况用ulimit值,一般是16MB或低一点。一般用8~16M能满足绝大部分应用程序的需求。Linux上可最大申请2GB。若valgrid无法分配这么多空间,便会终止。这个选项只影响initial thread,对其他线程栈无影响。

五、与malloc()函数有关的选项

user options for Valgrind tools that replace malloc:
与malloc()函数有关的选项:
–alignment= set minimum alignment of heap allocations [16]
–redzone-size= set minimum size of redzones added before/after
heap blocks (in bytes). [16]

六、不常见选项

uncommon user options for all Valgrind tools:
不常见选项
–fullpath-after= (with nothing after the ‘=’)
show full source paths in call stacks
–fullpath-after=string like --fullpath-after=, but only show the
part of the path after ‘string’. Allows removal
of path prefixes. Use this flag multiple times
to specify a set of prefixes to remove.
–extra-debuginfo-path=path absolute path to search for additional
debug symbols, in addition to existing default
well known search paths.
–debuginfo-server=ipaddr:port also query this server
(valgrind-di-server) for debug symbols
–allow-mismatched-debuginfo=no|yes [no]
for the above two flags only, accept debuginfo
objects that don’t “match” the main object
–smc-check=none|stack|all|all-non-file [stack]
checks for self-modifying code: none, only for
code found in stacks, for all code, or for all
code except that from file-backed mappings
–read-inline-info=yes|no read debug info about inlined function calls
and use it to do better stack traces. [yes]
on Linux/Android for Memcheck/Helgrind/DRD
only. [no] for all other tools and platforms.
–read-var-info=yes|no read debug info on stack and global variables
and use it to print better error messages in
tools that make use of it (Memcheck, Helgrind,
DRD) [no]
–vgdb-poll= gdbserver poll max every basic blocks [5000]
–vgdb-shadow-registers=no|yes let gdb see the shadow registers [no]
–vgdb-prefix= prefix for vgdb FIFOs [/tmp/vgdb-pipe]
–run-libc-freeres=no|yes free up glibc memory at exit on Linux? [yes]
–sim-hints=hint1,hint2,… activate unusual sim behaviours [none]
where hint is one of:
lax-ioctls fuse-compatible enable-outer
no-inner-prefix no-nptl-pthread-stackcache none
–fair-sched=no|yes|try schedule threads fairly on multicore systems [no]
–kernel-variant=variant1,variant2,…
handle non-standard kernel variants [none]
where variant is one of:
bproc android-no-hw-tls
android-gpu-sgx5xx android-gpu-adreno3xx none
–merge-recursive-frames= merge frames between identical
program counters in max frames) [0]
–num-transtab-sectors= size of translated code cache [16]
more sectors may increase performance, but use more memory.
–aspace-minaddr=0xPP avoid mapping memory below 0xPP [guessed]
–show-emwarns=no|yes show warnings about emulation limits? [no]
–require-text-symbol=:sonamepattern:symbolpattern abort run if the
stated shared object doesn’t have the stated
text symbol. Patterns can contain ? and *.
–soname-synonyms=syn1=pattern1,syn2=pattern2,… synonym soname
specify patterns for function wrapping or replacement.
To use a non-libc malloc library that is
in the main exe: --soname-synonyms=somalloc=NONE
in libxyzzy.so: --soname-synonyms=somalloc=libxyzzy.so
–sigill-diagnostics=yes|no warn about illegal instructions? [yes]
–unw-stack-scan-thresh= Enable stack-scan unwind if fewer
than good frames found [0, meaning “disabled”]
NOTE: stack scanning is only available on arm-linux.
–unw-stack-scan-frames= Max number of frames that can be
recovered by stack scanning [5]

六、内存泄漏

user options for Memcheck:
–leak-check=no|summary|full search for memory leaks at exit? [summary] //在退出时搜索内存泄漏
–leak-resolution=low|med|high differentiation of leak stack traces [high]
//在做内存泄漏检查时,确定memcheck将怎么样考虑不同的栈是否是相同的情况。当设置为low时,只需要前两层栈匹配就认为是相同的情况;当设置为med,必须要四层栈匹配,当设置为high时,所有层次的栈都必须匹配。
对于hardcore内存泄漏检查,你很可能需要使用–leak-resolution=high和–num-callers=40或者更大的数字。注意这将产生巨量的信息,这就是为什么默认选项是四个调用者匹配和低分辨率的匹配。注意–leak-resolution= 设置并不影响memcheck查找内存泄漏的能力。它只是改变了结果如何输出。
–show-leak-kinds=kind1,kind2,… which leak kinds to show? [definite,possible]
–errors-for-leak-kinds=kind1,kind2,… which leak kinds are errors? [definite,possible]
where kind is one of:
definite indirect possible reachable all none
–leak-check-heuristics=heur1,heur2,… which heuristics to use for
improving leak search false positive [none]
where heur is one of:
stdstring length64 newarray multipleinheritance all none
–show-reachable=yes same as --show-leak-kinds=all
–show-reachable=no --show-possibly-lost=yes same as --show-leak-kinds=definite,possible
–show-reachable=no --show-possibly-lost=no same as --show-leak-kinds=definite
–undef-value-errors=no|yes check for undefined value errors [yes] //检查未定义的值错误
–track-origins=no|yes show origins of undefined values? [no] //显示未定义值的起源
–partial-loads-ok=no|yes too hard to explain here; see manual [no]
–freelist-vol= volume of freed blocks queue [20000000] //释放块队列的容量
–freelist-big-blocks= releases first blocks with size>= [1000000] //释放第一个具有大小的块
–workaround-gcc296-bugs=no|yes self explanatory [no]
–ignore-ranges=0xPP-0xQQ[,0xRR-0xSS] assume given addresses are OK //假设给定的地址是可以的
–malloc-fill= fill malloc’d areas with given value //用给定的值填充malloc区域
–free-fill= fill free’d areas with given value //用给定的值填充空闲区域
–keep-stacktraces=alloc|free|alloc-and-free|alloc-then-free|none
stack trace(s) to keep for malloc’d/free’d areas [alloc-then-free] //为malloc’d/free’区域保留堆栈跟踪
–show-mismatched-frees=no|yes show frees that don’t match the allocator? [yes] //显示不匹配分配器的释放

Extra options read from ~/.valgrindrc, $VALGRIND_OPTS, ./.valgrindrc

Memcheck is Copyright © 2002-2013, and GNU GPL’d, by Julian Seward et al.
Valgrind is Copyright © 2000-2013, and GNU GPL’d, by Julian Seward et al.
LibVEX is Copyright © 2004-2013, and GNU GPL’d, by OpenWorks LLP et al.

Bug reports, feedback, admiration, abuse, etc, to: www.valgrind.org.

猜你喜欢

转载自blog.csdn.net/u010168781/article/details/83744778