小城市做网站,随州网站建设便宜,建设银行杭州纪念币预约网站,贵州最新消息今天1、Valgrind 简介 Valgrind是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具#xff0c;它可在以下平台上运行#xff1a; X86/Linux、AMD64/Linux、ARM/Linux、ARM64/Linux、PPC32/Linux、PPC64/Linux、PPC64LE/Linu x、S390X/Linux、MIPS32/Linux、MIPS64/Li… 1、Valgrind 简介 Valgrind是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具它可在以下平台上运行 X86/Linux、AMD64/Linux、ARM/Linux、ARM64/Linux、PPC32/Linux、PPC64/Linux、PPC64LE/Linu x、S390X/Linux、MIPS32/Linux、MIPS64/Linux、X86/Solaris , AMD64/Solaris, ARM/Android (2.3.x 及 更 高 版 本 ), ARM64/Android, X86/Android (4.0 及 更 高 版 本 ), MIPS32/Android, X86/FreeBSD, AMD64/FreeBSD, X86/Darwin 和 AMD64/Darwin (Mac OS X 10.12 2、Valgrind 安装 下载地址https://valgrind.org/downloads/current.html#current 解压后进入文件夹执行 ./configure --prefix${install_path} make -j16 make insatll 3、Valgrind 包含的工具 Memcheck 探测程序中内存管理存在的问题。它检查所有对内存的读/写操作并截取所有的malloc/new/free/delete 调用。因此 memcheck 工具能够探测到以下问题 使用未初始化的内存读/写已经被释放的内存读/写内存越界读/写不恰当的内存栈空间内存泄漏使用 malloc/new/new[] 和 free/delete/delete[] 不匹配。src 和 dst 的重叠 cachegrind cachegrind 是一个 cache 剖析器。它模拟执行 CPU 中的 L1, D1 和 L2 cache因此它能很精确的指出代码中的 cache 未命中。如果你需要它可以打印出 cache 未命中的次数内存引用和发生 cache 未命中的每一行代码每一个函数每一个模块和整个程序的摘要。如果你要求更细致的信息它可以打印出每一行机器码的未命中次 数。在 x86 和 amd64 上cachegrind 通过 CPUID 自动探测机器的 cache 配置所以在多数情况下它不再需要更多的配置信息了。 helgrind 它主要用来检查多线程程序中出现的竞争问题。Helgrind 寻找内存中被多个线程访问而又没有一贯加锁的区域这些区域往往是线程之间失去同步的地方而且会导 致难以发掘的错误。Helgrind 实现了名为”Eraser” 的竞争检测算法并做了进一步改进减少了报告错误的次数。 Callgrind Callgrind 收集程序运行时的一些数据函数调用关系等信息还可以有选择地进行cache 模拟。在运行结束时它会把分析数据写入一个文件。 callgrind_annotate 可以把这个文件的内容转化成可读的形式。 一般用法: valgrind --toolcallgrind ./sec_infod callgrind_annotate --autoyes callgrind.out.[pid] log vi log Massif 堆栈分析器它能测量程序在堆栈中使用了多少内存告诉我们堆块堆管理块和栈 的大小。Massif 能帮助我们减少内存的使用在带有虚拟内存的现代系统中它还能够加速我们程序的运行减少程序停留在交换区中的几率。 lackey lackey 是一个示例程序以其为模版可以创建你自己的工具。在程序结束后它打印出一些基本的关于程序执行统计数据。 4、Valgrind 参数 valgrind [options] prog-and-args [options] 常用选项 --toolname 最常用的选项。运行 valgrind 中名为 toolname 的工具。默认memcheck。 -q --quiet 安静地运行只打印错误信息。 --verbose 更详细的信息。 --trace-childrenyes|no 跟踪子线程? [default: no] --track-fdsyes|no 跟踪打开的文件描述 [default: no] --time-stampyes|no 增加时间戳到 LOG 信息? [default: no] --log-fdnumber 输出 LOG 到描述符文件 [2stderr] --log-filefile 将输出的信息写入到 filename.PID 的文件里PID 是运行程序的进行 ID --log-file-exactlyfile 输出 LOG 信息到 file,LOG 信息输出 --xmlyes 将信息以 xml 格式输出只有 memcheck 可用 --db- commandcommand 启动调试器的命令行选项[gdb -nw %f %p] -leak- checkno|summary|full 要求对 leak 给出详细信息? Leak 是指存在一块没有被引用的内存空间或没有被释放的内存空间如 summary只反馈一些总结信息告诉你有多少个 malloc多少个 free 等如果是 full 将输出所有的 leaks也就是定位到某一个 malloc/free只有 memcheck 可用。 --show- reachableyes|no 如果为 no只输出没有引用的内存 leaks或指向 malloc 返回的内存块中部某处的 leaks [default: no]只有 memcheck 可用。 更详细的参数指令见 https://phenix3443.github.io/notebook/software-engineering/debug/valgrind- practices.html#org9b75b1d 5、Valgrind 使用 编译程序时开启-g选项如果没有调试信息Valgrind无法定位异常代码位置。如果待调试的是C程序考虑去掉函数内联调用开启-fno-inline这样可以更简单的查看 函数调用堆栈。或者使用Valgrind选项–read-inline-info yes可以读取内联函数的调试信 息这样即便程序使用了内联函数也能正确的显示调用堆栈信息。 关闭编译优化-O。在O1以上的优化级别下memcheck工具会误报一些未初始化值的错 误。 使用-Wall编译代码他能识别Valgrind在较高优化级别上可能会遗漏的部分。如果程序是通过脚本启动的可以修改脚本里启动程序的代码或者使用 --trace- childrenyes 选项来运行脚本。 常用内存检测命令 valgrind --log-file./valgrind_report.log --leak-checkfull --show-leak-kindsall --show- reachableno --track-originsyes ./main 输出检测报告如图 左边显示类似行号的数字10297表示的是 Process ID。中间表示 valgrind 通过运行被测试程序发现的内存问题。通过阅读这些信息可以发现 这是一个对内存的非法读操作非法写操作的内存是 8 bytes。发生错误时的函数堆栈以及具体的源代码行号。非法读操作的具体地址空间。 valgrind输出结果会报告5种内存泄露definitely lost, indirectly lost, possibly lost, still reachable, and suppressed。这五种内存泄露分析如下 definitely lost 确认丢失程序中存在内存泄露应尽快修复。 当程序结束时如果一块动态分配的内存没有被释放且通过程序内的指针变量均无法 访问这块内存则会报这个错误。 indirectly lost 间接丢失。当使用了含有指针成员的类或结构时可能会报这个错误。这类错误无需直接修复他们总是与definitely lost一起出现只要修复definitely lost即可 possibly lost 可能丢失。大多数情况下应视为与definitely lost一样需要尽快修复除非你的程序让一个指针指向一块动态分配的内存但不是这块内存起始地址然后通过运 算得到这块内存起始地址再释放它。 当程序结束时如果一块动态分配的内存没有被释放且通过程序内的指针变量均无法 访问这块内存的起始地址但可以访问其中的某一部分数据则会报这个错误。 still reachable 可以访问未丢失但也未释放。如果程序是正常结束的那么它可能不会造成程序崩溃但长时间运行有可能耗尽系统资源因此笔者建议修复它。如果程序是崩溃 如访问非法的地址而崩溃而非正常结束的则应当暂时忽略它先修复导致程序崩溃的错误然后重新检测。 suppressed 已被解决。出现了内存泄露但系统自动处理了。