关于在delphi写的程序在退出时出现Runtime Error的解决办法
作者:sabason
QQ:19699100
email:sabason@126.com
这两天在破解一外挂程序,发现自己用delphi写的dll在外挂程序退出时出现Runtime Error,网上一查有一篇文章为<<Delphi中利用SEH屏蔽退出时的Runtime Error>>的提出用SEH来
解决,其实就是跳过,但我觉得这样不好,内存泄露严重,于时就下定决定解决这个问题。经过对程序调试终于查出问题所在,并完美解决了。现总结并将解决过程写给大家,给有同样
困扰的朋友一个借鉴.
首先问题出在退出才现,那么应该想到先从程序的退出运行的程序查起,具体到我的程序就是dll的 Dll_Process_Detach: UnStart;先下断点运行程序,然后断在此处理,这时用f7
跟进,最终发现在运行到某处理就出Runtime Error,...............这中间的思考我就不说了,直接说解决相关的吧。
解决方法如下:
在delphi退出程序出错的调试方法是,将classes单元的路径加入到工程的debug search patch中 也加入到search source path中,这样让classes单元可以下断点,
断点的位置可以选在如下开始的地方
finalization
UnRegisterModuleClasses(HInstance);
GlobalNameSpace.BeginWrite;
FreeIntConstList;
RemoveFixupReferences(nil, '');
FreeAndNil(GlobalFixupList);
FreeAndNil(GlobalLists);
FreeAndNil(RegGroups);
GlobalNameSpace := nil;
RemoveModuleUnloadProc(ModuleUnload);
FreeAndNil(SyncList);
DoneThreadSynchronization;
FreeAndNil(FindGlobalComponentProcs);
原理是上面这段程序就是对程序退出处理delphi的类注册在内存中的资源的释放,然后由于我们在delphi写的dll中用到了getmemory的话就会,在堆中占用这个系统classes单元的类注
册的list.add(item),其中某个item附近,从而破坏了其对象数据,其实不叫破坏,因为如果破坏了的话,程序也不可能能正常运行,而只是在退出时出现什么Runtime Error,但就是这
种原因使之在finalization中的程序在运行到freemem时就出错了,我估计应该是delphi的内存管理有问题吧,至少有bug。通过下断点用排除法,来确定出错的具体位置,然后在
ollydbg来调试下出错内存地址访问的硬件断点就可以看清具体原因了。
对于这种问题,可能要仔细分析delphi的内存管理了,那样太费时间了,我找了个简单的方法来解决这个问题,那就是我在dll中不用getmemory,在而要用到的内存空间估计好,然后
在代码段中直接以公共变量型式声明如 SaveMyLicInfo:array[0..$2000] of char; CurrAllocMem:pointer=nil;然后用currallocmem来记录已用的内存地址,实现自己的mygetmemory
处理动态内存。这样处理后终于在退出程序时不出现Runtime Error了
总结,这个错误网上有人用<<Delphi中利用SEH屏蔽退出时的Runtime Error>>这篇文来解决,但我觉得不太好,这样出现很多内存泄露!其实还有其解决办法,主要还是要搞清出错的
原因,然后就可以想出对应的方法解决了。
联系客服