valgrind使用技巧

合集下载

valgrind使用方法

valgrind使用方法

一.Valgrind是什么?Valgrind是一个提供程序调试及性能分析的工具集。

其包含的工具主要有Memcheck,Cachegrind,Callgrind,Massif等。

其中,最为常用的是Memcheck,其主要用来检查程序heap上的内存使用情况。

本文档主要介绍Memcheck的用法和一些使用技巧。

其官方网站是:/二.Valgrind能干什么不能干什么?Valgrind主要用来检查程序中可能出现的以下问题:e of uninitialised memory2.Reading/writing memory after it has been free’d3.Reading/writing off the end of malloc’d block4.Memory leaks -- where pointers to malloc’d blocks are lost foreve5.Mismatched use of malloc/new/new [] vs free/delete/delete []6.Overlapping src and dst pointers in memcpy() and related functions其功能约束如下:1.只能检查heap上的错误,不能检查出static和stack内存的使用,如数组越界等。

2.不能指出为什么泄漏,也不能指出在哪内存泄漏3.指出的错误并非100%正确,但建议在编译时至少以warning的心态对待它们。

三.Valgrind的安装与部署若有root权限,其安装方式如下:1.从官网上下载valgrind 安装包:/downloads/valgrind-3.3.0.tar.bz22.用bzip2及tar命令解压压缩包。

3.进入解压目录,运行./configure4.运行“make”命令5.运行“make install”命令6.运行“valgrind ls- l”测试valgrind是否已经正确安装到计算机上。

valgrind中文手册

valgrind中文手册

/* valgrind-3.5.0 编译和安装技巧* author: lblong* date : 20100530**/安装步骤:1、从valgrind官网上获得代码(也可以通过下载tar包获得源代码,可以点击这里下载)/downloads/current.html#current2、进入源代码目录3、运行./autogen.sh设置环境(需要标准的autoconf工具)4、运行./configure配置V algrind,具体参数信息详见INSTALL文件。

