linux使用valgrind 工具检查内存泄露
Valgrind是一款非常强大的工具集合,它包含有包括内存检测、CPU监测等多种工具,其中最常用的是内存检测功能,它能监测出以下的各种内存错误:
1. 访问非法内存区域
2. 使用未被初始化的内存区域
3. 非法释放内存,比如多次free一个内存
4. 内存泄露
使用步骤:
1. 使用valgrind前需要使用-g参数编译源程序以便生成debug信息
2. 在运行程序的命令行前加上valgrind,例如:valgrind myprog argvlist
为了能够给出内存检测报告,需要加上--leak-check参数,那么上述命令就变成:valgrind --leak-check=yes myprog argvlist
这个时候程序运行会非常慢,消耗资源也会大幅增加,这是正常的,不必担心。因为valgrind需要收集内存错误和泄露的详细信息。这被有些人认为是valgrind的缺点,但是对于一个大项目来说,这一点时间的消耗来监测程序的稳定性是值得的。
3. 阅读valgrind给出的报告
valgrind的其它参数:
--num-callers=N:指定报告中调用栈的层数,这在定位和跟踪错误的时候会比较有用
-v :可以打印出更加详细的信息
valgrind的报告:
"Invalid write/read...":这一般是访问非法的内存区域,比如数组越界等
"Conditional jump or move depends on uninitialised value(s)":使用了未初始化的变量(包括未初始化的局部变量和未初始化的堆区域)
"Mismatched free() / delete / delete []":这一般是非法释法内存的错误,比如多次free一个内存
"LEAK SUMMARY":这表示下面是内存泄露的信息(造成内存丢失的程序行可以通过查看这一行前面的清单来定位)
"definitely lost":肯定丢失的部分,这种报告必须处理
"possibly lost":可能丢失的部分,这是由于C/C++语言指针处理的特点造成的,这部分可能不太准确
这里只有一个简单的介绍,更多详细信息参见valgrind的官方网站:
http://valgrind.org/docs/manual/ Valgrind 是在linux系统下开发应用程序时用于调试内存问题的工具。它尤其擅长发现内存管理的问题,它可以检查程序运行时的内存泄漏问题。
它的官方网址是 http://www.valgrind.org/
下载最新版本的Valgrind,目前是3.2.0。 wget http://www.valgrind.org/downloads/valkyrie-1.2.0.tar.bz2
执行常规的安装步骤:./confgure && make && make install。注意: 系统必须安装QT的开发包。即便这样在make 时还是出现qplatformdefs.h这个文件找不到的情况,导致make失败。查找系统中的qplatformdefs.h 之后,发现没有存在于qt的标准头文件目录/usr/lib/qt-3.3/include。如是将/usr/lib/qt- 3.3/mkspecs/linux-g++/ 目录下该头文件复制标准头文件目录,重新make ,后面一切OK。
初次使用
编译如下代码: gcc -Wall example.c -g -o example
#include <stdlib.h>
void f(void) { int* x = malloc(10 * sizeof(int)); x[10] = 0; // problem 1: heap block overrun } // problem 2: memory leak -- x not freed
int main(void) { f(); return 0; }
|
注意:gcc 的-g 选项让Valgrind调试输出时指出相应信息的代码所在的行号。
valgrind --tool=memcheck --leak-check=yes./example |
==6742== Memcheck, a memory error detector for x86-linux. ==6742== Copyright (C) 2002-2004, and GNU GPL'd, by Julian Seward et al. ==6742== Using valgrind-2.2.0, a program supervision framework for x86-linux. ==6742== Copyright (C) 2000-2004, and GNU GPL'd, by Julian Seward et al. ==6742== For more details, rerun with: -v ==6742== ==6742== Invalid write of size 4 ==6742== at 0x8048384: f (example.c:6) ==6742== by 0x80483AC: main (example.c:12) ==6742== Address 0x1B908050 is 0 bytes after a block of size 40 alloc'd ==6742== at 0x1B904984: malloc (vg_replace_malloc.c:131) ==6742== by 0x8048377: f (example.c:5) ==6742== by 0x80483AC: main (example.c:12) ==6742== ==6742== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 1) ==6742== malloc/free: in use at exit: 40 bytes in 1 blocks. ==6742== malloc/free: 1 allocs, 0 frees, 40 bytes allocated. ==6742== For counts of detected errors, rerun with: -v ==6742== searching for pointers to 1 not-freed blocks. ==6742== checked 1360800 bytes. ==6742== ==6742== ==6742== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1 ==6742== at 0x1B904984: malloc (vg_replace_malloc.c:131) ==6742== by 0x8048377: f (example.c:5) ==6742== by 0x80483AC: main (example.c:12) ==6742== ==6742== LEAK SUMMARY: ==6742== definitely lost: 40 bytes in 1 blocks. ==6742== possibly lost: 0 bytes in 0 blocks. ==6742== still reachable: 0 bytes in 0 blocks. ==6742== suppressed: 0 bytes in 0 blocks. ==6742== Reachable blocks (those to which a pointer was found) are not shown. ==6742== To see them, rerun with: --show-reachable=yes |
上面的C程序存在两个错误:1. 数组下标越界;2. 分配的内存没有释放,存在内存泄露的问题。对于错误1,看Valgrind的调试信息片断
==6742== Invalid write of size 4 ==6742== at 0x8048384: f (example.c:6) ==6742== by 0x80483AC: main (example.c:12) ==6742== Address 0x1B908050 is 0 bytes after a block of size 40 alloc'd ==6742== at 0x1B904984: malloc (vg_replace_malloc.c:131) ==6742== by 0x8048377: f (example.c:5) |
对于错误2,看这个
==6742== malloc/free: 1 allocs, 0 frees, 40 bytes allocated.
......
==6742== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1 ==6742== at 0x1B904984: malloc (vg_replace_malloc.c:131) ==6742== by 0x8048377: f (example.c:5) ==6742== by 0x80483AC: main (example.c:12)
|
相关链接:
http://www.valgrind.org/docs/manual/quick-start.html
http://www-128.ibm.com/developerworks/cn/linux/l-pow-debug/
分享到:
相关推荐
基于STM32F103C8T6在Keil调试内存中的程序参考源码,同一个测试程序在Flash上运行时调试和在RAM中运行调试。
node-memory-leak-tutorial, 在节点中,调试内存泄漏的教程 调试 node.js 中的内存泄漏这是在 node.js. 中调试内存泄漏的快速教程步骤 1: 安装调试工具首先,你需要安装 v8-profiler 模块。 如果不需要在应用程序中...
为了有效地识别和解决内存泄漏问题,iOS开发者可以利用Xcode自带的工具进行分析和调试。以下是两种查看和调试iOS内存泄漏的方法: 一、利用Xcode查看内存泄漏 Xcode提供了一个静态分析工具,可以在代码编译阶段...
帮助解决龙芯内存参数调试过程中遇到的各种问题,比如;PMON 在263Mhz的频率下能较稳定跑过去,过400 就会直接hang在copy PMON to memory。 S1 SPD 参数的设置 各种内存宏定义 调试模式 调试等等。。
#cd efence_2_4_16 #make //即产生libefence.so.0.0动态库 electric-fence程序一越界立即coredump,然后启动cgdb调试 调试openssl非常好用
只是关于 c 内存调试 的资料 是IBM 内部资料
GDB(GNU Debugger)是一个强大的调试工具,能够帮助开发者在C/C++等语言的程序中查找和定位内存泄露的问题。下面将详细介绍如何使用GDB来查找和分析内存泄露。 首先,内存泄露通常发生在动态分配的内存没有被正确...
在嵌入式应用开发中,经常只能通过串口打印来调试软件,在软件出现内存泄露的问题时,比较难定位问题的位置,本文档提供了一种定位内存泄露的方法
总之,"查看网页内存,代码调试小插件"是一个强大的开发辅助工具,它使得在IE这样的环境中查看和调试内存问题变得可能,对于提升Web应用的性能和稳定性具有重要意义。通过熟练掌握和运用这类工具,开发者可以更有效...
在调试内存管理时,Unity提供了一些内置工具,如Profiler,它可以帮助开发者追踪内存使用情况、CPU负载和GPU活动。通过Profiler,我们可以查看哪个对象或者哪个Assetbundle占用了大量内存,进而优化加载策略。此外,...
在调试环境下,通常会有调试版本的函数,如malloc_dbg,提供更详细的内存分配信息,帮助调试内存泄漏等问题。 再者,Win32的虚拟内存分配函数是内存管理的底层接口。VirtualAlloc用于分配虚拟内存,以页为最小单位...
多线程编程是现代软件开发中常见的技术之一,但其复杂性使得定位和调试内存问题,尤其是内存越界问题,变得异常困难。内存调试器,如Valgrind、Electric Fence和mprotect等工具,被广泛应用于内存问题的诊断和定位。...
你可以从简单的程序开始,逐步尝试更复杂的调试任务,例如,调试内存泄漏问题、分析系统崩溃dump文件,或者研究驱动程序的行为。 在实际应用中,HTML调试标签暗示了WinDbg也可以与Web开发相关的问题结合。例如,...
GDB调试器可以连接到目标设备,查看和控制任务的执行,设置断点,检查变量值,以及调试内存问题。JTAG接口则提供硬件级别的调试支持,允许直接访问CPU寄存器和内存。 在实际开发中,使用ucOS 的开发者通常会经历...
总的来说,Visual Leak Detector是一款强大的内存管理工具,能够极大地提高C++程序员调试内存泄露问题的效率。通过集成到Visual Studio环境中,它简化了内存泄露检测的过程,使得开发者能够更加专注于代码的优化和...
7. **内存调试**:理解内存管理,包括动态分配、释放以及内存对齐,是调试内存相关问题的关键。工具如LeakSanitizer可以帮助检测内存泄漏。 8. **调试优化代码**:虽然优化可以提高性能,但可能导致调试困难。了解...
"内存调试技巧:C 语言最大难点揭秘.pdf"可能提供了关于如何使用GDB等调试器,或者通过静态分析工具来查找内存错误的实用技巧。此外,"Valgrind.pdf"很可能介绍了一个强大的内存错误检测工具Valgrind,它可以检测内存...
此外,TD调试器还支持查看和修改内存,这对于调试内存相关的问题非常有用。比如,如果程序在运行过程中出现了内存溢出或数据错误,用户可以直接查看内存区域,找到问题的根源,甚至可以现场修改内存值来测试不同的...