用D7编写的Windows Service,重启后无法在WinServer2008 64位下运行

时间:2012-02-23 11:50:02

标签: delphi windows-server-2008 delphi-7

几个月前我曾就一直在与之抗争的问题写过一篇文章。 这是链接:

0x0eedfade kernelbase.dll faulting module in d7 windows service

通常问题是第一次用D7编写的Windows服务启动正常并且工作正常,但是当我必须重新启动它时(例如几天之后),我无法做到。

今天我把makexcept包含在可执行文件中,我在启动时得到了:

compiled with     : Delphi 7
madExcept version : 3.0l
callstack crc     : $dbabc0aa, $f5cfd533, $f5cfd533
exception number  : 1
exception class   : EOutOfResources
exception message : Error creating window class.

main thread ($c88):
004a7419 +09d ServiceTest.exe Forms                  6322 +20 TApplication.CreateHandle
004a7206 +1a6 ServiceTest.exe Forms                  6250 +32 TApplication.Create
00493fc3 +10b ServiceTest.exe Controls              10924 +10 InitControls
0049411b +02f ServiceTest.exe Controls              10943  +2 initialization
004048c0 +044 ServiceTest.exe System                          InitUnits
00404926 +03a ServiceTest.exe System                          @StartExe
00407392 +03a ServiceTest.exe SysInit                         @InitExe
004ed991 +011 ServiceTest.exe ServiceTest    62  +0 initialization
75f13675 +010 kernel32.dll                                              

据我所知,它甚至没有开始项目文件的结束部分。 我只是好奇系统是否耗尽资源但是: 系统句柄处于良好的水平,内存也是如此。

有什么建议我还能做什么?

每次出现此错误时都无法重新启动生产服务器,无法重新启动应用程序。

1 个答案:

答案 0 :(得分:2)

我认为您的应用程序/服务中存在资源泄漏。

你需要检查Window Desktop Heap,这是一篇ms ms文章Out of Memory" error message appears when you have a large number of programs running

我们已经看到非常类似的问题,服务没有运行或行为非常奇怪(套接字变得聋),并跟踪它到DesktopHeap变得充满,它作为应用程序运行时的工作原因是应用程序的桌面堆比用于服务的数据大得多。

此链接Desktop Heap Overview解释了其用途。

DHeapMon是一个应用程序,可用于监视桌面堆并确定是否泄漏(或仅使用)过多资源。

您需要确保您的服务使用尽可能少的TForms(最好不使用)。

您可以在注册表中更改服务桌面堆的大小,链接说明如何,这可以用于帮助查找问题(通常减少它以加快故障),或者如果您使用大量的服务。

希望这有帮助。