Как отладить службу Windows с Delphi? - PullRequest
24 голосов
/ 21 мая 2010

Есть ли способ отладки полностью службы Windows с Delphi?

Ответы [ 6 ]

26 голосов
/ 22 мая 2010

Вы можете использовать unitDebugService.pas из Низкоуровневых утилит Колина Уилсона для NT (страница пропала, доступна на машине обратного хода )

и затем в ДНР:

begin
  if (paramCount > 0) and (SameText(ParamStr(1), '-DEBUG')) then
  begin
    FreeAndNil (Application);
    Application := TDebugServiceApplication.Create(nil);
  end;

  //... the rest of the normal DPR code
end.

Таким образом, вы можете запустить из Delphi с помощью отладки (установив параметры отладчика проекта), использовать EXE в качестве службы или запустить из командной строки с переключателем -DEBUG и.

18 голосов
/ 17 июля 2015

Это на самом деле довольно легко. Просто используйте стандартную директиву компилятора DEBUG, чтобы запустить службу как консольное приложение вместо службы.

program MyServiceApp;

{$ifdef DEBUG}
  {$APPTYPE CONSOLE}
{$endif}

uses
  System.SysUtils,

[..]

begin
  {$ifdef DEBUG}
  try
    // In debug mode the server acts as a console application.
    WriteLn('MyServiceApp DEBUG mode. Press enter to exit.');

    // Create the TService descendant manually.
    ServerContainer1 := TServerContainer.Create(nil);

    // Simulate service start.
    ServerContainer1.ServiceStart(ServerContainer1, MyDummyBoolean);

    // Keep the console box running (ServerContainer1 code runs in the background)
    ReadLn;

    // On exit, destroy the service object.
    FreeAndNil(ServerContainer1);
  except
    on E: Exception do
    begin
      Writeln(E.ClassName, ': ', E.Message);
      WriteLn('Press enter to exit.');
      ReadLn;
    end;
  end;
  {$else}
  // Run as a true windows service (release).
  if not Application.DelayInitialize or Application.Installing then
    Application.Initialize;
  Application.CreateForm(TServerContainer, ServerContainer1);
  Application.Run;
  {$endif}
end.
14 голосов
/ 22 мая 2010

Используйте Run -> Attach to process. Таким образом, вы можете отлаживать сервис, не внося никаких изменений в его код. Единственная сложная часть, возможно, отладка кода запуска службы, потому что для присоединения может потребоваться некоторое время, и запуск должен произойти через 30 секунд (хотя вы можете настроить Windows на более длительное время). Вы можете использовать задержку (сон ...), чтобы позволить вам присоединиться вовремя, или, если вам просто нужно посмотреть, что происходит, вы можете использовать OutputDebugString () для печати в выходные данные отладки (используйте Delphi Event View, чтобы увидеть его).

6 голосов
/ 21 мая 2010

Да, есть: Услуги отладки: простой способ

Вы создаете сервисы с Delphi? Тогда, возможно, вы также раздражены трудоемкий способ запуска, перезапуск, убийство и присоединение к приложение процесса обслуживания каждый время. Ну, есть лекарство.

Вам не нужно этого делать. Вместо запуска Delphi как приложение системы и сделать некоторые незначительные адаптации к сервису Код.

5 голосов
/ 19 февраля 2012

Я пробовал это, но появляется только окно процессора с кодами сборки.

Тогда вам нужно только решить эту проблему.

По сути, для отладки службы Win2 существует несколько способов:

  • Используйте команду «Присоединить к процессу», чтобы присоединить отладчик к уже запущенной службе. Вы можете вставить задержки запуска, чтобы успеть подключить отладчик, если вам нужно подключиться в самом начале. Однако вам также придется настроить систему, чтобы увеличить время ожидания обслуживания.
  • Используйте раздел реестра «Опции выполнения файла изображения» для принудительного запуска отладчика Delphi при запуске службы. То же самое относится и к системным таймаутам.
  • Временно преобразуйте сервис в обычное приложение и нормально запускайте его в отладчике. Вы можете перезапустить IDE под другой учетной записью, чтобы получить больше привилегий для «службы».

Если у вас по какой-то причине после запуска отладки есть только представление процессора вашей службы - это означает, что отладчик Delphi не может найти отладочную информацию для вашей службы. Это другая проблема, и вы должны найти решение для нее.

Обычно вам нужно сделать:

  1. Убедитесь, что для выходной папки приложения-службы задана папка, из которой оно будет загружено системой. То есть если ваша служба находится в C: \ Windows \ System32 - установите выходную папку в C: \ Windows \ System32. Не копируйте файл .exe в другое место из вашей выходной папки. Для 64 систем вы можете использовать псевдоним (sysnative / SysWOW64) или реальное имя. Я думаю, что лучше установить выходной путь к папке проекта и перерегистрировать службу для загрузки из папки проекта.
  2. (Необязательно) Установите путь вывода для DCU в ту же папку, что и файл .exe.
  3. Удалите все ваши файлы DCU.
  4. Обязательно включите параметры отладки на странице «Компилятор» в параметрах проекта.
  5. (Необязательно). Кроме того, вы также можете включить опции TD32 / RSM / MAP на странице «Линкер».
  6. Убедитесь, что не существует эксперта / расширения IDE, который может изменить файл .exe, отладочную информацию или дату изменения файла для этих файлов.
  7. Убедитесь, что в других местах нет старых файлов (DCU / exe).
  8. Сделать полную перестройку (Project / Build all).
  9. Запустите свой сервис.
3 голосов
/ 21 мая 2010

Да, есть.

В вашем дпр:

Application.CreateForm(TMyService, MyService);

_ServiceInDebugMode := SysUtils.FindCmdLineSwitch('DEBUG', True);
if _ServiceInDebugMode then
  DebugService(MyService)
else
  SvcMgr.Application.Run;

DebugService - это процедура, которая создает форму отладки, поток управления службой и запускает все, вызывая Forms.Application.Run.

Вы можете сравнить поток управления службами с SCM (Service Control Manager) Windows, форму отладки с приложением, которое обращается к SCM (например, services.msc) для запуска и остановки служб. Служба также должна иметь свой собственный поток (служебный поток) для ответа на управляющие коды, поступающие из SCM или нашего управляющего потока службы, и один или несколько отдельных потоков для выполнения своей реальной работы. Вы хотите, чтобы отдельные потоки выполнялись для реальной работы (вместо того, чтобы кодировать их в обработчиках событий вашего потомка TService), чтобы поток, в котором работает сам TService, всегда был свободен для ответа на управляющие коды от SCM, и вы все равно могли остановиться и запускать службу, даже если по какой-либо причине рабочий поток заморожен.

Этот подход также позволяет отлаживать код приложения-службы, но включает в себя значительное количество кода и размещение нескольких хуков в функциях Windows API для правильной работы. Слишком много, чтобы показать здесь в короткие сроки. Может быть, когда-нибудь я напишу об этом в статье.

В то же время, если вы не хотите кодировать все это самостоятельно, у вас есть два варианта. Либо воспользуйтесь библиотекой, такой как SVCOM, либо библиотекой, упомянутой Миком, которая сделает все за вас, либо в режиме отладки обойдите служебный код все вместе и «просто» запустите свою службу как «обычное» приложение форм. Вам придется отделить реальную функциональность вашего сервиса от обработчиков кода / событий вашего потомка TService, но это то, что я бы порекомендовал в любом случае по причинам, указанным выше.

...