一般只需要设置--prefix=/where/you/want/it/installed5、make,编译V algrind6、make install,安装V algrind详细:1. linux 环境下执行./configuretelstar:/sybase/telstar/user/lblong/memory/valgrind-3.5.0 > ./configurechecking for a BSD-compatible install... /usr/bin/install -cchecking whether build environment is sane... yeschecking for gawk... gawkchecking whether make sets $(MAKE)... yeschecking whether to enable maintainer-specific portions of Makefiles... nochecking whether ln -s works... yeschecking for gcc... ccchecking for C compiler default output file name... a.outchecking whether the C compiler works... yeschecking whether we are cross compiling... nochecking for suffix of executables...checking for suffix of object files... ochecking whether we are using the GNU C compiler... yeschecking whether cc accepts -g... yeschecking for cc option to accept ANSI C... none neededchecking for style of include used by make... GNUchecking dependency style of cc... gcc3checking whether cc understands -c and -o together... yeschecking how to run the C preprocessor... cc -Echecking for g++... g++checking whether we are using the GNU C++ compiler... yeschecking whether g++ accepts -g... yeschecking dependency style of g++... gcc3checking for ranlib... ranlibchecking for ar... /usr/bin/archecking for perl... /usr/bin/perlchecking for gdb... /usr/bin/gdbchecking for diff -u... yeschecking for a supported version of gcc... ok (4.1.2)checking build system type... i686-intel-linuxchecking host system type... i686-intel-linuxchecking for a supported CPU... ok (i686)checking for a 64-bit only build... nochecking for a 32-bit only build... nochecking for a supported OS... ok (linux)checking for the kernel version... 2.6 family (2.6.18-128.el5xen)checking for a supported CPU/OS combination... ok (x86-linux)checking for use as an inner Valgrind... nochecking for egrep... grep -Echecking the GLIBC_VERSION version... 2.5 familychecking for CLOCK_MONOTONIC... yeschecking for PTHREAD_MUTEX_ADAPTIVE_NP... yeschecking for PTHREAD_MUTEX_ERRORCHECK_NP... yeschecking for PTHREAD_MUTEX_RECURSIVE_NP... yeschecking for PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP... yes checking for pthread_mutex_t::__m_kind... nochecking for pthread_mutex_t::__data.__kind... yeschecking for Altivec... nochecking for pthread_create@GLIBC2.0()... yeschecking for eventfd()... nochecking if gcc accepts -m32... yeschecking if gcc accepts -maix32... nochecking if gcc accepts -m64... nochecking if gcc accepts -maix64... nochecking if gcc accepts -mmmx... yeschecking if gcc accepts -msse... yeschecking if gcc accepts -mpreferred-stack-boundary... yeschecking if gcc accepts -Wno-pointer-sign... yeschecking if gcc accepts -Wdeclaration-after-statement... yeschecking if gcc accepts -Wno-empty-body... nochecking if gcc accepts -Wno-format-zero-length... yeschecking if gcc accepts -Wno-uninitialized... yeschecking if gcc accepts -Wextra or -W... -W extrachecking if gcc accepts -fno-stack-protector... yes checking if gcc accepts --param inline-unit-growth... yes checking if gcc supports __builtin_expect... yes checking if ppc32/64 as supports mtocrf/mfocrf... no checking if x86/amd64 assembler speaks SSE3... yes checking if x86/amd64 assembler speaks SSSE3... no checking for TLS support... yeschecking for /proc/self/fd... yeschecking for /proc/self/exe... yeschecking for /proc/self/maps... yeschecking for ANSI C header files... yeschecking for sys/types.h... yeschecking for sys/stat.h... yeschecking for stdlib.h... yeschecking for string.h... yeschecking for memory.h... yeschecking for strings.h... yeschecking for inttypes.h... yeschecking for stdint.h... yeschecking for unistd.h... yeschecking asm/unistd.h usability... yeschecking asm/unistd.h presence... yeschecking for asm/unistd.h... yeschecking endian.h usability... yeschecking endian.h presence... yeschecking for endian.h... yeschecking mqueue.h usability... yeschecking mqueue.h presence... yeschecking for mqueue.h... yeschecking sys/endian.h usability... nochecking sys/endian.h presence... nochecking for sys/endian.h... nochecking sys/epoll.h usability... yeschecking sys/epoll.h presence... yeschecking for sys/epoll.h... yeschecking sys/eventfd.h usability... nochecking sys/eventfd.h presence... nochecking for sys/eventfd.h... nochecking sys/klog.h usability... yeschecking sys/klog.h presence... yeschecking for sys/klog.h... yeschecking sys/poll.h usability... yeschecking sys/poll.h presence... yeschecking for sys/poll.h... yeschecking sys/signal.h usability... yeschecking sys/signal.h presence... yeschecking for sys/signal.h... yeschecking sys/signalfd.h usability... nochecking sys/signalfd.h presence... nochecking for sys/signalfd.h... nochecking sys/syscall.h usability... yeschecking sys/syscall.h presence... yeschecking for sys/syscall.h... yeschecking sys/time.h usability... yeschecking sys/time.h presence... yeschecking for sys/time.h... yeschecking for sys/types.h... (cached) yeschecking for uid_t in sys/types.h... yeschecking for off_t... yeschecking for size_t... yeschecking whether time.h and sys/time.h may both be included... yes checking for working memcmp... yeschecking for stdlib.h... (cached) yeschecking for unistd.h... (cached) yeschecking for getpagesize... yeschecking for working mmap... yeschecking return type of signal handlers... voidchecking for clock_gettime in -lrt... yeschecking for clock_gettime... yeschecking for epoll_create... yeschecking for epoll_pwait... nochecking for floor... nochecking for klogctl... yeschecking for mallinfo... yeschecking for memchr... yeschecking for memset... yeschecking for mkdir... yeschecking for mremap... yeschecking for ppoll... yeschecking for pthread_barrier_init... yeschecking for pthread_condattr_setclock... yeschecking for pthread_mutex_timedlock... yeschecking for pthread_rwlock_timedrdlock... yeschecking for pthread_rwlock_timedwrlock... yeschecking for pthread_spin_lock... yeschecking for semtimedop... yeschecking for signalfd... nochecking for sigwaitinfo... yeschecking for syscall... yeschecking for strchr... yeschecking for strdup... yeschecking for strpbrk... yeschecking for strrchr... yeschecking for strstr... yeschecking for timerfd... nochecking for utimensat... nochecking primary target for usable MPI2-compliant C compiler and mpi.h... nochecking secondary target for usable MPI2-compliant C compiler and mpi.h... noconfigure: W ARNING: pkg-config has not been installed or is too old.configure: W ARNING: Detection of Qt4 will be skipped.checking for boost... nochecking for OpenMP... yeschecking if gcc supports __sync_bool_compare_and_swap... noconfigure: creating ./config.statusconfig.status: creating Makefileconfig.status: creating VEX/Makefileconfig.status: creating valgrind.specconfig.status: creating valgrind.pcconfig.status: creating glibc-2.X.suppconfig.status: creating docs/Makefileconfig.status: creating tests/Makefileconfig.status: creating tests/vg_regtestconfig.status: creating perf/Makefileconfig.status: creating perf/vg_perfconfig.status: creating include/Makefileconfig.status: creating auxprogs/Makefileconfig.status: creating mpi/Makefileconfig.status: creating coregrind/Makefileconfig.status: creating memcheck/Makefileconfig.status: creating memcheck/tests/Makefileconfig.status: creating memcheck/tests/amd64/Makefileconfig.status: creating memcheck/tests/x86/Makefileconfig.status: creating memcheck/tests/linux/Makefileconfig.status: creating memcheck/tests/darwin/Makefileconfig.status: creating memcheck/tests/x86-linux/Makefileconfig.status: creating memcheck/perf/Makefileconfig.status: creating cachegrind/Makefileconfig.status: creating cachegrind/tests/Makefileconfig.status: creating cachegrind/tests/x86/Makefileconfig.status: creating cachegrind/cg_annotateconfig.status: creating callgrind/Makefileconfig.status: creating callgrind/callgrind_annotateconfig.status: creating callgrind/callgrind_controlconfig.status: creating callgrind/tests/Makefileconfig.status: creating helgrind/Makefileconfig.status: creating helgrind/tests/Makefileconfig.status: creating massif/Makefileconfig.status: creating massif/tests/Makefileconfig.status: creating massif/perf/Makefileconfig.status: creating massif/ms_printconfig.status: creating lackey/Makefileconfig.status: creating lackey/tests/Makefileconfig.status: creating none/Makefileconfig.status: creating none/tests/Makefileconfig.status: creating none/tests/amd64/Makefileconfig.status: creating none/tests/ppc32/Makefileconfig.status: creating none/tests/ppc64/Makefileconfig.status: creating none/tests/x86/Makefileconfig.status: creating none/tests/linux/Makefileconfig.status: creating none/tests/darwin/Makefileconfig.status: creating none/tests/x86-linux/Makefileconfig.status: creating exp-ptrcheck/Makefileconfig.status: creating exp-ptrcheck/tests/Makefileconfig.status: creating drd/Makefileconfig.status: creating drd/scripts/download-and-build-splash2config.status: creating drd/tests/Makefileconfig.status: creating exp-bbv/Makefileconfig.status: creating exp-bbv/tests/Makefileconfig.status: creating exp-bbv/tests/x86/Makefileconfig.status: creating exp-bbv/tests/x86-linux/Makefileconfig.status: creating exp-bbv/tests/amd64-linux/Makefileconfig.status: creating exp-bbv/tests/ppc32-linux/Makefileconfig.status: creating config.hconfig.status: executing depfiles commandsMaximum build arch: x86Primary build arch: x86Secondary build arch:Build OS: linuxPrimary build target: X86_LINUXSecondary build target:Default supp files: exp-ptrcheck.supp xfree-3.supp xfree-4.supp glibc-2.X-drd.supp glibc-2.34567-NPTL-helgrind.supp glibc-2.5.supp2. 直接在当期目录下执行maketelstar:/sybase/telstar/user/lblong/memory/valgrind-3.5.0 > makeecho "# This is a generated file, composed of the following suppression rules:" > default.supp echo "# " exp-ptrcheck.supp xfree-3.supp xfree-4.supp glibc-2.X-drd.supp glibc-2.34567-NPTL-helgrind.supp glibc-2.5.supp >> default.suppcat exp-ptrcheck.supp xfree-3.supp xfree-4.supp glibc-2.X-drd.supp glibc-2.34567-NPTL-helgrind.supp glibc-2.5.supp >> default.suppmake all-recursivemake[1]: Entering directory `/sybase/telstar/user/lblong/memory/valgrind-3.5.0'Making all in includemake[2]: Entering directory `/sybase/telstar/user/lblong/memory/valgrind-3.5.0/include'make[2]: Nothing to be done for `all'.make[2]: Leaving directory `/sybase/telstar/user/lblong/memory/valgrind-3.5.0/include'Making all in VEXmake[2]: Entering directory `/sybase/telstar/user/lblong/memory/valgrind-3.5.0/VEX'make all-ammake[3]: Entering directory `/sybase/telstar/user/lblong/memory/valgrind-3.5.0/VEX'if cc -DHA VE_CONFIG_H -I. -I. -I.. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -Ipriv -m32 -mpreferred-stack-boundary=2 -O2 -g -Wall -Wmissing-prototypes -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -Wno-format-zero-length -fno-strict-aliasing -Wbad-function-cast -Wcast-qual -Wcast-align -fstrict-aliasing -Wno-long-long -Wno-pointer-sign -Wdeclaration-after-statement -fno-stack-protector -MT libvex_x86_linux_a-main_globals.o -MD -MP -MF ".deps/libvex_x86_linux_a-main_globals.Tpo" -c -o libvex_x86_linux_a-main_globals.o `test -f 'priv/main_globals.c' || echo './'`priv/main_globals.c; \then mv -f ".deps/libvex_x86_linux_a-main_globals.Tpo" ".deps/libvex_x86_linux_a-main_globals.Po"; else rm -f ".deps/libvex_x86_linux_a-main_globals.Tpo"; exit 1; fiif cc -DHA VE_CONFIG_H -I. -I. -I.. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -Ipriv -m32 -mpreferred-stack-boundary=2 -O2 -g -Wall -Wmissing-prototypes -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -Wno-format-zero-length -fno-strict-aliasing -Wbad-function-cast -Wcast-qual -Wcast-align -fstrict-aliasing -Wno-long-long -Wno-pointer-sign -Wdeclaration-after-statement -fno-stack-protector -MT libvex_x86_linux_a-main_main.o -MD -MP -MF ".deps/libvex_x86_linux_a-main_main.Tpo" -c -o libvex_x86_linux_a-main_main.o `test -f 'priv/main_main.c' || echo './'`priv/main_main.c; \then mv -f ".deps/libvex_x86_linux_a-main_main.Tpo" ".deps/libvex_x86_linux_a-main_main.Po"; else rm -f ".deps/libvex_x86_linux_a-main_main.Tpo"; exit 1; fiif cc -DHA VE_CONFIG_H -I. -I. -I.. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -Ipriv -m32 -mpreferred-stack-boundary=2 -O2 -g -Wall -Wmissing-prototypes -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations-Wno-format-zero-length -fno-strict-aliasing -Wbad-function-cast -Wcast-qual -Wcast-align -fstrict-aliasing -Wno-long-long -Wno-pointer-sign -Wdeclaration-after-statement -fno-stack-protector -MT libvex_x86_linux_a-main_util.o -MD -MP -MF ".deps/libvex_x86_linux_a-main_util.Tpo" -c -o libvex_x86_linux_a-main_util.o `test -f 'priv/main_util.c' || echo './'`priv/main_util.c; \then mv -f ".deps/libvex_x86_linux_a-main_util.Tpo" ".deps/libvex_x86_linux_a-main_util.Po"; else rm -f ".deps/libvex_x86_linux_a-main_util.Tpo"; exit 1; fiif cc -DHA VE_CONFIG_H -I. -I. -I.. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -Ipriv -m32 -mpreferred-stack-boundary=2 -O2 -g -Wall -Wmissing-prototypes -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -Wno-format-zero-length -fno-strict-aliasing -Wbad-function-cast -Wcast-qual -Wcast-align -fstrict-aliasing -Wno-long-long -Wno-pointer-sign -Wdeclaration-after-statement -fno-stack-protector -MT libvex_x86_linux_a-ir_defs.o -MD -MP -MF ".deps/libvex_x86_linux_a-ir_defs.Tpo" -c -o libvex_x86_linux_a-ir_defs.o `test -f 'priv/ir_defs.c' || echo './'`priv/ir_defs.c; \then mv -f ".deps/libvex_x86_linux_a-ir_defs.Tpo" ".deps/libvex_x86_linux_a-ir_defs.Po"; else rm -f ".deps/libvex_x86_linux_a-ir_defs.Tpo"; exit 1; fiif cc -DHA VE_CONFIG_H -I. -I. -I.. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -Ipriv -m32 -mpreferred-stack-boundary=2 -O2 -g -Wall -Wmissing-prototypes -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -Wno-format-zero-length -fno-strict-aliasing -Wbad-function-cast -Wcast-qual -Wcast-align -fstrict-aliasing -Wno-long-long -Wno-pointer-sign -Wdeclaration-after-statement -fno-stack-protector -MT libvex_x86_linux_a-ir_match.o -MD -MP -MF ".deps/libvex_x86_linux_a-ir_match.Tpo" -c -o libvex_x86_linux_a-ir_match.o `test -f 'priv/ir_match.c' || echo './'`priv/ir_match.c; \then mv -f ".deps/libvex_x86_linux_a-ir_match.Tpo" ".deps/libvex_x86_linux_a-ir_match.Po"; else rm -f ".deps/libvex_x86_linux_a-ir_match.Tpo"; exit 1; fiif cc -DHA VE_CONFIG_H -I. -I. -I.. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -Ipriv -m32 -mpreferred-stack-boundary=2 -O2 -g -Wall -Wmissing-prototypes -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -Wno-format-zero-length -fno-strict-aliasing -Wbad-function-cast -Wcast-qual -Wcast-align -fstrict-aliasing -Wno-long-long -Wno-pointer-sign -Wdeclaration-after-statement -fno-stack-protector -MT libvex_x86_linux_a-ir_opt.o -MD -MP -MF ".deps/libvex_x86_linux_a-ir_opt.Tpo" -c -o libvex_x86_linux_a-ir_opt.o `test -f 'priv/ir_opt.c' || echo './'`priv/ir_opt.c; \then mv -f ".deps/libvex_x86_linux_a-ir_opt.Tpo" ".deps/libvex_x86_linux_a-ir_opt.Po"; else rm -f ".deps/libvex_x86_linux_a-ir_opt.Tpo"; exit 1; fi if cc -DHA VE_CONFIG_H -I. -I. -I.. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -Ipriv -m32 -mpreferred-stack-boundary=2 -O2 -g -Wall -Wmissing-prototypes -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -Wno-format-zero-length -fno-strict-aliasing -Wbad-function-cast -Wcast-qual -Wcast-align-fstrict-aliasing -Wno-long-long -Wno-pointer-sign -Wdeclaration-after-statement -fno-stack-protector -MT libvex_x86_linux_a-guest_generic_bb_to_IR.o -MD -MP -MF ".deps/libvex_x86_linux_a-guest_generic_bb_to_IR.Tpo" -c -o libvex_x86_linux_a-guest_generic_bb_to_IR.o `test -f 'priv/guest_generic_bb_to_IR.c' || echo './'`priv/guest_generic_bb_to_IR.c; \then mv -f ".deps/libvex_x86_linux_a-guest_generic_bb_to_IR.Tpo" ".deps/libvex_x86_linux_a-guest_generic_bb_to_IR.Po"; else rm -f ".deps/libvex_x86_linux_a-guest_generic_bb_to_IR.Tpo"; exit 1; fiif cc -DHA VE_CONFIG_H -I. -I. -I.. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -Ipriv -m32 -mpreferred-stack-boundary=2 -O2 -g -Wall -Wmissing-prototypes -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -Wno-format-zero-length -fno-strict-aliasing -Wbad-function-cast -Wcast-qual -Wcast-align -fstrict-aliasing -Wno-long-long -Wno-pointer-sign -Wdeclaration-after-statement -fno-stack-protector -MT libvex_x86_linux_a-guest_generic_x87.o -MD -MP -MF ".deps/libvex_x86_linux_a-guest_generic_x87.Tpo" -c -o libvex_x86_linux_a-guest_generic_x87.o `test -f 'priv/guest_generic_x87.c' || echo './'`priv/guest_generic_x87.c; \then mv -f ".deps/libvex_x86_linux_a-guest_generic_x87.Tpo" ".deps/libvex_x86_linux_a-guest_generic_x87.Po"; else rm -f ".deps/libvex_x86_linux_a-guest_generic_x87.Tpo"; exit 1; fiif cc -DHA VE_CONFIG_H -I. -I. -I.. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -Ipriv -m32 -mpreferred-stack-boundary=2 -O2 -g -Wall -Wmissing-prototypes -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -Wno-format-zero-length -fno-strict-aliasing -Wbad-function-cast -Wcast-qual -Wcast-align -fstrict-aliasing -Wno-long-long -Wno-pointer-sign -Wdeclaration-after-statement -fno-stack-protector -MT libvex_x86_linux_a-guest_x86_helpers.o -MD -MP -MF ".deps/libvex_x86_linux_a-guest_x86_helpers.Tpo" -c -o libvex_x86_linux_a-guest_x86_helpers.o `test -f 'priv/guest_x86_helpers.c' || echo './'`priv/guest_x86_helpers.c; \then mv -f ".deps/libvex_x86_linux_a-guest_x86_helpers.Tpo" ".deps/libvex_x86_linux_a-guest_x86_helpers.Po"; else rm -f ".deps/libvex_x86_linux_a-guest_x86_helpers.Tpo"; exit 1; fiif cc -DHA VE_CONFIG_H -I. -I. -I.. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -Ipriv -m32 -mpreferred-stack-boundary=2 -O2 -g -Wall -Wmissing-prototypes -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -Wno-format-zero-length -fno-strict-aliasing -Wbad-function-cast -Wcast-qual -Wcast-align -fstrict-aliasing -Wno-long-long -Wno-pointer-sign -Wdeclaration-after-statement -fno-stack-protector -MT libvex_x86_linux_a-guest_x86_toIR.o -MD -MP -MF ".deps/libvex_x86_linux_a-guest_x86_toIR.Tpo" -c -o libvex_x86_linux_a-guest_x86_toIR.o `test -f 'priv/guest_x86_toIR.c' || echo './'`priv/guest_x86_toIR.c; \then mv -f ".deps/libvex_x86_linux_a-guest_x86_toIR.Tpo" ".deps/libvex_x86_linux_a-guest_x86_toIR.Po"; else rm -f ".deps/libvex_x86_linux_a-guest_x86_toIR.Tpo"; exit 1; fiif cc -DHA VE_CONFIG_H -I. -I. -I.. -I.. -I../include -I../VEX/pub -DVGA_x86=1-DVGO_linux=1 -DVGP_x86_linux=1 -Ipriv -m32 -mpreferred-stack-boundary=2 -O2 -g -Wall -Wmissing-prototypes -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -Wno-format-zero-length -fno-strict-aliasing -Wbad-function-cast -Wcast-qual -Wcast-align -fstrict-aliasing -Wno-long-long -Wno-pointer-sign -Wdeclaration-after-statement -fno-stack-protector -MT libvex_x86_linux_a-guest_amd64_helpers.o -MD -MP -MF ".deps/libvex_x86_linux_a-guest_amd64_helpers.Tpo"-c -o libvex_x86_linux_a-guest_amd64_helpers.o `test -f 'priv/guest_amd64_helpers.c' || echo './'`priv/guest_amd64_helpers.c; \then mv -f ".deps/libvex_x86_linux_a-guest_amd64_helpers.Tpo" ".deps/libvex_x86_linux_a-guest_amd64_helpers.Po"; else rm -f ".deps/libvex_x86_linux_a-guest_amd64_helpers.Tpo"; exit 1; fiif cc -DHA VE_CONFIG_H -I. -I. -I.. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -Ipriv -m32 -mpreferred-stack-boundary=2 -O2 -g -Wall -Wmissing-prototypes -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -Wno-format-zero-length -fno-strict-aliasing -Wbad-function-cast -Wcast-qual -Wcast-align -fstrict-aliasing -Wno-long-long -Wno-pointer-sign -Wdeclaration-after-statement -fno-stack-protector -MT libvex_x86_linux_a-guest_amd64_toIR.o -MD -MP -MF ".deps/libvex_x86_linux_a-guest_amd64_toIR.Tpo" -c -o libvex_x86_linux_a-guest_amd64_toIR.o `test -f 'priv/guest_amd64_toIR.c' || echo './'`priv/guest_amd64_toIR.c; \then mv -f ".deps/libvex_x86_linux_a-guest_amd64_toIR.Tpo" ".deps/libvex_x86_linux_a-guest_amd64_toIR.Po"; else rm -f ".deps/libvex_x86_linux_a-guest_amd64_toIR.Tpo"; exit 1; fiif cc -DHA VE_CONFIG_H -I. -I. -I.. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -Ipriv -m32 -mpreferred-stack-boundary=2 -O2 -g -Wall -Wmissing-prototypes -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -Wno-format-zero-length -fno-strict-aliasing -Wbad-function-cast -Wcast-qual -Wcast-align -fstrict-aliasing -Wno-long-long -Wno-pointer-sign -Wdeclaration-after-statement -fno-stack-protector -MT libvex_x86_linux_a-guest_ppc_helpers.o -MD -MP -MF ".deps/libvex_x86_linux_a-guest_ppc_helpers.Tpo" -c -o libvex_x86_linux_a-guest_ppc_helpers.o `test -f 'priv/guest_ppc_helpers.c' || echo './'`priv/guest_ppc_helpers.c; \then mv -f ".deps/libvex_x86_linux_a-guest_ppc_helpers.Tpo" ".deps/libvex_x86_linux_a-guest_ppc_helpers.Po"; else rm -f ".deps/libvex_x86_linux_a-guest_ppc_helpers.Tpo"; exit 1; fiif cc -DHA VE_CONFIG_H -I. -I. -I.. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -Ipriv -m32 -mpreferred-stack-boundary=2 -O2 -g -Wall -Wmissing-prototypes -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -Wno-format-zero-length -fno-strict-aliasing -Wbad-function-cast -Wcast-qual -Wcast-align -fstrict-aliasing -Wno-long-long -Wno-pointer-sign -Wdeclaration-after-statement -fno-stack-protector -MT libvex_x86_linux_a-guest_ppc_toIR.o -MD -MP -MF ".deps/libvex_x86_linux_a-guest_ppc_toIR.Tpo" -c -o libvex_x86_linux_a-guest_ppc_toIR.o `test -f 'priv/guest_ppc_toIR.c' || echo './'`priv/guest_ppc_toIR.c; \then mv -f ".deps/libvex_x86_linux_a-guest_ppc_toIR.Tpo"".deps/libvex_x86_linux_a-guest_ppc_toIR.Po"; else rm -f ".deps/libvex_x86_linux_a-guest_ppc_toIR.Tpo"; exit 1; fiif cc -DHA VE_CONFIG_H -I. -I. -I.. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -Ipriv -m32 -mpreferred-stack-boundary=2 -O2 -g -Wall -Wmissing-prototypes -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -Wno-format-zero-length -fno-strict-aliasing -Wbad-function-cast -Wcast-qual -Wcast-align -fstrict-aliasing -Wno-long-long -Wno-pointer-sign -Wdeclaration-after-statement -fno-stack-protector -MT libvex_x86_linux_a-guest_arm_helpers.o -MD -MP -MF ".deps/libvex_x86_linux_a-guest_arm_helpers.Tpo" -c -o libvex_x86_linux_a-guest_arm_helpers.o `test -f 'priv/guest_arm_helpers.c' || echo './'`priv/guest_arm_helpers.c; \then mv -f ".deps/libvex_x86_linux_a-guest_arm_helpers.Tpo" ".deps/libvex_x86_linux_a-guest_arm_helpers.Po"; else rm -f ".deps/libvex_x86_linux_a-guest_arm_helpers.Tpo"; exit 1; fiif cc -DHA VE_CONFIG_H -I. -I. -I.. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -Ipriv -m32 -mpreferred-stack-boundary=2 -O2 -g -Wall -Wmissing-prototypes -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -Wno-format-zero-length -fno-strict-aliasing -Wbad-function-cast -Wcast-qual -Wcast-align -fstrict-aliasing -Wno-long-long -Wno-pointer-sign -Wdeclaration-after-statement -fno-stack-protector -MT libvex_x86_linux_a-guest_arm_toIR.o -MD -MP -MF ".deps/libvex_x86_linux_a-guest_arm_toIR.Tpo" -c -o libvex_x86_linux_a-guest_arm_toIR.o `test -f 'priv/guest_arm_toIR.c' || echo './'`priv/guest_arm_toIR.c; \then mv -f ".deps/libvex_x86_linux_a-guest_arm_toIR.Tpo" ".deps/libvex_x86_linux_a-guest_arm_toIR.Po"; else rm -f ".deps/libvex_x86_linux_a-guest_arm_toIR.Tpo"; exit 1; fiif cc -DHA VE_CONFIG_H -I. -I. -I.. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -Ipriv -m32 -mpreferred-stack-boundary=2 -O2 -g -Wall -Wmissing-prototypes -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -Wno-format-zero-length -fno-strict-aliasing -Wbad-function-cast -Wcast-qual -Wcast-align -fstrict-aliasing -Wno-long-long -Wno-pointer-sign -Wdeclaration-after-statement -fno-stack-protector -MT libvex_x86_linux_a-host_generic_regs.o -MD -MP -MF ".deps/libvex_x86_linux_a-host_generic_regs.Tpo" -c -o libvex_x86_linux_a-host_generic_regs.o `test -f 'priv/host_generic_regs.c' || echo './'`priv/host_generic_regs.c; \then mv -f ".deps/libvex_x86_linux_a-host_generic_regs.Tpo" ".deps/libvex_x86_linux_a-host_generic_regs.Po"; else rm -f ".deps/libvex_x86_linux_a-host_generic_regs.Tpo"; exit 1; fiif cc -DHA VE_CONFIG_H -I. -I. -I.. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -Ipriv -m32 -mpreferred-stack-boundary=2 -O2 -g -Wall -Wmissing-prototypes -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -Wno-format-zero-length -fno-strict-aliasing -Wbad-function-cast -Wcast-qual -Wcast-align -fstrict-aliasing -Wno-long-long -Wno-pointer-sign -Wdeclaration-after-statement -fno-stack-protector -MT libvex_x86_linux_a-host_generic_simd64.o -MD -MP -MF ".deps/libvex_x86_linux_a-host_generic_simd64.Tpo" -c -o libvex_x86_linux_a-host_generic_simd64.o `test -f 'priv/host_generic_simd64.c' || echo'./'`priv/host_generic_simd64.c; \then mv -f ".deps/libvex_x86_linux_a-host_generic_simd64.Tpo" ".deps/libvex_x86_linux_a-host_generic_simd64.Po"; else rm -f ".deps/libvex_x86_linux_a-host_generic_simd64.Tpo"; exit 1; fiif cc -DHA VE_CONFIG_H -I. -I. -I.. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -Ipriv -m32 -mpreferred-stack-boundary=2 -O2 -g -Wall -Wmissing-prototypes -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -Wno-format-zero-length -fno-strict-aliasing -Wbad-function-cast -Wcast-qual -Wcast-align -fstrict-aliasing -Wno-long-long -Wno-pointer-sign -Wdeclaration-after-statement -fno-stack-protector -MT libvex_x86_linux_a-host_generic_reg_alloc2.o -MD -MP -MF ".deps/libvex_x86_linux_a-host_generic_reg_alloc2.Tpo" -c -o libvex_x86_linux_a-host_generic_reg_alloc2.o `test -f 'priv/host_generic_reg_alloc2.c' || echo './'`priv/host_generic_reg_alloc2.c; \then mv -f ".deps/libvex_x86_linux_a-host_generic_reg_alloc2.Tpo" ".deps/libvex_x86_linux_a-host_generic_reg_alloc2.Po"; else rm -f ".deps/libvex_x86_linux_a-host_generic_reg_alloc2.Tpo"; exit 1; fiif cc -DHA VE_CONFIG_H -I. -I. -I.. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -Ipriv -m32 -mpreferred-stack-boundary=2 -O2 -g -Wall -Wmissing-prototypes -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -Wno-format-zero-length -fno-strict-aliasing -Wbad-function-cast -Wcast-qual -Wcast-align -fstrict-aliasing -Wno-long-long -Wno-pointer-sign -Wdeclaration-after-statement -fno-stack-protector -MT libvex_x86_linux_a-host_x86_defs.o -MD -MP -MF ".deps/libvex_x86_linux_a-host_x86_defs.Tpo" -c -o libvex_x86_linux_a-host_x86_defs.o `test -f 'priv/host_x86_defs.c' || echo './'`priv/host_x86_defs.c; \then mv -f ".deps/libvex_x86_linux_a-host_x86_defs.Tpo" ".deps/libvex_x86_linux_a-host_x86_defs.Po"; else rm -f ".deps/libvex_x86_linux_a-host_x86_defs.Tpo"; exit 1; fiif cc -DHA VE_CONFIG_H -I. -I. -I.. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -Ipriv -m32 -mpreferred-stack-boundary=2 -O2 -g -Wall -Wmissing-prototypes -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -Wno-format-zero-length -fno-strict-aliasing -Wbad-function-cast -Wcast-qual -Wcast-align -fstrict-aliasing -Wno-long-long -Wno-pointer-sign -Wdeclaration-after-statement -fno-stack-protector -MT libvex_x86_linux_a-host_x86_isel.o -MD -MP -MF ".deps/libvex_x86_linux_a-host_x86_isel.Tpo" -c -o libvex_x86_linux_a-host_x86_isel.o `test -f 'priv/host_x86_isel.c' || echo './'`priv/host_x86_isel.c; \then mv -f ".deps/libvex_x86_linux_a-host_x86_isel.Tpo" ".deps/libvex_x86_linux_a-host_x86_isel.Po"; else rm -f ".deps/libvex_x86_linux_a-host_x86_isel.Tpo"; exit 1; fiif cc -DHA VE_CONFIG_H -I. -I. -I.. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -Ipriv -m32 -mpreferred-stack-boundary=2 -O2 -g -Wall -Wmissing-prototypes -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -Wno-format-zero-length -fno-strict-aliasing -Wbad-function-cast -Wcast-qual -Wcast-align -fstrict-aliasing -Wno-long-long -Wno-pointer-sign -Wdeclaration-after-statement -fno-stack-protector -MT libvex_x86_linux_a-host_amd64_defs.o -MD -MP -MF。

内存调试工具 valgrind

内存调试工具 valgrind

内存调试工具valgrind来源::linux下面用c++写代码,在所难免会遇到segmentation fault(段错误)。

个人在编写ns扩展模块时候,遇到过很多段错误,虽然运行时刻经常由程序抛出段错误,但是段错误的发生的程序级别的原因多种多样,不过归结到系统级别上,段错误都是由于内存原因引起的(个人总结)。

会造成内存错误的程序级别的原因,也就是我们程序员所经常犯的错误大致可以分为以下几个方面:1,使用未初始化的指针-这是必然的,指针指空的东西,必然出错。

2,重复删除一个指针-必然,再次删除就会删除一个已经分配给别的程序的数据或者其他。

3,内存冲突-由于程序声明的两块数据区域重叠,造成混乱。

4,混杂的指针错误-只能具体问题具体分析,情况比较复杂。

对于一位刚开始用c++在linux编程的人来说,最常遇到的应该的就是1与2了。

当工程规模比较大,程序由小组完成而后整合等的情况下,很容易出现2,3,4的情况。

这时候的调试比较麻烦,也需要很多耐心。

我在做的wimax mesh的项目就是这样。

对于一个timer的使用,没有初始化,造成的段错误,一目了然。

工程进展非常顺利。

当工程做到50%时候(11.08号),遇到了一个段错误,结果调试到12.02号才调出来!我就来说一下我的调试历程吧!真是一波三折阿!开始的时候以为是1或者2的情况,反复检查,不是这样。

