linux 内存泄露 valgrind && gdb

内泄漏工具 valgrind:

https://linux.die.net/man/1/valgrind

www.valgrind.org/docs/manual/index.html

www.valgrind.org/docs/manual/faq.html

https://www.ibm.com/developerworks/cn/linux/l-cn-valgrind/index.html

3、nohup valgrind --track-fds=yes --leak-check=full --error-limit=no --log-file=file_res.val  process_file_res  1>file_res.std 2>&1 &

4、对于踩一个固定地址,我们可以使用gdb的watch,来观看谁踩了这个地址。前提需要关闭进程地址空间随机化。

目前randomize_va_space的值有三种,分别是[0,1,2]

0 - 表示关闭进程地址空间随机化。
1 - 表示将mmap的基址,stack和vdso页面随机化。
2 - 表示在1的基础上增加栈(heap)的随机化。
echo 0 >/proc/sys/kernel/randomize_va_space

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)


Valgrind不检查静态分配数组的使用情况。(数组越界 无法检测出来 即使是在栈空间里面)

全局变量属于静态存储,它们是在编译时就被分配了存储空间 检测不出来

Valgrind占用了更多的内存--可达两倍于你程序的正常使用量。如果你用Valgrind来检测使用大量内存的程序就会遇到问题,它可能会用很长的 时间来运行测试

要启用kmemleak,前提是内核编译时在“Kernel hacking”中开启了 CONFIG_DEBUG_KMEMLEAK 选项。怎样知道一个运行系统的内核是否支持kmemleak呢?可以查看 /boot/config-$(uname -r) 配置文件中 CONFIG_DEBUG_KMEMLEAK 是否等于”y”。以RHEL6为例,它的debug kernel是支持kmemleak的,我们看它的config文件:
CONFIG_DEBUG_KMEMLEAK /boot/config-2.6.32-642.4.2.el6.x86_64.debug
CONFIG_DEBUG_KMEMLEAK=y
CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE=20000
CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=n

kmemleak的用户接口是:
/sys/kernel/debug/kmemleak
发送指令和输出信息都是通过以上文件进行的。要访问这个文件,必须先挂载以下文件系统:
# mount -t debugfs nodev /sys/kernel/debug/

扫描发现memory leak:
echo scan > /sys/kernel/debug/kmemleak 查看扫描到的leak对象:
cat /sys/kernel/debug/kmemleak 清除扫描到的泄露对象:
echo clear > /sys/kernel/debug/kmemleak

目前还有malloc_hook tcmalloc 以及 gcc libasan.so

比如当前版本有改动 ,和之前的版本对比, 看代码改动之处。

再或者是用valgrind 时 出现了内存分配了, 但是退出时,会释放掉。比如mac地址表,每次mac 地址表删除时, 会分配内存记录, 但是进程统计后,没有释放。但是 使用内存越来越多。

感觉就是内存泄露,但是跑valgrind时, 由于会统一释放,最后认为跑不出来。

gdb 可以参考:https://sourceware.org/gdb/onlinedocs/gdb/Machine-Code.html

 https://wizardforcel.gitbooks.io/100-gdb-tips/content/disassemble-raw-machine-code.html

http代理服务器(3-4-7层代理)-网络事件库公共组件、内核kernel驱动 摄像头驱动 tcpip网络协议栈、netfilter、bridge 好像看过!!!! 但行好事 莫问前程 --身高体重180的胖子
原文地址:https://www.cnblogs.com/codestack/p/10855687.html