在代码中启动调试器

本文关键字:调试器 启动 代码 | 更新日期: 2023-09-27 18:07:21

我需要调试从一键式安装启动的应用程序。(vs2010, Excel基于提供给一键安装程序的登录凭据,用户应该看到两个启动页面中的一个。这在我的机器上运行良好,但在部署时,从默认页面更改为第二个启动页面会导致错误。

为了我的生命,我不知道如何从VS2010中调试过程。我可以在输入凭据之前附加到登录,但我不能附加到Excel,因为它直到我点击OK按钮才启动。

所以,有没有办法有Excel,或者更确切地说,我的代码调用调试器,因为它是实例化,所以我可以找出为什么我的图像资源不可用在部署的应用程序?

谢谢。

兰迪

在代码中启动调试器

System.Diagnostics.Debugger.Launch();

最简单的

从代码中强制一个断点使用:

if (System.Diagnostics.Debugger.IsAttached)
    System.Diagnostics.Debugger.Break();

当应用程序未在Visual Studio中启动时(包括远程调试)

有时应用程序无法从Visual Studio启动,仍然需要调试。我使用此代码来检查Visual Studio是否正在运行,并提供一种将其附加到Visual Studio的方法。

using System.Diagnostics;
....
// get debugger processes
Process[] procName1 = Process.GetProcessesByName("devenv");
// get remote debugging processes
Process[] procName2 = Process.GetProcessesByName("msvsmon"); 
// If Visual Studio or remote debug are running halt the application by showing a MessageBox and give opportunity to attach the debugger
if (procName1.Length > 0 || procName2.Length > 0)
{
    if (MessageBox.Show(Application.Current.MainWindow, "Force breakpoint?", "Wait for debugger attach", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
    {
        // Force a breakpoint when the debugger became attached
        if (System.Diagnostics.Debugger.IsAttached)
            System.Diagnostics.Debugger.Break(); // force a breakpoint
    }
}

今天我需要一个主机应用的解决方案。

using System.Diagnostics;
....
// Wait for debugger attach and force breakpoint
// for a console app
//
if (!System.Diagnostics.Debugger.IsAttached) // not needed when debugger is already attached
{
    /// for "eternal" wait (~ 68 years) use: 
    ///     int waitTimeout = int.MaxValue 
    int waitTimeout = 60; 
    // get debugger processes
    Process[] procName1 = Process.GetProcessesByName("devenv");
    // get remote debugging processes
    Process[] procName2 = Process.GetProcessesByName("msvsmon");
    // If Visual Studio or remote debug are running halt the application by showing an message and give opportunity to attach the debugger
    if (procName1.Length > 0 || procName2.Length > 0)
    {
        while (true)
        {
            Console.WriteLine("Visual studio is running | Force breakpoint? (Attach the debugger before pressing any key!)");
            Console.WriteLine("[Y]es, [No]");
            DateTime beginWait = DateTime.Now;
            while (!Console.KeyAvailable && DateTime.Now.Subtract(beginWait).TotalSeconds < waitTimeout)
            {
                Thread.Sleep(250); // sleep 1/4 second
            }
            if (!Console.KeyAvailable)
            {
                break; // timeout elapsed without any kepress
                //<----------
            }
            var key = Console.ReadKey(false);
            if (key.Key == ConsoleKey.Y)
            {
                if (System.Diagnostics.Debugger.IsAttached)
                {
                    System.Diagnostics.Debugger.Break(); // force a breakpoint
                    break; // leave the while(true)
                    //<----------
                }
                else
                {
                    Console.WriteLine("No debugger attached");
                    Console.WriteLine("");
                }
            }
            else if (key.Key == ConsoleKey.N)
            {
                break; // leave the while(true)
                //<----------
            }
            Console.WriteLine("");
        }
    }
}

Juan的答案是最好的,如果你已经安装了Visual Studio。但如果目标机器没有它,你可能需要进行某种暂停(我通常会在main中首先放置一个对话框,让它等待我附加),然后使用远程调试器在你的机器上附加它

你可以连接到Excel,如果它运行的时间足够长,但严重的我怀疑错误是存在的。

你可以附加到正在运行的应用程序/进程,如果符号可用(调试构建),你可以真正调试,但应用程序必须存活足够长的时间,以便你选择它来附加。

我认为,从你所说的,你需要的是适当的异常和错误日志,任何像Log4Net或NLog存储的一切(堆栈跟踪,异常细节…)在每个异常,所以你会清楚地确定真正的问题是什么。