然后怀疑3或者4,结果由于没有使用任何工具,只是在代码中加打印信息,这时候只能把错误定位到transmit(p)这个函数上。

但是这个函数我只写了一行,就是transmit(p){downtarget_-recv(p,(Handle*)NULL);}程序在这个地方出错实在让人摸不到头绪,因为再往下执行就不是我代码的问题了,而是下层已有代码甚至是系统代码的问题阿!非常困扰!然后开始用gdb调试,gdb是一个很好的很强大的调试工具,我用的命令行的,所能完成的功能和vc下的调试工具差不多,只是需要看什么变量就是要用print×来看罢了,不过功能决不比它差。

valgrind内存查看工具介绍

valgrind内存查看工具介绍

Valgrind内存工具学习目录一. VALGRIND工具简介 (1)1.1V ALGRIND体系结构概述 (1)1.2L INUX内存空间布局 (2)二. VALGRIND的安装 (4)2.1在L INUX系统下的安装 (4)2.2在设备中的安装 (4)三. MEMCHECK模块使用 (4)3.1使用未初始化的内存 (5)3.2内存读写越界 (6)3.3内存覆盖 (7)3.4动态内存管理错误 (8)3.5内存泄露 (9)3.6内存管理规则 (12)四. MASSIF模块的使用 (13)4.1问题引出 (13)4.2运行MASSIF模块 (14)4.3运行MS_PRINT (14)4.4.OUT文件声明 (14)4.5内存分配趋势图说明 (15)4.6内存分配详细说明 (16)4.6.1 内存分配快照表 (16)4.6.2 分配函数内存详细 (17)4.7参数说明 (17)五. CACHEGRIND使用 (18)5.1使用命令: (18)5.2结果分析 (18)六. HELGRIND模块使用 (20)七. 附录 (20)一. Valgrind工具简介用于定位应用程序开发中的内存问题。

