如何用OD调试windows服务程序

如何用OD调试windows服务程序,第1张

第一方法:

这种方法其实说起来不叫调试,也是一种笨办法,就是用MessageBox把一些程序的中间信息输出来,方便你找出程序是在哪个地方出问题了,你也可以在try catch中使用,用MessageBox把异常d出来,这种方法也比较直观。可惜,实现起来也有问题。我们首先要添加using System.Windows.Forms的引用,然后加上一行代码MessageBox.Show(ex.ToString(), "Error")本以为这样说行了,可是把服务重新编译生成,并安装启动后,它并没有d出框来。百思不得其解。幸好,在服务的程序里面,启用了系统的日志,它会把相关的异常记录到系统日志中去,在“计算机管理”的“事件查看器”里面可以找到。果然发现了一个,

显示的信息是

“当应用程序不是以 UserInteractive 模式运行时显示模式对话框或窗体是无效 *** 作。请指定 ServiceNotification 或 DefaultDesktopOnly 样式,以显示服务应用程序发出的通知。”

直接百度,找到了一个答案,原来是调用MessageBox时,还需要设置它的MessageBoxOptions属性为DefaultDesktopOnly。修改如下:

MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly)

然后再次重新编译,安装并启动,OK,顺利的d出了错误的信息。

第二种方法:

第二种方法就是真正的调试,其实Windows服务还是可以调试的,应该说任何一种类型的程序都应该能调试,别人在开发编译器的时候就人考虑到的。下面来看具体的方法。

我们知道,任何一个程序都有一个对应的进程,如果你的Windows服务启动后,也会有一个对应的进程。通过任务管理器,就能看到。

我们可以通过VS编译器里面,提供的“附加到进程”这个功能来进行调试。首先你打开你的Windows服务源程序,在里面设置一个断点,例如在OnStart方法中protected override void OnStart(string[] args){}中,然后把你的服务启动,启动过后,在VS的“调试”一栏中找到“附加到进程”

在进程列表里面找到你的进程,

如果没有的话,就把左下角的“显示所有用户的进程”前面的勾选中,然后你就可以找到你的Windows服务的进程了,然后点击确定即可。

点击确定后,可能你等了半天,也没看见它命中断点。哈哈,不要急,前面说漏了一点,我们是先启动的服务,然后再附加的进程,因为服务一启动,就会执行OnStart方法,这时,我们还没有把这个服务的进程附加到VS中去呢?所以在OnStart方法中设置的这个断点肯定不会命中。所以我们需要想个办法,也就是加一个定时器,我们在OnStart方法中启动这个定时器,然后设置这个定时器的时间间隔为1分钟,然后在这个定时器的事件中去设置一个断点。这样把服务重新生成,安装并启动后,把这个进程附加到VS中去,1分钟过后,你就会看到,它命中了断点。不过有一个前提就是,你必须在1分钟内把这个进程附加到VS中去,否则的话,它还是命中不了。

如果还有问题的话,就检查一下,看你的Windows服务是不是在Release模式下生成的,如果是的话,要把它改成在Debug模式下生成。

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()

{

}

}

由于服务必须从服务控制管理器的上下文中运行,而不是从 Visual Studio .NET 中运行,因此调试服务不像调试其他 Visual Studio 应用程序类型那样简单。若要调试服务,必须首先启动服务,然后将一个调试器附加到正在运行服务的进程中。然后可以使用 Visual Studio 的所有标准调试功能来调试应用程序。

调试 OnStart 方法可能比较困难,因为 Windows 服务管理器将所有尝试启动服务的时间限制在 30 秒内。调试 Windows 服务。

安装您的服务。

可从服务控制管理器、“服务器资源管理器”或代码启动服务。

在 Visual Studio 中,从“调试”菜单中选择“进程”,出现“进程”对话框,单击“显示系统进程”。

在“可用进程”区域内单击服务的进程,然后单击“附加”。

提示 此进程将与服务的可执行文件同名,出现“附加到进程”对话框。

选择任意适当选项,然后单击“确定”关闭对话框。注意 现在已处于调试模式。

设置要在代码中使用的任意断点。

访问服务控制管理器并 *** 纵服务,并发送停止、暂停和继续命令以命中您的断点。

回答不容易,希望能帮到您,满意请帮忙采纳一下,谢谢 !


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7738888.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存