[debug]System.Diagnostics.Debugger

December 14th, 2010 rex 2 comments

System.Diagnostics.Debugger类,日常我们软件开发过程中,通常很少使用,甚至不为大多数人所知。然而,在某些特定的情况下,我们几乎只能求救于Debugger类,例如无法通过调试器启动的程序在启动时,我们来不及附加进程到调试器就已经执行的代码。

windows service程序的调试,就属于之前提及的情况。首先我们无法通过VS启动windows service服务进程并附加到调试器;其次,当我们手动附加windows service程序进程到调试器时,程序代码或许早就执行完我们想调试的代码(如服务启动前的初始化动作、OnStart()事件等),不知道跑哪里去了。


现在,咱们来看看Debugger类能干什么。

Debugger.Launch()方法,便能在运行时检测当前程序进程是否连接了任何调试器,如果未连接,则会询问用户是否要连接调试器。

image

Debugger.Break()方法,与Debugger.Launch()行为类似,如果连接调试器后,则通过用户断点事件向调试器发出信号,调试器将暂停进程的执行,就像已击中调试器断点一样。

image

从表现的行为来看,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(){
    }
}
Categories: programmimg Tags: , ,