zoukankan      html  css  js  c++  java
  • 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的胖子
  • 相关阅读:
    How to install VXDIAG Honda, Toyota and JLR SDD software
    16% off MPPS V16 ECU tuning tool for EDC15 EDC16 EDC17
    Cummins INSITE locked and ask for verification code
    How to use BMW Multi Tool 7.3 to replace lost key for BMW X1
    Bleed Brake Master Cylinder with Intelligent Tester IT2
    Porsche Piwis Tester II “No VCI has been detected”,how to do?
    Creader VIII VS. Creader VII+
    How to solve GM MDI cannot complete the installation
    汽车OBD2诊断程序开发 (原文转载,思路很清晰!)
    汽车节温器单片机开发思路
  • 原文地址:https://www.cnblogs.com/codestack/p/10855687.html
Copyright © 2011-2022 走看看