DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: huoying_you
今日帖子: 4
在线用户: 8
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2024/4/22 16:01:34
标题:
如何定位内存泄漏的地方? 浏览:838
加入我的收藏
楼主: 各位大老:我的程序运行10个小时左右内存就从30M占用到2G多而没有响应,下图是DLPHI报告的内存泄漏,怎么快速度定位有内存严重泄漏的地方代码?
此帖子包含附件:
PNG 图像
大小:574.7K
----------------------------------------------
永远是DELPHI初学者。
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2024/4/22 18:39:53
1楼: 你这是创建了就不释放的么?
你可以查一下map文件,一般可以快速定位到申请内存的地方。然后在不再使用的时候销毁救行了。
具体用法直接上网查就行了。

其实你自己都说了具体现像,自己应该就可以大致判断出问题出在什么地方了。
----------------------------------------------
--
作者:
男 keymark (嬲) ▲▲▲△△ -
普通会员
2024/4/22 18:58:48
2楼: https://sourceforge.net/projects/fastmm/files/FastMM%204.x%20Stable%20Releases/
----------------------------------------------
[alias]  co = clone --recurse-submodules  up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/>http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/
作者:
男 lsuper (lsuper) ★☆☆☆☆ -
盒子活跃会员
2024/4/23 0:01:55
3楼: 用 FastMM4 的 FullDebugMode 结合 map 文件执行,产生详细 log 可以秒出 ~
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/4/23 0:19:11
4楼: 30M 干到 2G,这么厉害的情况,问题就太明显了,不需要定位哪里泄露,直接把代码里面有分配内存的地方拿出来看就知道了。

其实用 Delphi 要写出没有内存泄漏的程序,是非常简单和非常容易的。遵循几个基本规则就可以了。
----------------------------------------------
-
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2024/4/23 7:39:12
5楼: 我在前面 
{$define FullDebugMode}
{$define LogErrorsToFile}    //  LogErrorsToFile     记录错误到文件
{$define LogMemoryLeakDetailToFile}
 {$define EnableMemoryLeakReporting}      //允许内存泄露报告
然后
  ReportMemoryLeaksOnShutdown := true; // DebugHook=0;
退出有上图报告 ,但没见有log文件生成
----------------------------------------------
永远是DELPHI初学者。
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2024/4/23 8:05:49
6楼: program Project4;
{$define FullDebugMode}
{$define LogErrorsToFile}    //  LogErrorsToFile     记录错误到文件
{$define LogMemoryLeakDetailToFile}
 {$define EnableMemoryLeakReporting}      //允许内存泄露报告
uses
  fastmm4,
  Vcl.Forms,
  Unit4 in 'Unit4.pas' {Form4};

{$R *.res}

begin
  ReportMemoryLeaksOnShutdown := true; // DebugHook=0;
    Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm4, Form4);
  Application.Run;
end.



unit Unit4;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons;

type
  TForm4 = class(TForm)
    BitBtn1: TBitBtn;
    procedure BitBtn1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form4: TForm4;

implementation

{$R *.dfm}

procedure TForm4.BitBtn1Click(Sender: TObject);
begin
end;

procedure TForm4.FormCreate(Sender: TObject);
var aabb:TStrings;
begin
    aabb:=TStringList.Create;
  //  aabb.Free;

end;

end.

退出有提示,但没有log文件生成。
此帖子包含附件:
PNG 图像
大小:18.4K
----------------------------------------------
永远是DELPHI初学者。
作者:
男 lsuper (lsuper) ★☆☆☆☆ -
盒子活跃会员
2024/4/23 9:32:12
7楼: 1、在 delphi ide 你项目 options 中定义 FullDebugMode 编译指令
2、采用 debug 模式开启生成 map 文件
3、在你 exe 旁边放上 FastMM_FullDebugMode.dll
----------------------------------------------
-
作者:
男 souledge (souledge) ★☆☆☆☆ -
普通会员
2024/4/23 9:56:44
8楼: 用 madExcept 可以很方便定位
这是个免费的delphi扩展,可以追踪内存泄漏/异常
下载地址: http://madshi.net/

安装之后在delphi中打开你要查内存泄漏的工程文件,在 Project 菜单中会出现 madExcept settings,如图设置即可

