在代码中启动调试器
本文关键字:调试器 启动 代码 | 更新日期: 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存储的一切(堆栈跟踪,异常细节…)在每个异常,所以你会清楚地确定真正的问题是什么。