Valgrind是linux下开源的内存问题检测工具。

1.1 Valgrind体系结构概述Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。

Valgrind由内核(core)以及基于内核的其他调试工具组成。

内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具;而其他工具则类似于插件(plug-in),利用内核提供的服务完成各种特定的内存调试任务。

Valgrind的体系结构如下图所示:图 1.1 Valgrind 体系结构Valgrind包括如下一些工具:Memcheck。

这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内存,使用已经释放了的内存,内存访问越界等。

valgrind的使用方法-详细手册

valgrind的使用方法-详细手册

valgrind的使用Valgrind是一个GPL的软件,用于Linux(For x86, amd64 and ppc32)程序的内存调试和代码剖析。

你可以在它的环境中运行你的程序来监视内存的使用情况,比如C 语言中的malloc和free或者 C++中的new和 delete。

使用Valgrind的工具包,你可以自动的检测许多内存管理和线程的bug,避免花费太多的时间在bug寻找上,使得你的程序更加稳固。

Valgrind的主要功能Valgrind工具包包含多个工具,如Memcheck,Cachegrind,Helgrind, Callgrind,Massif。

下面分别介绍个工具的作用:Memcheck 工具主要检查下面的程序错误:∙使用未初始化的内存 (Use of uninitialised memory)∙使用已经释放了的内存(Reading/writing memory after it has been free’d) ∙使用超过 malloc分配的内存空间(Reading/writing off the end of malloc’d blocks)∙对堆栈的非法访问 (Reading/writing inappropriate areas on the stack) ∙申请的空间是否有释放 (Memory leaks –where pointers to malloc’d blocks are lost forever)∙malloc/free/new/delete申请和释放内存的匹配(Mismatched use of malloc/new/new [] vs free/delete/delete [])∙src和dst的重叠(Overlapping src and dst pointers in memcpy() and related functions)CallgrindCallgrind收集程序运行时的一些数据,函数调用关系等信息,还可以有选择地进行cache 模拟。

valgrind 使用手册之一

valgrind 使用手册之一

valgrind 使用手册之一2011-07-28 17:37valgrindValgrind is an instrumentation framework for building dynamic analysis tools. There are Valgrind tools that can automatically detect many memory management andthreading bugs, and profile your programs in detail. You can also use Valgrind to build new tools.下载:svn co svn:///valgrind/trunk valgrind安装:cd valgrind./autogen.sh./configure --prefix=...makesudo make install使用方法:要检测的程序必须加-g选项,推荐使用-O0,不优化内存检测:如果你运行程序时命令是这样的:myprog arg1 arg2检测时改成这样:valgrind --leak-check=yes myprog arg1 arg2 ,默认是memcheckvalgrind --tool=cachegrind myprog arg1 arg2 ,这个调用的则是cachegrind,输出结果在当前目录下的cachegrind.out.<pid> pid为程序的pid Valgrind工具包包含多个工具,如Memcheck,Cachegrind,Helgrind, Callgrind,Massif,你可以用上面的--tool=来指定,指定时没有大写exp-ptrcheck, a heap, stack and global array overrun detectorvalgrind --tool=exp-ptrcheck --log-file=val.log ./fbv -g/windows/F/photos/102_4085.JPG输出如下:==17627== exp-ptrcheck, a heap, stack and global array overrun detector ==17627== NOTE: This is an Experimental-Class Valgrind Tool==17627== Copyright (C) 2003-2010, and GNU GPL'd, by OpenWorks Ltd et al. ==17627== Using Valgrind-3.7.0.SVN and LibVEX; rerun with -h for copyright info==17627== Command: ./fbv -g /windows/F/photos/102_4085.JPG==17627== Parent PID: 2448==17627====17627====17627== For counts of detected and suppressed errors, rerun with: -v ==17627== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)valgrind --tool=callgrind ./fbv -g /windows/F/photos/102_4085.JPG 同时另一个命令行下运行:callgrind_control -b输出如下:PID 17678: ./fbv -g /windows/F/photos/102_4085.JPG [requesting'Status'...]Frame: Backtrace for Thread 1[ 0] rotate (1 x)[ 1] show_image (1 x)[ 2] main (1 x)[ 3] (below main) (1 x)[ 4] 0x080495a0 (1 x)[ 5] 0x00000850程序结束后,产生文件callgrind.out.<pid>callgrind_annotate [options] callgrind.out.<pid> 产生较精简的函数summaryMassif is a heap profiler. It measures how much heap memory your program uses. This includes both the useful space,and the extra bytes allocated for book-keeping and alignment purposes. It can also measure the size of yourprogram's stack(s), although it does not do so by default.valgrind --tool=massif ./fbv -g /windows/F/photos/102_4085.JPG 生成堆使用情况的logms_print massif.out.19747 对log做些处理产生可易理解的信息--------------------------------------------------------------------------------n time(i) total(B) useful-heap(B)extra-heap(B) stacks(B)--------------------------------------------------------------------------------46 444,727,063 12,190,488 12,190,464 24 047 444,727,955 12,715,808 12,715,776 32 048 446,465,375 12,190,488 12,190,464 24 049 446,466,273 15,336,224 15,336,192 32 050 456,720,045 15,336,224 15,336,192 32 0100.00% (15,336,192B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc.->61.54% (9,437,184B) 0x8049820: show_image (in/home/zengming/workspace/fbv/fbv)| ->61.54% (9,437,184B) 0x804A87D: main (in/home/zengming/workspace/fbv/fbv)............DHAT is a tool for examining how programs use their heap allocations. valgrind --tool=exp-dhat ./fbv -g /windows/F/photos/102_4085.JPG==19813====19813== ======== SUMMARY STATISTICS ==========19813====19813== guest_insns: 456,751,347==19813====19813== max_live: 15,336,192 in 4 blocks==19813====19813== tot_alloc: 16,539,148 in 25 blocks==19813====19813== insns per allocated byte: 27==19813====19813====19813== ======== ORDERED BY decreasing "max-bytes-live": top 10 allocators ==========19813====19813== -------------------- 1 of 10 --------------------==19813== max-live: 9,437,184 in 1 blocks==19813== tot-alloc: 9,437,184 in 1 blocks (avg size 9437184.00)==19813== deaths: 1, at avg age 456,008,575 (99.83% of prog lifetime)==19813== acc-ratios: 0.25 rd, 1.00 wr (2,359,296 b-read, 9,437,184 b-written)==19813== at 0x4026BB4: malloc (vg_replace_malloc.c:236)==19813== by 0x8049821: show_image (in/home/zengming/workspace/fbv/fbv)==19813== by 0x804A87E: main (in /home/zengming/workspace/fbv/fbv) ...............英文说明:/docs/manual/manual.html=============================使用valgrind进行后台服务器的性能优化2008-04-30一. Valgrind安装说明:先从/上将安装包down下来(使用3.2.0及以上版本),然后进行安装:./configuremakemake install (as "root" if needed)二.使用valgrind进行性能瓶颈定位:1.先将服务器运行环境搭建好,确定服务器程序能正常运行及响应请求。

valgrind memcheck用法

valgrind memcheck用法

valgrind memcheck用法Valgrind是一个开源的内存调试工具,可以帮助你检测程序中的内存错误。

Memcheck是Valgrind的一个重要组件,专门用于检测程序中的内存错误,包括使用未初始化的内存、使用已经释放的内存、越过内存边界等。

