搜索
bottom↓
回复: 10

请问windows下64位程序有好用的内存泄漏检测工具不?

[复制链接]

出0入119汤圆

发表于 2022-8-5 12:21:37 | 显示全部楼层 |阅读模式
100汤圆
内存泄漏问题一直没办法定位,目前尝试过的工具有umdh、vld、windbg、leakdlg。
工具最好能打印出堆栈信息,目前都是在发布模式不调试,所以也不能用crt指令。

非常感谢!

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2022-8-5 13:39:16 | 显示全部楼层
要定位问题的程序是自己编译的吗?
只能去测不带 .pdb 的 release 版本的程序?

出280入168汤圆

发表于 2022-8-5 13:59:19 来自手机 | 显示全部楼层
我很早之前看过一个方法是重载 new 和 delete,然后在退出时查 log,等到 release 时取消重载就行了。

出0入442汤圆

发表于 2022-8-5 14:08:45 | 显示全部楼层
chunjiu 发表于 2022-8-5 13:59
我很早之前看过一个方法是重载 new 和 delete,然后在退出时查 log,等到 release 时取消重载就行了。 ...
(引用自3楼)

然后lz这里只有release版本程序,让程序猿去猜。。

说实话,跑crtdump也不一定能抓到bug。我前段时间找一个内存泄漏找了很久,最后发现是我的几个嵌套类析构的bug——A里面有B,B里面有C,然后B先把C释放了,然后A释放B时B把几个块漏了。漏的不多,循环几百次才几MB。如果bug需要运行一段时间才出现,那么crtdump一点用都没有——它根本不知道在某个break点到底是谁在申请内存。有一个办法是手动重载new和delete,申请完之后加入配对队列,释放之后清除,这样可以想办法记录申请内存的地方。

windows上面比较坑的还有几个东西——handles,gdi objects,user objects,还有threads,这几个需要手动在任务管理器里面调出来,否则不显示,也不占内存  实际程序handles好像上限是2万多个?,还是65500个左右?,超了之后所有handle对象都不能创建了(threads,mutex,event,file,===,etc,基本上全部的系统调用都不能用了)。曾经因为这个bug找了很久才发现,所以现在每做一个功能都要反复去测试这几项有没有增加。

此外,好几年前写代码时就发现过一个跨模块的内存创建bug。此处一个模块指1个dll,在模块A里面new的块,在模块B里面去释放,此时这个块是释放不掉的  当年查了好几天仍然没有找到原因(win7/win8/win10都有这问题),总之就是尽量满足谁创建谁释放的原则了。

出0入119汤圆

 楼主| 发表于 2022-8-5 14:44:33 来自手机 | 显示全部楼层
wudicgi 发表于 2022-8-5 13:39
要定位问题的程序是自己编译的吗?
只能去测不带 .pdb 的 release 版本的程序?
...

(引用自2楼)

我都用上vld了,还能不是自己编的吗。。

出0入119汤圆

 楼主| 发表于 2022-8-5 14:45:34 来自手机 | 显示全部楼层
chunjiu 发表于 2022-8-5 13:59
我很早之前看过一个方法是重载 new 和 delete,然后在退出时查 log,等到 release 时取消重载就行了。 ...
(引用自3楼)

你这个基本就是crt库的基本原理了。。。crt只能debug模式用的啊。。而且不是很实用,我这不是个小程序 是软件的一个插件。。。

出0入119汤圆

 楼主| 发表于 2022-8-5 14:48:21 来自手机 | 显示全部楼层
wye11083 发表于 2022-8-5 14:08
然后lz这里只有release版本程序,让程序猿去猜。。

说实话,跑crtdump也不一定能抓到bug。我前段时间找 ...

(引用自4楼)

程序本地都有,现场能编的,pdb啥都有,就是64位程序没好用的检测工具,vld能挂载上,但是日志不打印,头疼

出0入442汤圆

发表于 2022-8-5 21:37:53 来自手机 | 显示全部楼层
diandianer 发表于 2022-8-5 14:48
程序本地都有,现场能编的,pdb啥都有,就是64位程序没好用的检测工具,vld能挂载上,但是日志不打印,头 ...
(引用自7楼)

64位标准debug版照样能挂crt。。除非你是用的opencv/qt之类的库创建的内存。。

出280入168汤圆

发表于 2022-8-6 09:21:54 | 显示全部楼层
wye11083 发表于 2022-8-5 21:37
64位标准debug版照样能挂crt。。除非你是用的opencv/qt之类的库创建的内存。。 ...
(引用自8楼)

是的,我也觉得总有办法做到的,只是不知道 LZ 的时间和精力是否允许这么做。

出0入442汤圆

发表于 2022-8-6 10:52:53 来自手机 | 显示全部楼层
chunjiu 发表于 2022-8-6 09:21
是的,我也觉得总有办法做到的,只是不知道 LZ 的时间和精力是否允许这么做。 ...
(引用自9楼)

要么上2tb内存的服务器。。反正现在内存不贵。。

要么就一群人彻底搞一遍,其实还是说明lz公司单元测试不充分。。

出0入119汤圆

 楼主| 发表于 2022-8-8 11:21:19 来自手机 | 显示全部楼层
wye11083 发表于 2022-8-6 10:52
要么上2tb内存的服务器。。反正现在内存不贵。。

要么就一群人彻底搞一遍,其实还是说明lz公司单元测试 ...

(引用自10楼)

我们是客户端啊,不是服务端
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 20:48

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表