假设我有一个C#WinForms应用程序,只需使用Process.Start(MyModule.exe)
即可由外部程序启动。
我尝试使用我的项目属性 - &gt; 调试 - &gt; 启动操作 - &gt; <来调试我的代码strong>启动外部程序(当然设置正确的工作目录)。
我的另一个尝试是调试 - &gt; 附加到流程
更新:我的模块和外部程序都使用一个资源。所以外部程序释放它,然后调用Process.Start(),等待我的进程退出ans然后再次捕获资源。所以当你的程序已经运行时我无法附加。
两个都失败了 - Program.cs 中的断点从未被击中。
那么,在这种情况下如何调试我的代码呢?
答案 0 :(得分:7)
我知道有两种方法可以轻松解决这个问题。第一种方法是让你的程序请求一个调试器附加到它,这是它通过Debugger.Launch()
public static void Main(string[] args)
{
Debugger.Launch();
//Rest of your code here
}
这将显示如下所示的对话框
这将允许您附加到正在运行的Visual Studio或启动新实例。
当你不能使用前面的方法(例如我不认为它在服务中工作)时解决这个问题的另一种方法是在你的代码的开头放一个循环,它将永远循环,直到附加一个调试器,这使您有足够的时间来执行您之前尝试过的“附加到进程”方法,而不会让程序进展。
public static void Main(string[] args)
{
while(!Debugger.IsAttached)
{
Thread.Sleep(1000); //Sleep 1 second and then check again.
}
//Rest of your code here
}
答案 1 :(得分:0)
您可以使用两种不同的方法System.Diagnostics.Debugger.Launch()
或System.Diagnostics.Debugger.Break()
第一种方法会附加调试器(让您选择哪种方式),然后不执行任何操作。在已经连接一个的情况下,什么都不会发生。
在未附加调试器的情况下,后者将完全与Launch
完全相同,并且如果连接了调试器,则将作为断点。
所以,只需将System.Diagnostics.Debugger.Break();
写在您想要断点的位置即可。
这将导致出现一个对话框,询问您希望如何调试程序(这当然也意味着您应该在完成调试时删除该行)
在对话框中选择适当的VS实例(或创建一个新的),然后像往常一样继续调试