以下是使用Valgrind Memcheck的一般步骤:1.安装Valgrind:首先,你需要在你的系统上安装Valgrind。

对于大多数Linux发行版,你可以通过包管理器来安装。

例如,在Ubuntu上,你可以使用以下命令来安装Valgrind:arduinosudo apt-get install valgrind2.编译程序:在使用Valgrind运行程序之前,你需要先编译程序,以便生成可执行文件。

确保在编译时开启调试信息,以便Valgrind能够获取更多的信息。

例如,使用gcc编译器时,你可以使用以下命令编译程序:gcc -g -o myprogram myprogram.c3.使用Valgrind运行程序:一旦你有了可执行文件,就可以使用Valgrind来运行程序了。

使用以下命令来运行程序:bashvalgrind --tool=memcheck myprogram这将启动Memcheck工具来检测程序中的内存错误。

如果你的程序需要接受命令行参数,你可以将它们作为Valgrind命令的参数,例如:bashvalgrind --tool=memcheck myprogram arg1 arg2 ...4.查看结果:Valgrind会输出一个详细的报告,显示程序中潜在的内存错误。

报告将列出各种类型的错误,包括使用未初始化的内存、使用已经释放的内存、越过内存边界等。

你可以根据报告中的信息来修复程序中的错误。

以上就是使用Valgrind Memcheck的一般步骤。

请注意,Memcheck可能会使程序的运行速度变慢,因此在进行性能敏感的程序时需要谨慎使用。

valgrind的使用方法-详细手册

valgrind的使用方法-详细手册

valgrind的使用Valgrind是一个GPL的软件,用于Linux(For x86, amd64 and ppc32)程序的内存调试和代码剖析。

你可以在它的环境中运行你的程序来监视内存的使用情况,比如C 语言中的malloc和free或者 C++中的new和 delete。

使用Valgrind的工具包,你可以自动的检测许多内存管理和线程的bug,避免花费太多的时间在bug寻找上,使得你的程序更加稳固。

Valgrind的主要功能Valgrind工具包包含多个工具,如Memcheck,Cachegrind,Helgrind, Callgrind,Massif。

下面分别介绍个工具的作用:Memcheck 工具主要检查下面的程序错误:∙使用未初始化的内存 (Use of uninitialised memory)∙使用已经释放了的内存(Reading/writing memory after it has been free’d) ∙使用超过 malloc分配的内存空间(Reading/writing off the end of malloc’d blocks)∙对堆栈的非法访问 (Reading/writing inappropriate areas on the stack) ∙申请的空间是否有释放 (Memory leaks –where pointers to malloc’d blocks are lost forever)∙malloc/free/new/delete申请和释放内存的匹配(Mismatched use of malloc/new/new [] vs free/delete/delete [])∙src和dst的重叠(Overlapping src and dst pointers in memcpy() and related functions)CallgrindCallgrind收集程序运行时的一些数据,函数调用关系等信息,还可以有选择地进行cache 模拟。

valgrind基本用法

valgrind基本用法

valgrind基本用法英文回答:Valgrind is a powerful tool for debugging and profiling programs. It is mainly used for memory debugging, memory leak detection, and performance profiling. Valgrind runs your program in a virtual environment and monitors all memory accesses, allowing it to detect errors and provide detailed information about memory usage.To use Valgrind, you need to first install it on your system. Once installed, you can run your program with Valgrind by using the following command:valgrind <options> <program>。

Here, `<options>` are the various options you can pass to Valgrind, such as `--leak-check` for memory leak detection or `--tool=callgrind` for performance profiling. `<program>` is the path to your program's executable.Valgrind provides a number of tools that can be usedfor different purposes. One of the most commonly used tools is Memcheck, which is the default tool and is used for memory debugging and leak detection. Memcheck can detect a wide range of memory errors, such as reading from uninitialized variables, accessing memory after it has been freed, or writing to memory that has already been freed.Here is an example of how to use Valgrind with Memcheck:valgrind --leak-check=yes ./my_program.This command will run `my_program` with Memcheckenabled and will perform memory leak checking. After the program finishes running, Valgrind will provide a detailed report of any memory errors or leaks that were detected.Another useful tool provided by Valgrind is Callgrind, which is used for performance profiling. Callgrind collects information about the program's execution, such as the number of instructions executed, cache misses, and functioncall counts. This information can be used to identify performance bottlenecks and optimize the program.Here is an example of how to use Valgrind with Callgrind:valgrind --tool=callgrind ./my_program.This command will run `my_program` with Callgrind enabled and will collect performance profiling data. After the program finishes running, Valgrind will generate a file called `callgrind.out.<pid>`, where `<pid>` is the process ID of the program. This file can be analyzed using the`kcachegrind` tool, which provides a graphical interfacefor visualizing the performance data.Valgrind is a versatile tool that can greatly aid in the debugging and profiling of programs. It is widely used in the software development industry and is considered an essential tool for any serious programmer.中文回答:Valgrind是一个强大的用于调试和性能分析程序的工具。

Linux命令高级技巧使用gdb和valgrind进行内存调试和分析

Linux命令高级技巧使用gdb和valgrind进行内存调试和分析

Linux命令高级技巧使用gdb和valgrind进行内存调试和分析在Linux系统中,gdb和valgrind是两个常用的工具,用于进行程序的内存调试和分析。

本文将介绍如何使用gdb和valgrind进行高级技巧的相关操作和使用方法。

一、gdb内存调试技巧1. 编译程序时加入调试信息在进行程序编译时,可以添加-g参数,以便在调试时获取符号表信息。

例如:```gcc -g myprogram.c -o myprogram```2. 启动gdb调试程序在终端中输入下列命令启动gdb,并加载待调试的程序:```gdb myprogram```3. 设置断点使用break命令设置断点,指定程序执行到特定位置时停下来。

例如,在第10行设置断点:```break 10```4. 运行程序输入run命令以运行程序。

程序将会在设置的断点处停下来。

可以通过step或next命令逐行执行程序。

5. 输出变量值在断点停下来时,可以使用print命令打印出变量的值。

例如:```print variable```6. 监测内存错误使用GNU debugger的功能来检查内存错误和泄漏。

使用valgrind 可以检测到许多内存相关的问题。

二、valgrind内存分析技巧1. 安装valgrind在Linux系统中,可以使用包管理工具安装valgrind。

例如,在Ubuntu系统中,可以使用以下命令安装valgrind:```sudo apt-get install valgrind```2. 运行valgrind在终端中输入以下命令来运行valgrind:```valgrind --tool=memcheck ./myprogram```其中,myprogram为待分析的程序。

3. 查找内存错误valgrind将会分析程序的内存使用情况,并输出相关的错误信息。

特别是当程序存在内存泄漏时,valgrind将会给出相应的提示。

用valgrind定位程序问题

用valgrind定位程序问题

一,用valgrind定位程序问题在排查程序问题时候,我们会经常用到gdb。

gdb确实是定位程序问题的很有用的工具。

但是很多时候我们用gdb来定位问题,会发现不好定位,花了很多时候把发生core的地方找到了,可是还是不知道为何会发生该错误-----因为常常产生core的地方是由于在core之前的错误导致的。

这时候别忘了另一个工具,那就是valgrind,根据我定位程序问题的经验,valgrind经常能给我惊喜。

所以我觉得很有必要重视该工具,因为它确实能带给我们很多便利。

我这里不具体说valgrind的原理和使用,网上有一大堆相关文档,大家感兴趣的话可以在网上找相关资料。

我这里只是具体针对我们QQ秀的情况做介绍:1:使用valgrind定位cgi、fastcgi:1)使用valgrind来定位cgi问题:有两个前提条件:A)cgi必须是可执行程序,这意味着定位fastcgi(动态库)时,需要把它编译成cgi(可执行文件)形式;B)运行cgi时,需要配置环境变量(cgi的获取客户端请求是通过环境变量来读取请求包信息的),在qzthhp 里面,对于cgi的环境变量,由qzhhtp来设置,现在我们需要单独跑cgi时,就需要我们自己配置环境变量了:设置方法:首先我们通过httpwatch获取请求包:根据请求包配置环境变量:export REQUEST_METHOD=POSTexport QUERY_STRING="parm1=1&parm2=2&…"exportHTTP_COOKIE="vid=1011255824;flv=9.0;pt2gguin=o024*******;airkey=c14101efd8 7eb……"export CONTENT_TYPE=""export CONTENT_LENGTH=""把cgi编译成可执行文件,运行:(譬如:qqshow_user_info)valgrind --log-file-exactly=allen.log --tool=memcheck --leak-check=yes ./qqshow_user_infoPS: 如果是post方式,那run后会等待输入,直接把参数拷贝过来输入就ok了,如“parm1=1&parm2=2&…”,输入完按Ctrl+D或回车键表示输入完成,程序继续run分析allen.log,定位程序问题。

valgrind的安装与使用(内含安装包)

valgrind的安装与使用(内含安装包)