然后运行程序,在程序退出的时候就能看到内存泄漏报告了
此帖子包含附件:
JPEG 图像
大小:99.4K
----------------------------------------------
-
作者:
男 doersoft (hnysoft.com) ★☆☆☆☆ -
普通会员
2024/4/23 15:36:41
9楼: madExcept 确实可以~~~
此帖子包含附件:
PNG 图像
大小:69.2K
----------------------------------------------
delphi|vue|golang hnysoft|hnyerp+mes+srm
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2024/4/25 10:03:31
10楼: 我加上madExcept后,
如下图致命错误:
此帖子包含附件:
PNG 图像
大小:265.2K
----------------------------------------------
永远是DELPHI初学者。
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2024/4/25 19:07:49
11楼: madExcept后,退出时,就没有上面的图。应该是madExcept原因。
----------------------------------------------
永远是DELPHI初学者。
作者:
男 abc1849 (大力水手) ▲▲△△△ -
普通会员
2024/4/26 12:15:21
12楼: 试试 Deleaker:https://www.deleaker.com/
----------------------------------------------
-
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2024/4/30 21:21:35
13楼: 上面图提示,内存泄漏都与IDY通信控件相关。我去掉idy控件后,内存泄漏解决。
用上面大老说的方法,无法定位泄漏地方。去掉IDY控件后,就不会有内存泄漏了。
运行几天也不会无响应了,内存也不会增加。
看样子,IDY不能应用实际程序。
----------------------------------------------
永远是DELPHI初学者。
作者:
男 bighawk (Hawk) ★☆☆☆☆ -
盒子活跃会员
2024/4/30 23:29:34
14楼: 是 indy 组件么?换了啥来维持业务运行的?
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/4/30 23:56:47
15楼: 我在 D7 年代,用 Indy 没有任何问题。

你如果仅仅是去掉 Indy,那和通讯有关的代码就都不运行了,怎么能确定是 Indy 的问题还是你的程序的问题?

除非,你是拿其它通讯控件替换掉 Indy 你程序里面那些通讯相关代码仍然在跑。
----------------------------------------------
-
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2024/5/1 10:07:22
16楼: 我用diocp-v5-master中的
    FTcpServer: TDiocpTcpServer;

换掉indy服务控件,现在运行几天,很稳定,内存没有增加过。也没有不响应而退出的。
----------------------------------------------
永远是DELPHI初学者。
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2024/5/1 12:27:26
17楼: 本想用Delphi-Cross-Socket-master代替INDY,测试后发现不能以阻塞方式发送接收,所以放弃了。
----------------------------------------------
永远是DELPHI初学者。
作者:
男 bighawk (Hawk) ★☆☆☆☆ -
盒子活跃会员
2024/5/1 16:32:22
18楼: 阻塞发送接收……那用这些组件不是浪费资源。自己写不就得了,API都那么简单……
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/5/2 2:10:47
19楼: https://blog.csdn.net/pcplayer/article/details/112618625

Delphi 的代码,如何把非阻塞的代码变成阻塞式的代码,异步变同步

你可以参考一下。
----------------------------------------------
-
作者:
男 tjwhf (tjwhf) ▲▲▲▲△ -
普通会员
2024/5/2 8:52:56
20楼: 这肯定不是indy的问题,indy如果这么多的内存泄露那早就应该被淘汰了
----------------------------------------------
-
作者:
男 lsuper (lsuper) ★☆☆☆☆ -
盒子活跃会员
2024/5/2 15:16:48
21楼: 同意楼上:
1、看上面截图一堆 TIdTCPServer、TIdHTTP,甚至 TIniFile 的泄露,几乎可以肯定是使用者的代码;不是说 Indy 没问题,只是作为官方内定 & 多年开源类库,概率较低 ~
2、更换别的类库,对相关代码重构有可能恰好解决或规避了问题
3、建议常态化开启 FastMM4 调试模式,关注内存泄露问题
----------------------------------------------
-
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2024/5/4 7:36:44
22楼: 经详细检查,TIniFile有两个地方的确没有释放。而indy控件详细检查也没有不free的。现在问题主要是随着时间内存就不断增加,当增加1.7G以上后,进程就死了。用各种方法找不出原因。只好根据上图情况,试用diocp-v5-master换掉indy,现在连续运行5天了,内存不增加,CPU占用也很少。而且,工作得很好。所以没法解释。
----------------------------------------------
永远是DELPHI初学者。
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行82.03125毫秒 RSS