• 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的胖子
  • 相关阅读:
    [Android Pro] 超能RecyclerView组件使用
    [Android Pro] UI设计师不可不知的安卓屏幕知识
    [Android Pro] Android Support 包里究竟有什么
    [Android Pro] fragment中嵌套viewpager,vierpager中有多个fragment,不显示
    [Android Pro] 横竖屏切换时,禁止activity重新创建,android:configChanges="keyboardHidden|orientation" 不起作用
    [Android Pro] sqlite数据库的char,varchar,text,nchar,nvarchar,ntext的区别
    [Android Pro] AndroidStudio导出jar包
    [Java] Java 打包成jar包 和 解压jar包
    [Android Pro] 通过IMSI判断手机是移动、联通、电信
    [MACOS] Mac上的抓包工具Charles
  • 原文地址:https://www.cnblogs.com/codestack/p/10855687.html
Copyright © 2020-2023  润新知