簡體   English   中英

如何發現我的服務的依賴項是什么?

[英]How do I discover what my service's dependencies are?

我有一個Windows服務使用:

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

在某些機器(具有舊硬件和Windows XP)上,它在啟動時會掛起。

檢查Windows事件日志,我發現了事件的ID:7022,7036。

機器啟動后,我手動啟動服務,一切正常!

我認為問題與缺少服務依賴性有關。

我的問題是:

如何找到服務的必要依賴關系?

有什么實用工具可以告訴我嗎?


UPDATE

我已經有日志了...

我的服務可以通過一些我稱為插件的“子服務”插入。 該插件以“插件管理器”開始,該應用程序(exe)加載dll以確保服務內存隔離。

該插件管理器具有一個Handle(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(進程間通信)。

奇怪的是,如果我在計算機啟動后手動啟動該服務,它將正常啟動。

消息隊列處理時間不是問題。 問題是:硬件速度慢

我將ServicePipeTimeout從30秒(默認)增加到2分鍾,一切恢復正常。

現在,我將嘗試在服務OnStart事件中使用RequestAdditionalTime 唯一的問題是我正在使用Delphi 7。

最簡單的啟動方法是在服務中實現日志記錄機制。 只需將您正在做的所有事情寫到TextFile 然后,您可以輕松地找到服務掛在哪里。

您要使用DBExpress連接什么? 像SQL Server這樣的數據庫引擎? 如果是這樣,則可能是在RDBMS之前啟動了您的服務...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM