如何跟踪和调试Windows服务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何跟踪和调试Windows服务相关的知识,希望对你有一定的参考价值。

1、调试windows 服务是system级别的所有在win7或win8下一定要以管理员身份启动,启动后添加新建项目windows服务
确定就建立了一个windows服务程序
2、程序入口点自然在program中 main函数 跟控制台程序有点相似
static class Program

/// <summary>
/// 应用程序的主入口点。
/// </summary>
static void Main()

ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]

new Service1()
;
ServiceBase.Run(ServicesToRun);


public partial class Service1 : ServiceBase

public Service1()

InitializeComponent();

protected override void OnStart(string[] args)


protected override void OnStop()


参考技术A debug、winprep、perfmon、sysinternals

如何在Windows下暂停和恢复任何外部进程?

我正在寻找不同的方法来通过Windows XP下的进程ID以程序方式暂停和恢复某个特定进程。

进程暂停恢复工具 做到 SuspendThread ResumeThread 但对多线程程序和死锁问题发出警告。

PsSuspend 看起来还不错,但我不知道它是否对死锁有什么特别的作用,或者使用其他方法?

首选语言 : C++ Python

答案

如果你 "调试调试器"(例如,使用 logger.exe 来跟踪所有由 windbg.exe),看来调试器使用的是 SuspendThread()ResumeThread() 来暂停正在调试的进程中的所有线程。

PsSuspend可能会使用不同的方式来暂停进程(我不确定),但它仍然有可能挂起其他进程:如果你暂停的进程持有另一个进程所需要的共享同步对象,你可能会阻止另一个进程取得任何进展。如果两个程序都写得很好,当你恢复被暂停的那个程序时,它们应该会恢复,但不是所有的程序都写得很好。如果这导致你的程序暂停,那么你就有一个死锁。

另一答案

我不知道这样做是否有效果,但是用MS Systernals的ProcessExplorer,你可以暂停一个进程。

这里已经说过了。https: /superuser.coma155263 我也是在那里找到的。

另一答案

阅读 此处 你也有psutil的python,你可以使用它这样的。

>>> import psutil
>>> pid = 7012
>>> p = psutil.Process(pid)
>>> p.suspend()
>>> p.resume()
另一答案

我测试过 http:/www.codeproject.comKBthreadspausep.aspx 在一些软件上。

运作良好。

PsSuspend和Pausep是两个有效的选项。

另一答案

所以,当我发现 暂停按钮, Googling for this ("windows SIGSTOP"), get this question as the first search result (thanks Ilia K.) 您的评论 做了它的工作),看了答案,我又去查了一下代码。

显然它使用了未被记录的NT内核和Win32 APIs。_NtSuspendProcess, _NtResumeProcess_HungWindowFromGhostWindow.

PsSuspend,你提到的并链接到的实用程序可能使用了这些API,我无法验证这一点,源代码没有提供,只有可执行文件和EULA,你大概可以通过拆解二进制文件来弄清楚,但这是违反EULA的。

所以,为了回答你的具体问题,请查看 暂停按钮的主。cpp, 基本上 你所谓 _NtSuspendProcess(ProcessHandle)_NtResumeProcess(ProcessHandle), ProcessHandle 是要暂停或恢复的进程的句柄。

另一答案

我认为Windows中没有SuspendProcess()函数是有原因的。有了这样一个函数,就会为一个不稳定的系统打开大门。你不得暂停一个进程,除非你自己创建了那个进程.如果你自己写了那个进程,你可以使用一个事件(参见MSDN中的::SetEvent()等)或其他种类的消息来触发进程中的暂停命令。

以上是关于如何跟踪和调试Windows服务的主要内容,如果未能解决你的问题,请参考以下文章

如何在C#中跟踪和停止正在运行的应用程序(Windows服务)

如何在Visual Studio中调试Windows服务?

如何在调试模式下运行 wildfly,作为 Windows 上的服务?

Windows COM - 如何调试 COM 服务器

使用Azure Monitor监控服务运行状态

VC++ ATL编写的Windows系统服务程序如何运行设置断点调试