diandianer 发表于 2022-8-5 12:21:37

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

内存泄漏问题一直没办法定位,目前尝试过的工具有umdh、vld、windbg、leakdlg。
工具最好能打印出堆栈信息,目前都是在发布模式不调试,所以也不能用crt指令。

非常感谢!

wudicgi 发表于 2022-8-5 13:39:16

要定位问题的程序是自己编译的吗?
只能去测不带 .pdb 的 release 版本的程序?

chunjiu 发表于 2022-8-5 13:59:19

我很早之前看过一个方法是重载 new 和 delete,然后在退出时查 log,等到 release 时取消重载就行了。

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

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

diandianer 发表于 2022-8-5 14:44:33

wudicgi 发表于 2022-8-5 13:39
要定位问题的程序是自己编译的吗?
只能去测不带 .pdb 的 release 版本的程序?
...
(引用自2楼)

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

diandianer 发表于 2022-8-5 14:45:34

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

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

diandianer 发表于 2022-8-5 14:48:21

wye11083 发表于 2022-8-5 14:08
然后lz这里只有release版本程序,让程序猿去猜。。

说实话,跑crtdump也不一定能抓到bug。我前段时间找 ...
(引用自4楼)

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

wye11083 发表于 2022-8-5 21:37:53

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

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

chunjiu 发表于 2022-8-6 09:21:54

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

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

wye11083 发表于 2022-8-6 10:52:53

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

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

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

diandianer 发表于 2022-8-8 11:21:19

wye11083 发表于 2022-8-6 10:52
要么上2tb内存的服务器。。反正现在内存不贵。。

要么就一群人彻底搞一遍,其实还是说明lz公司单元测试 ...
(引用自10楼)

我们是客户端啊,不是服务端
页: [1]
查看完整版本: 请问windows下64位程序有好用的内存泄漏检测工具不?