[debug]System.Diagnostics.Debugger
December 14th, 2010
2 comments
System.Diagnostics.Debugger类,日常我们软件开发过程中,通常很少使用,甚至不为大多数人所知。然而,在某些特定的情况下,我们几乎只能求救于Debugger类,例如无法通过调试器启动的程序在启动时,我们来不及附加进程到调试器就已经执行的代码。
windows service程序的调试,就属于之前提及的情况。首先我们无法通过VS启动windows service服务进程并附加到调试器;其次,当我们手动附加windows service程序进程到调试器时,程序代码或许早就执行完我们想调试的代码(如服务启动前的初始化动作、OnStart()事件等),不知道跑哪里去了。
现在,咱们来看看Debugger类能干什么。
Debugger.Launch()方法,便能在运行时检测当前程序进程是否连接了任何调试器,如果未连接,则会询问用户是否要连接调试器。
Debugger.Break()方法,与Debugger.Launch()行为类似,如果连接调试器后,则通过用户断点事件向调试器发出信号,调试器将暂停进程的执行,就像已击中调试器断点一样。
从表现的行为来看,Debugger的Break()/Launch()方法触发一个系统异常,系统捕获到异常后,尝试让用户选择调试器进行调试。实际上与我们手动抛出一个未捕获的ApplicationException后表现出的行为差距不大。
以下代码示例,演示如何在windows service执行OnStart()方法时,尝试连接调试器进行调试代码。
using System.Diagnostics; public partial class MyService : ServiceBase{
public MyService(){
InitializeComponent();
}
protected override void OnStart(string[] args){
#if DEBUG
Debugger.Launch(); //Launches and attaches a debugger to the process.
#endif
// TODO: add your initialize code here.
} protected override void OnStop(){
}
}