嵌入式linux怎么检内存泄漏雨

嵌入式linux怎么检内存泄漏雨,第1张

1. 在需要内存泄漏检查的代码的开始调用void mtrace(void) (在mcheck.h中? 有声明). mtrace为malloc等函数安装hook, 用于记录内存分配信息.在需要内存泄漏检查的代码的结束调用void muntrace(void).\x0d\x0a注意: 一般情况下不要调用muntrace, 而让程序自然结束. 因为可能有些释放内存代码要到muntrace之后才运行.\x0d\x0a\x0d\x0a2. 用debug模式编译被检查代码(-g或-ggdb)\x0d\x0a\x0d\x0a3. 设置环境变量MALLOC_TRACE为一文件名, 这一文件将存有内存分配信息.\x0d\x0a\x0d\x0a4. 运行被检查程序, 直至结束或muntrace被调用.\x0d\x0a\x0d\x0a5. 用mtrace命令解析内存分配Log文件($MALLOC_TRACE)\x0d\x0a(mtrace foo $MALLOC_TRACE, where foo is the executible name)\x0d\x0a如果有内存泄漏, mtrace会输出分配泄漏\x0d\x0a内存的代码位置,以及分配数量.\x0d\x0a\x0d\x0a附加说明\x0d\x0a1. 可以将mtrace, muntrace放入信号处理函数(USR1, USR2), 以动态地进行内存泄漏检查控制.\x0d\x0a2. mtrace是个perl代码, 如果你对符号地址与代码文本的转换感兴趣, 可以读一下.\x0d\x0a3. again, 尽量不要用muntrace()\x0d\x0aFor C++ Leak:\x0d\x0a检查内存泄漏的方法除glibc提供外;还可以试试一些专用的程序。\x0d\x0a很奇怪,redhat 9 居然不带mtrace perl脚本,只好下载gcc源码编译了\x0d\x0awget --passive-ftp ftp://rpmfind.net/linux/redhat/9 ... -2.3.2-11.9.src.rpm\x0d\x0arpm -ivh glibc*.src.rpm\x0d\x0acd /usr/src/redhat/SPECS/\x0d\x0arpmbuild -ba glibc-9.spec\x0d\x0acd /var/tmp/glibc-2.3.2-root/usr/bin/\x0d\x0acp mtrace /usr/bin/\x0d\x0a调试方法如下:\x0d\x0avi a.c\x0d\x0a1 #include\x0d\x0a2\x0d\x0a3 int main()\x0d\x0a4 {\x0d\x0a5 mtrace()\x0d\x0a6 malloc(10)\x0d\x0a7 malloc(16)\x0d\x0a8 return 0\x0d\x0a9 }\x0d\x0a$gcc -g a.c #记得编译带-g调试选项\x0d\x0a$export MALLOC_TRACE=a.log\x0d\x0a$./a.out\x0d\x0a$unset MALLOC_TRACE #记得执行完后unset变量,否则可能运行其他命令可能覆盖log\x0d\x0a$mtrace a.out a.log\x0d\x0aMemory not freed:\x0d\x0a-----------------\x0d\x0aAddress Size Caller\x0d\x0a0x09b08378 0xa at /XXX/a.c:6\x0d\x0a0x09b08388 0x10 at /XXX/a.c:7\x0d\x0a可以看到,会显示未释放动态空间的代码具体位置。

经常碰到系统跑着跑着一段时间内存满了,出现内存泄漏的问题,系统软件太庞大,这类问题又不好直接从源码中分析,所以需要借助工具来分析了,kmemleak就是这样的一个工具。

在Kernel hacking中打开CONFIG_DEBUG_KMEMLEAK =y即使能了kmemleak,其实就是开了一个内核线程,该内核线程每10分钟(默认值)扫描内存,并打印发现新的未引用的对象的数量。kmemleak的原理其实就是通过kmalloc、vmalloc、kmem_cache_alloc等内存的分配,跟踪其指针,连同其他的分配大小和堆栈跟踪信息,存储在PRIO搜索树。如果存在相应的释放函数调用跟踪和指针,就会从kmemleak数据结构中移除。下面我们看看具体的用法。

查看内核打印信息详细过程如下:

1、挂载debugfs文件系统

   mount -t debugfs nodev /sys/kernel/debug/

2、开启内核自动检测线程

   echo scan > /sys/kernel/debug/kmemleak

3、查看打印信息

   cat /sys/kernel/debug/kmemleak

4、清除内核检测报告,新的内存泄露报告将重新写入/sys/kernel/debug/kmemleak

   echo clear > /sys/kernel/debug/kmemleak

内存扫描参数可以进行修改通过向/sys/kernel/debug/kmemleak 文件写入。 参数使用如下:

  off 禁用kmemleak(不可逆)

  stack=on 启用任务堆栈扫描(default)

  stack=off 禁用任务堆栈扫描

  scan=on 启动自动记忆扫描线程(default)

  scan=off 停止自动记忆扫描线程

  scan=<secs>设置n秒内自动记忆扫描,默认600s

  scan 开启内核扫描

  clear 清除内存泄露报告

  dump=<addr>转存信息对象在<addr>

通过“kmemleak = off”,也可以在启动时禁用Kmemleak在内核命令行。在初始化kmemleak之前,内存的分配或释放这些动作被存储在一个前期日志缓冲区。这个缓冲区的大小通过配CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE设置。

在Linux环境,使用jmeter压测会遇到很多问题,比如:配置不对,权限不足这些都是很好解决。 但是遇到这几个问题: 1.内存泄漏   2.端口不够 遇到两个问题网上解决办法都很杂 ,没有一个清晰明了的解决办法,所以针对这两个问题,写出解决办法: 例如: 屏蔽“聚合报告”“查看结果数”,等插件脚本尽量最小变量 ,多个线程组下CSV文件设置,如果 只在当前线程组 使用变量,尽量不使用“全部现场”。 bin/下的jmeter文件(非jmeter.sh)编辑:(Windows环境编辑jmeter.bat) JVM_ARGS="-Xms4g -Xmx4g" 还有另一个方法:启动加参数设置:JVM_ARGS="-Xms2048m -Xmx2048m" jmeter -t test.jmx (上面调整内存格式可以1g 2g,也可以1024m 2048m,这样写都可以)Response code: Non HTTP response code: java.net.BindException Response message: Non HTTP response message: Address already in use: connect Linux本来的默认的端口欧范围:1024-65535,64511个,所以当压测接口调用超过65535个就会出现端口不够的问题。 查Linux支持多少端口, cat /proc/sys/net/ipv4/ip_local_port_range 然后找运维修改,或者: 修改文件  /etc/sysctl.conf 键入如下语句: net.ipv4.ip_local_port_range = 1024 65535压测过程还有其他问题,比如宽带限制,负载均衡,关闭缓存等,多百度即可。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7521068.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-06
下一篇 2023-04-06

发表评论

登录后才能评论

评论列表(0条)

保存