技术文档技术文件名称:valgrind-3.3.1 的安装与使用研究技术文件编号:OS-20110823版本:拟制陈泽民审核共页(包括封面)修改记录目录第1章valgrind的安装 .................................................................................................................... - 4 -1.1 valgrind的介绍 ................................................................................................................... - 4 -1.2valgrind的安装 .................................................................................................................... - 4 - 第二章valgrind的使用 .................................................................................................................... - 6 -2.1valgrind的使用与示例 ........................................................................................................ - 6 -第1章valgrind的安装1.1 valgrind的介绍Valgrind是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具。

C语言技术中的调试工具推荐与使用技巧

C语言技术中的调试工具推荐与使用技巧

C语言技术中的调试工具推荐与使用技巧在C语言的开发过程中,调试是一个非常重要的环节。

通过调试,我们可以发现代码中的错误并进行修复,提高程序的稳定性和性能。

而为了更高效地进行调试工作,我们需要使用一些专门的调试工具。

本文将推荐几款常用的C语言调试工具,并分享一些使用技巧。

一、GDB调试工具GDB是GNU开源项目中的调试工具,被广泛应用于C语言的调试中。

它提供了一系列强大的功能,如断点设置、变量查看、堆栈追踪等。

使用GDB进行调试时,我们可以通过命令行界面与其进行交互,也可以使用GUI界面进行操作。

以下是几个常用的GDB命令:1. 设置断点:可以使用“break”命令在代码的某一行设置断点,当程序执行到该断点时会暂停。

例如,“break main”可以在main函数的入口处设置断点。

2. 查看变量:使用“print”命令可以查看变量的值。

例如,“print x”可以查看变量x的值。

3. 单步执行:使用“step”命令可以逐行执行代码,并进入函数内部。

例如,“step”可以进入函数的第一行。

除了这些基本命令外,GDB还提供了许多其他功能,如条件断点、内存查看等。

通过熟练掌握GDB的使用技巧,我们可以更快速地定位和解决问题。

二、Valgrind内存调试工具在C语言开发中,内存泄漏是一个常见的问题。

为了解决这个问题,我们可以使用Valgrind这个强大的内存调试工具。

Valgrind可以检测程序中的内存错误、访问越界、使用未初始化的变量等问题,并给出相应的报告。

使用Valgrind进行内存调试时,我们可以使用以下命令:1. 检测内存错误:使用“valgrind --leak-check=full ./program”命令可以检测程序中的内存错误,并给出详细的报告。

2. 检测访问越界:使用“valgrind --tool=memcheck --track-origins=yes ./program”命令可以检测程序中的访问越界问题,并追踪到具体的源头。

valgrind使用技巧

valgrind使用技巧

valgrind使用技巧1Valgrind简介Valgrind基本原理是让待检查的程序运行在它模拟的cpu上,所以能得到非常详尽的信息,但是会影响到程序的性能,速度有可能下降20倍以上,不过作为开发环境下检查和统计内存使用情况还是不错的。

它主要包含有以下几个工具:memcheck内存检查cachegrind能对cache的使用情况进行统计callgrind据说能对函数的时间花销进行统计maif测量程序使用了多少堆空间helgrind对于多线程编程时,能检测到datarace编译被检测程序的时候,最好用-g选项加上调试信息,这样Memcheck给出的错误信息将包含精确的行号。

1.1memcheckmemcheck是它所有工具中最强大最经常被使用到的工具它带的memcheck工具至少能检查出如下几种情况:1.使用没有初始化的内存2.读或者写已经被释放掉的内存3.malloc分配的内存的越界访问4.读写tack中不恰当的区域5.内存泄露,检测没有释放的通过malloc分配的内存块6.malloc/new/new[]与free/delete/delete[]不匹配的情况(咱们是单纯的C编程,这一点用不上)7.memcpy时源地址与目的地址有重叠的情形8.不正确的内存释放,如两次释放heap内的内存。

注意:memcheck并不能检查到栈内数组上下越界的情况,array[-1]也不会报错的。

2Valgrind的安装Valgrind最简单的的编译和安装方法1.先运行bzip2–dvalgrind-3.4.1.tar.bz2或bunzip2valgrind-3.4.1.tar.bz2命令解压bz2包,得到tar包,然后再运行tarz某fvalgrind-3.4.1.tar命令对tar包进行解压2.进入源码目录,运行./configure命令进行配置3.运行make进行编译4.makecheck检查编译是否成功(本步骤是可选步骤)5.makeintall安装,默认目录是/ur/local/bin(需要root权限)更详细的安装信息参考INSTALL文件3Valgrind的使用3.1被测试程序的编译编译程序的时候最好用-g选项加上调试信息,这样Memcheck给出的错误信息将包含精确的行号。

valgrind的安装与使用内含安装包

valgrind的安装与使用内含安装包

内部公开▲广东新支点技术服务有限公司技术文档技术文件名称:valgrind-3.3.1 的安装与使用研究技术文件编号:OS-20110823版本:拟制陈泽民审核共页(包括封面)- 1 -版权所有不得外传内部公开▲广东新支点技术服务有限公司修改记录- 2 -版权所有不得外传内部公开▲广东新支点技术服务有限公司目录第1章valgrind的安装.................................................................................................................... - 4 -1.1 valgrind的介绍................................................................................................................... - 4 -1.2valgrind的安装.................................................................................................................... - 4 -第二章valgrind的使用.................................................................................................................... - 6 -2.1valgrind的使用与示例........................................................................................................ - 6 -- 3 -版权所有不得外传▲内部公开广东新支点技术服务有限公司第1章valgrind的安装1.1 valgrind的介绍Valgrind是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具。

C语言中的调试技巧与工具使用

C语言中的调试技巧与工具使用

C语言中的调试技巧与工具使用C语言是一种广泛应用于软件开发和系统编程的高级编程语言。

在日常的编程工作中,我们经常会遇到无法预料的bug和错误,这时候我们就需要使用调试技巧和工具来定位和解决问题。

在本文中,我将介绍一些C语言中常用的调试技巧和工具的使用方法。

一、断点调试断点是调试代码时非常实用的工具。

通过在代码中设置断点,我们可以暂停程序的执行,查看当前变量的值,检查代码的执行路径等。

在C语言中,可以使用调试器来设置断点并进行调试。

1. 使用GDB调试器GDB是一款功能强大的开源调试器,可用于调试C和C++程序。

下面是一些常用的GDB调试命令:- "break 文件名:行号":在指定的文件和行号处设置断点。

- "run":运行程序直到遇到第一个断点。

- "next":执行下一行代码。

- "step":进入函数调用并且停在函数的第一行。

- "print 变量名":打印变量的值。

- "continue":继续执行直到下一个断点或程序结束。

2. 使用LLDB调试器LLDB是另一种流行的调试器,它支持多种编程语言,包括C语言。

以下是一些常用的LLDB调试命令:- "b 文件名:行号":在指定的文件和行号处设置断点。

- "r":运行程序直到遇到第一个断点。

- "n":执行下一行代码。

- "s":进入函数调用并且停在函数的第一行。

- "p 变量名":打印变量的值。

- "c":继续执行直到下一个断点或程序结束。

二、代码注释与输出调试代码注释和输出调试是我们在日常编程中常用的调试技巧。

通过在代码中添加注释和输出语句,我们可以更好地理解程序的执行流程,以及在某个过程中变量的值。

1. 代码注释在C语言中,可以使用 "//" 进行单行注释,使用 "/* */" 进行多行注释。

C语言中的调试技巧与工具推荐

C语言中的调试技巧与工具推荐

C语言中的调试技巧与工具推荐C语言是一种常用的编程语言,但是在编写程序时常常会遇到一些bug或者错误。

为了有效地调试程序并提高代码质量,我们需要掌握一些调试技巧和工具。

本文将介绍一些C语言中常用的调试技巧和工具,并推荐一些值得尝试的工具。

首先,我们来看一些常用的调试技巧。

在编写程序时,我们经常会遇到一些常见的错误,比如语法错误、逻辑错误和运行时错误。

为了快速地定位和修复这些错误,我们可以通过以下一些调试技巧来提高效率:1. 使用printf语句:在程序中适当地添加printf语句可以帮助我们追踪程序的执行过程,查看变量的取值情况,从而找到错误所在。

2. 单步调试:借助调试器工具,我们可以逐步执行程序并观察每一步的执行情况,帮助我们定位问题。

3. 检查内存泄漏:使用内存调试工具可以帮助我们检查程序中是否存在内存泄漏的情况,以避免程序运行时出现问题。

除了这些基本的调试技巧外,我们还可以借助一些专门的调试工具来帮助我们更高效地调试程序。

以下是一些C语言中常用的调试工具推荐:1. GDB(GNU Project Debugger):GDB是一个功能强大的调试器工具,支持多种操作系统,可以帮助我们进行程序的调试和错误定位。

通过GDB,我们可以逐步执行程序、查看变量值、设置断点等操作,是C语言程序调试的利器。

2. Valgrind:Valgrind是一个内存调试工具,可以用于检测内存泄漏、内存访问错误等问题。

通过Valgrind,我们可以快速地找出程序中存在的内存问题并及时修复。

3. AStyle:AStyle是一个代码格式化工具,可以帮助我们统一代码格式、提高代码可读性。

通过AStyle,我们可以使代码风格一致,减少因为格式问题导致的错误。

