【问题标题】:How do I discover what my service's dependencies are?如何发现我的服务的依赖项是什么?
【发布时间】:2013-03-11 12:34:39
【问题描述】:

我有一个 Windows 服务使用:

  • Midas.dll (datasnap ClientDataSet)
  • Indy 组件(TCP 和 FTP)
  • DbExpress
  • CreateProcessAsUser
  • 制作 IPC 的句柄

在某些机器上(使用旧硬件和 Windows XP),它在启动期间会挂起。

检查 Windows 事件日志,我发现事件 ID:70227036

机器启动后,我手动启动服务,一切正常!

我认为问题与我的服务缺少依赖项有关。

我的问题是:

如何为我的服务找到必要的依赖项?

有什么工具可以告诉我这个吗?


更新

我已经有日志了...

我的服务可以被我称为插件的一些“子服务”插入。这个插件以“插件管理器”开始,一个应用程序 (exe) 加载 dll 以保证服务内存隔离。

这个插件管理器有一个句柄 (AllocateHWnd) 可以从服务接收消息(通过 sendmessange),例如:

  • 开始
  • 重新加载插件库
  • 停止

插件管理器的引导是:

  • 启动并向服务的句柄发送消息(通过参数传递),以将在服务和插件管理器之间为 IPC 内部分配的句柄(由插件管理器)发送回服务。

启动插件管理器的服务的引导代码是:

start := now;
while callbackHandle = 0 do
begin
  if PeekMessage(msg, 0, 0, 0, PM_REMOVE) then
  begin
    // need to process a message on WndProc to
    // assign the 'callbackHandle' variable with the
    // handle sent from the plugin manager
    TranslateMessage(msg);
    DispatchMessage(msg);
  end;

  // timeout! Plugin manager doesn't  sent it's handle!!
  if secondsBetween(now, start) > 60 then
     break;
end;

if callbackHandle = 0 then
  raise Exception.Create('Cannot receive the callback handle from plugin manager');

在日志中,出现上述异常:无法从插件管理器接收回调句柄

好像服务句柄没有收到pluginmanager句柄,启动IPC(进程间通信)。

奇怪的是,如果我在电脑启动后手动启动服务,它就可以正常启动。

【问题讨论】:

  • 最简单的开始方法是在您的服务中实现日志记录机制。只需将您正在做的所有事情都写入TextFile。然后,您可以轻松找出您的服务挂起的位置。
  • 您很可能在系统准备好之前尝试进行 Internet/TCP/IP 操作。你延迟操作一段时间,看看能不能解决问题。或者,设置对基本内容的依赖。
  • 再次检查您的日志。消息发送了吗?什么时候?也许你必须调整你的等待时间,因为系统正在启动,也许另一部分需要超过 60 秒才能发送消息,但确保你的日志可以告诉你。

标签: delphi windows-services dependencies


【解决方案1】:

消息队列处理时间不是问题。 问题是:硬件慢

我将ServicePipeTimeout 从 30 秒(默认)增加到 2 分钟,一切都恢复正常了。

现在我将尝试在服务 OnStart 事件中使用RequestAdditionalTime。唯一的问题是我使用的是 Delphi 7。

【讨论】:

    【解决方案2】:

    最简单的开始方法是在您的服务中实现日志记录机制。只需将您正在做的所有事情都写入TextFile。然后,您可以轻松找出您的服务挂起的位置。

    您通过DBExpress 连接到什么?像 SQL Server 这样的数据库引擎?如果是这种情况,可能您的服务在 RDBMS 之前启动...

    【讨论】:

    • 这个问题并不要求猜测可能是什么问题。它要求一种能够发现依赖关系的技术或工具。
    猜你喜欢
    • 2017-11-11
    • 2018-02-08
    • 1970-01-01
    • 2015-05-15
    • 2015-04-13
    • 2011-07-03
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多