Подтвердить что ты не робот

Как отладить службу Windows с помощью Delphi?

Есть ли способ полностью отлаживать службу Windows с помощью Delphi?

4b9b3361

Ответ 1

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

а затем в DPR:

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 с помощью отладки (путем установки параметров Debugger проекта), использовать EXE в качестве службы или запустить из командной строки с помощью переключателя -DEBUG и.

Ответ 2

На самом деле это довольно просто. Просто используйте стандартную директиву компилятора 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.

Ответ 3

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

Ответ 4

Да, есть: Отладочные услуги: простой способ

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

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

Ответ 5

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

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

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

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

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

  • Убедитесь, что папка вывода для вашего приложения-службы установлена ​​в папку, из которой она будет загружена системой. То есть если ваша служба находится в C:\Windows\System32 - затем установите выходную папку в C:\Windows\System32. Не копируйте файл .exe в другое место из выходной папки. Для 64 систем вы можете попробовать псевдоним (sysnative/SysWOW64) или настоящее имя. Я думаю, что лучше всего установить выходной путь к папке проекта и перерегистрировать службу для загрузки из папки проекта.
  • (Необязательно) Задайте путь вывода для DCU в ту же папку, что и файл .exe.
  • Удалите все файлы DCU.
  • Обязательно включите параметры отладки на странице "Компилятор" в параметрах проекта.
  • (необязательно) Дополнительно вы также можете указать параметры TD32/RSM/MAP на странице "Linker".
  • Убедитесь, что нет эксперта/расширения IDE, который может изменить файл .exe, отладочную информацию или дату изменения файла для этих файлов.
  • Убедитесь, что в других местах нет старых файлов (DCU/exe).
  • Сделайте полную перестройку (Project/Build all).
  • Запустите службу.

Ответ 6

Да, есть.

В вашем dpr:

Application.CreateForm(TMyService, MyService);

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

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

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

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

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