4. Clang Static Analyzer:Clang Static Analyzer是一个静态代码分析工具,可以帮助我们检测潜在的代码问题,提高代码质量。

通过Clang Static Analyzer,我们可以在编译时发现一些常见的错误,减少后期的调试工作。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1Valgrind简介Valgrind基本原理是让待检查的程序运行在它模拟的cpu上,所以能得到非常详尽的信息,但是会影响到程序的性能,速度有可能下降20倍以上,不过作为开发环境下检查和统计内存使用情况还是不错的。

由于valgrind与cpu和操作系统紧密相关,因此只能够运行在x86/Linux, AMD64/Linux and PPC32/Linux环境当中。

valgrind自带了好几个工具,功能很强大,不仅可以对内存进行检查,还能对堆、栈等内存使用情况进行统计和分析。

下载地址: /downloads/current.html它主要包含有以下几个工具:memcheck 内存检查cachegrind 能对cache的使用情况进行统计callgrind 据说能对函数的时间花销进行统计massif 测量程序使用了多少堆空间helgrind 对于多线程编程时,能检测到data race编译被检测程序的时候,最好用-g选项加上调试信息,这样Memcheck给出的错误信息将包含精确的行号。

1.1memcheckmemcheck是它所有工具中最强大最经常被使用到的工具它带的memcheck工具至少能检查出如下几种情况:1.使用没有初始化的内存2.读或者写已经被释放掉的内存3.malloc分配的内存的越界访问4.读写stack中不恰当的区域5.内存泄露,检测没有释放的通过malloc分配的内存块6.malloc/new/new[] 与free/delete/delete[] 不匹配的情况(咱们是单纯的C编程,这一点用不上)7.memcpy时源地址与目的地址有重叠的情形8.不正确的内存释放,如两次释放heap内的内存。

注意:memcheck并不能检查到栈内数组上下越界的情况,array[-1]也不会报错的。

2Valgrind的安装Valgrind最简单的的编译和安装方法1.先运行bzip2 –d valgrind-3.4.1.tar.bz2 或bunzip2 valgrind-3.4.1.tar.bz2 命令解压bz2包,得到tar包,然后再运行tar zxf valgrind-3.4.1.tar 命令对tar包进行解压2.进入源码目录,运行./configure 命令进行配置3.运行make 进行编译4.make check 检查编译是否成功(本步骤是可选步骤)5.make install 安装,默认目录是/usr/local/bin(需要root权限)更详细的安装信息参考INSTALL文件3Valgrind的使用3.1被测试程序的编译编译程序的时候最好用-g选项加上调试信息,这样Memcheck给出的错误信息将包含精确的行号。

如果你使用的是C++语言,最将考虑将-fno-inline加入进来。

这将能够清晰地看到函数调用链,在调试大的C++程序时,这样有助于减少迷惑。

3.2Valgrind coreValgrind的命令行格式: valgrind [valgrind-options] your-prog [your-prog-options]注意: 在这里必须运行真正的机器码,而不是shell脚本。

在valgrind中直接运行这些脚本将对/bin/shell或其它你正在使用的解释器进行检测。

虽然可以使用--trace-children=yes 选项对子进程进行检测,但是仍然会有其它令人迷惑的信息。

默认情况下,valgrind工具只产生必要的信息,如果要产生详细的信息,可以使用-v 选项。

3.2.1基本的运行参数选择要运行的工具--tool=<name> [default=memcheck]运行名为name的Valgr ind工具,如memcheck, cachegrind等。

valgrind 默认使用Memcheck 工具,注意:工具的名字都是小写.打印帮助信息: -h打印详细的检测信息: -v是否对子进程进行跟踪: --trace-children=<yes|no> [default: no]跟踪打开的fd信息, 包括socket: --track-fds=<yes|no> [default: no]--log-file=<filename> 将所以的信息保存到指定的文件当中, 控制台中没有输出。

--num-callers=<number> [default: 12]默认情况下,valgrind最多显示12层函数调用的名字来帮助使用者识别程序的位置,最多能够设置到50层。

--db-attach=<yes|no> [default: no]当设置该功能时,如果发生错误,将会打印是否attach到gdb,提示如下:---- Attach to debugger ? --- [Return/N/n/Y/y/C/c] ----输入回车、N或n,将不会针对这个erro启动gdb,输入Y或y,将启动gdb。

当结束调试后,从gdb退出,程序将继续运行。

输入C或c,将不会启动gdb,以后对这个错误也将不会再打印上面的提示。

当debug调试结束后,退出debug,程序将继续运行。

在GDB中通过”continue”命令继续执行程序是不会成功的。

--max-stackframe=<number> [default: 2000000]Stack frame的最大尺寸。

当栈指针移动超过这个数,valgrind将会认为程序已经切换到另一个栈当中。

当你的程序中有大的在栈中分配的数组(临时数组),那么有可能需要使用这个选项。

3.3Memcheck相关的命令行参数--leak-check=<no|summary|yes|full> [default: summary]当客户程序结束后,对内存泄露进行检查。

内存泄露是指一个分配的块没有被释放,但是没有指针再指向它。

如果设置成summary,它只告诉内存如何泄露了。

如果设置成full或者yes,它将报告每个泄露的详细信息。

--undef-value-errors=<yes|no> [default: yes]是否报告使用未定义值的错误,即访问那些没有初始化的变量的错误。

--track-origins=<yes|no> [default: no]是否跟踪未初始化的值来自哪里。

默认是关闭的,这就意味着它虽然能告诉你使用一种危险的方式访问未初始化的变量,但是不能告诉你未初始化的变量来自哪里。

当设置成yes,memcheck将会努力将未初始化的变量的位置告诉你。

可能来自以下四个位置:heap bloack, 栈中分配的,客户端请求的(?),或者其他方式(如调用brk等)。

--show-reachable=<yes|no> [default: no]当disabled时,内存泄露检测只显示那些没有指针指向的块或只能找到一个指向其中间位置的指针的块。

内存泄露的主要发生在这些块上。

当enabled时,泄露检测也会报告那些能找到一个指针指向的块。

你的程序至少在理论上在退出前能释放这些块。

与没有指针指向的块或那些只有一个内部指针指向的块相比: 它们(可能指没有指针指向的块或那些只有一个内部指针指向的块)更有可能会内存泄漏,因为你事实上没有一个指向块的起始位置的指针,即使你想释放,也没有进行释放的指针。

--partial-loads-ok=<yes|no> [default: no]控制memcheck如何处理从可寻址或者不可寻址的地址处载入word-sized, word-aligned的数据。

即在32位系统中,在非四字节对齐的地址处载入一个4字节对齐的数据(如整数),通常在这种情况下,系统将产生bus error。

当设置成yes,这样的载入不会产生一个地址错误,而是从不合法的地址处载入bytes,并将它们标记为未初始化;那些从合法地址处载入的数据以正常的方式处理。

当设置成no,从artially invalid的地址载入数据被认为与从完全无效的地址载入数据一样。

产生一个无效地址错误,相应的字节被标记为未初始化。

注意: 代码的这种行为有违与ISO C/C++标准。

如果有可能,应该对这样的代码进行修改。

这个标记只能作为最后的方法使用。

--malloc-fill=<hexnumber>将通过malloc,new等但是calloc除外的API分配的block用指定的字节进行填充。

当对一些比较晦涩的问题进行定位时,也许会有用。

分配的区域Memcheck仍然认为是未初始化的,这个flag只影响block的内容。

--free-fill=<hexnumber>将通过free,delete释放的block用指定的字节进行填充。

当对一些比较晦涩的问题进行定位时,也许会有用。

这些释放的内容Memcheck仍然认为是不能够访问的,这个flag只影响block的内容。

如果适当的设置了--leak-check,对于每一个剩余block,Memcheck扫描整个进程的地址空间,搜寻指向这些块的指针。

每个块位于如下三种类型之一:• Still reachable:能够找到一个指向block起始位置的指针。

至少在理论上讲,在程序退出前,能够释放它。

Memcheck将不会报告这样的blocks,除非设置了-show-reachable=yes。

• Possibly lost, or "dubious":只能找到指向block中间位置的指针。

这个指针有可能原来指向起始位置,并进行了偏移操作,或者它已完全无关。

Memcheck将这样的块认为是"dubious",因为不清楚是否仍然有指针指向它。

• Definitely lost, or "leaked":最坏的结果是没有指针指向这些block。

这些block被认为是泄露了。

间接泄露是指被另一个泄露的block指向的block。

Memcheck搜索指针的精确内存区域: Memcheck记录下的所有能访问且已经初始化的所有按机器字自然对齐的内存。

3.3.1比较完整的跟踪内存泄露的命令从上可以看出比较完整的跟踪内存泄露的命令行是:valgrind --tool=memcheck --leak-check=full--show-reachable=yes --track-origins=yes prog_name prog_param注意: prog_name尽量不要采用shell脚本3.4显示参数的说明==19543== Source and destination overlap in strcpy(0xBEFFD1F0, 0xBEFFD1F0)==19543== at 0x401DD8B: strcpy (mc_replace_strmem.c:268)==19543== 是进程号, 第一行是错误描述信息,接下来几行是错误发生的位置。

相关文档
最新文档