如何使用Delphi调试Windows服务?

Dan*_*llo 26 delphi debugging service windows-services

有没有办法用Delphi完全调试Windows服务?

jas*_*nny 25

您可以使用Colin Wilson的NT低级实用程序中的 unitDebugService.pas (页面已经消失,可在返回机器中使用)

然后在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.
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以在Delphi中运行调试(通过设置项目调试器参数),使用EXE作为服务,或者使用-DEBUG交换机从命令行运行,以及.


Sco*_*ens 19

这实际上非常简单.只需使用标准的DEBUG编译器指令即可将服务作为控制台应用程序而非服务启动.

program MyServiceApp;

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

uses
  System.SysUtils,
Run Code Online (Sandbox Code Playgroud)

[..]

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.
Run Code Online (Sandbox Code Playgroud)


小智 14

使用运行 - >附加进行处理.这样,您可以调试服务,而无需对其代码进行任何更改.唯一棘手的部分可能是调试服务启动代码,因为附加可能需要一些时间,并且启动必须在30秒内完成(尽管您可以调整Windows以允许更长的时间).您可以使用延迟(睡眠...)来允许您及时附加,或者如果您只是需要查看会发生什么,您可以使用OutputDebugString()打印到调试输出(使用Delphi事件视图查看它).


Mic*_*ick 6

是的,有: 调试服务:一种简单的方法

你用Delphi创建服务吗?那么也许你每次都会以耗时的方式对启动,重启,查杀和附加到服务流程应用程序感到恼火.好吧,有补救措施.

你不需要这样做.而是将Delphi作为SYSTEM应用程序运行,并对服务代码进行一些小的调整.


Ale*_*lex 5

我试过这个,但只出现带有汇编代码的cpu窗口.

那你只应该解决这个问题.

基本上,要调试Win2服务,有几种方法:

  • 使用"附加到进程"命令将调试器附加到已运行的服务.如果需要在一开始就附加,可以插入启动延迟以有时间附加调试器.但是,您还必须调整系统以增加服务超时.
  • 使用"映像文件执行选项"注册表项在服务启动时强制运行Delphi的调试器.有关系统超时的相同注意事项适用.
  • 临时将服务转换为常规应用程序并在调试器下正常运行.您可以在不同的用户帐户下重新启动IDE以获得"服务"的更多权限.

如果由于某种原因在开始调试后只有您的服务的CPU视图 - 这意味着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. 运行您的服务.