74

今天我遇到了一个问题,我需要远程调试程序。该程序是从另一个系统启动的,所以我真的没有机会在命令行上与它进行交互。不过,我可以轻松更改其来源。

我需要做的是让程序正常启动,然后等待我用调试器附加到它。我想不出一个让我开心的方法。我确实找到了错误,但没有调试器的帮助。

while(true) { }

让进程保持活力,然后我可以用调试器“设置下一条语句”,但这似乎很尴尬和粗鲁。

Console.ReadLine();

打字似乎很奇怪,因为实际上并没有控制台让我按下回车键。(它也不起作用。设置下一条语句,然后运行将带您回到 ReadLine() 等待。)

那么我可以将什么样的代码插入到 .NET/CLR/C# 程序中,上面写着“在这里等到我可以附加调试器”?

4

6 回答 6

135

您可以使用System.Diagnostics.Debugger.IsAttached属性来检查调试器是否附加到进程。此应用程序将等待,直到附加了调试器:

using System;
using System.Diagnostics;
using System.Threading;

namespace DebugApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Waiting for debugger to attach");
            while (!Debugger.IsAttached)
            {
                Thread.Sleep(100);
            }
            Console.WriteLine("Debugger attached");
        }
    }
}
于 2009-02-16T09:49:40.157 回答
24

这听起来正是您所需要的:

Debugger.Launch();

http://msdn.microsoft.com/en-us/library/system.diagnostics.debugger.launch.aspx

“启动并将调试器附加到进程。”

于 2010-09-14T17:45:52.887 回答
6

我不知道,因为我从未尝试过,但我想知道您是否可以使用System.Diagnostics.Debugger.Break()它来使其达到断点,然后等待调试器附加。我假设远程调试器可以工作,但我不确定并且目前无法访问我可以轻松模拟它并测试我的理论的家庭环境。有一篇MSDN 文章谈论在 ASP.Net 应用程序中使用它,所以我想它会起作用。

于 2008-12-11T21:55:19.080 回答
5

附加远程调试器的工作方式与使用本地调试器完全相同。

首先,照常做:

System.Diagnostics.Debugger.Launch();

您将看到选择调试器的提示。此时执行已暂停,因此您可以附加远程调试器并从提示中选择“否”。

于 2013-01-14T11:57:37.990 回答
1
Debug.Assert(true);

我猜也应该工作。顺便说一句,我有时也面临这个问题,我确实

MessageBox.Show() 

:P :P

于 2009-02-16T09:34:53.390 回答
-1

设置一个超时,让您有时间附加调试器。

Thread.Sleep(30000);
于 2008-12-11T21:55:24.073 回答