C++内存泄露排查的一个案例

这篇具有很好参考价值的文章主要介绍了C++内存泄露排查的一个案例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景: 这熟悉的线条. 请求量没啥波动, 不用怀疑, 就是内存泄露了.
C++内存泄露排查的一个案例,c++,开发语言
方案一 Valgrind

Valgrind可以用来检测是否有非法使用内存的问题, 如: 访问未初始化的内存,访问数组越界, 忘记释放动态内存的问题;
首先需要定位是哪个进程的内存泄露. 使用top命令, 然后shift+m按照内存排序, 找到%MEM最高(或上升最快的)进程(RES). 测试机可复现, 后续步骤测试机完成.
2.安装valgrind包. 可以直接在编译程序时, 加上-g选项. 如下图为例:
C++内存泄露排查的一个案例,c++,开发语言

gcc -g -o test test.cpp 
valgrind --tool=memcheck --leak-check=full  ./test

由于我们的是spp框架(开源github可看源码): 所以就手动启动的proxy进程.

3.使用valgrind包启动一个worker进程. 进入到服务的bin目录下执行:

../../valgrind-1.0/bin/valgrind --tool=memcheck --leak-check=full --log-file=valgrind.log ./spp_xxx_worker ../etc/spp_worker1.xml

启动报错:

valgrind: failed to start tool ‘memcheck’ for platform ‘amd64-linux’: No such file or directory

执行命令:


export VALGRIND_LIB=/usr/local/services/valgrind-1.0/lib/valgrind/
  1. 发送请求. 待返回结果后, 调valgrind的进程号, 执行:
kill -10 pid
  1. kill之后查看valgrind.log (还以上图test.cpp为例)
    C++内存泄露排查的一个案例,c++,开发语言
    左边类似行号的数字(22939)表示的是ProcessID; 上面的HEAP SUMMARY, 会显示valgrind发现的内存问题, 堆栈信息, 和具体的代码行数. 最下面的LEAK SUMMARY是个问题汇总. 不过在实际执行中, 因为我们会跑全量的请求. 所以不会这么整齐, 不过搜索关键字, 还是可以看到有用的信息的.

方案二 core文件

1.这个也是在网上搜的一个方法, 首先和思路一样, 都是要寻找升的快的进程. 通过top命令;

2.定位内存泄露的地址范围; 通过pmap -x ${pid} 查看内存情况. 这里我通过spp的配置, 只起一个worker进程, 也就是单线程排查. 通过pmap -x ${pid} 的结果, 可以找到占用多的块.

3.导出内存中的内容. gcore ${pid} ; 通过gdb关联的spp_worker 和coredump文件.


gdb spp_worker(xxx) core.2005(pid)
info proc mappings
dump binary memory result.bin ${start addr} ${start addr}  (eg:dump其中一部分即可)
vim result.bin (使用 :%!xxd 的方式查看内容)

理论上在这个文件中, 可以到可读的, 有意义的字段, 再根据代码去定位.文章来源地址https://www.toymoban.com/news/detail-533625.html

到了这里,关于C++内存泄露排查的一个案例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux C/C++ 程序内存泄露排查

    由于C/C++程序可以动态申请内存,动态申请的内存位于程序的队区,如果程序比较复杂,程序员在编写代码的时候不小心,可能会存在申请了内存没有释放的情况,程序长期运行,会导致系统中用户程序可分配堆内存越来越少的,最终程序OOM崩溃。 /proc/meminfo 文件保存了系统

    2024年02月03日
    浏览(37)
  • 得物-Golang-记一次线上服务的内存泄露排查

    在风和日丽的一天,本人正看着需求、敲着代码,展望美好的未来。突然收到一条内存使用率过高的告警。 告警的这个项目,老代码是python的,最近一直在go化。随着go化率不断上升,发现内存的RSS使用率越飙越高。最终达到容器内存限制后,进程会自动重启。RSS如下图所示

    2024年02月04日
    浏览(62)
  • 排查Javascript内存泄漏案例(一)

    Chrome DevTools 里的 Performance 面板和 Memory 面板可以用来定位内存问题。 为了证明螃蟹的听觉在腿上,一个专家捉了只螃蟹并冲它大吼,螃蟹很快就跑了。然后捉回来再冲它吼,螃蟹又跑了。最后专家把螃蟹的腿都切了,又对着螃蟹大吼,螃蟹果然一动不动…… 定位问题首先要

    2024年02月07日
    浏览(39)
  • C++内存泄露

    目录 1.什么是内存泄露 2.内存泄露的危害 3.如何解决内存泄露等相关的问题         在C/C++中 ,我们申请了资源,因为一些原因忘记对申请的资源进行释放,或者因为异常安全等问题没有进行释放就会造成内存泄露的。          一般来说,如果不是长期运行的程序,内存泄

    2024年02月09日
    浏览(35)
  • 关于一个C++项目:高并发内存池的开发过程(二)

    上篇文章梳理了内存申请操作的流程,大概测试了一下,没有发现什么问题。这篇文章将梳理内存释放操作的流程,若申请操作中,有些细节没有把控好,那么释放操作将bug不断。有些bug我至今还在调试…所以,这篇文章的梳理,侧重点依然是逻辑结构。代码的细节可能存在

    2024年02月05日
    浏览(71)
  • 关于一个C++项目:高并发内存池的开发过程(一)

    原项目地址: 高并发内存池项目: 高并发内存池项目的课堂板书+代码 (gitee.com) 本打算利用五一假期的时间将这个项目一口气开发完成,但由于本人的懈怠,这个项目最终只完成了80%。于是利用长假后的一天假期,将这个项目的框架搭建完成。本以为这个项目就此结束,但是

    2024年02月05日
    浏览(40)
  • 【Visual Studio】使用 C++ 语言,配合 Qt,开发了一个串口通信界面

    知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 我要使用的功能比较简单,主要包含扫描串口、打开串口、发送数据、接收数据、暂停按钮、停止按钮,因此接下里将围绕这几个功能依次更新。 我的工程项目名字叫 “GUI”。

    2024年02月11日
    浏览(71)
  • C++ 使用动态内存创建一个类

    使用动态内存的一个常见原因是允许多个对象共享相同的状态。 例如,假定我们希望定义一个名为 Blob 的类,保存一组元素。与容器不同,我们希望 Blob 对象的不同拷贝之间 共享相同的元素 。即,当我们拷贝一个 Blob 时,原 Blob 对象及其拷贝应该 引用 相同的底层元素。现

    2024年02月01日
    浏览(37)
  • 【C++基础(九)】C++内存管理--new一个对象出来

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C++从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C++   🔝🔝 在C语言中,有四个内存管理函数: malloc,calloc,realloc和free 但是它们的使用十分的不方便: 代码量很大,并且有一个新的问题: malloc函数不会初始

    2024年02月14日
    浏览(85)
  • 什么是内存溢出?什么是内存泄露?

    文章目录 一、什么是内存溢出?  二、什么是内存泄露? 三、如何避免内存溢出和内存泄露? 一、什么是内存溢出?         假设我们JVM中可用的内存空间只有 3M ,但是我们要创建一个 5M 的对象,那么新创建的对象就放不进去了。这个时候,我们就叫做内存溢出。就好

    2024年02月08日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包