我有.NET程序,由于某些原因(从Excel 2010模板项目创建的Excel文件)无法从Visual Studio运行,我需要调试启动事件。
如果我想调试程序初始化后出现的事件,则没有问题。我从资源管理器运行该程序,将该过程附加到Visual Studio并在代码中添加一些断点。但在这里,我需要在启动事件上加上断点。我需要能够将进程附加到Visual Studio,不依赖于PID,而是依赖于特定的进程名称或任何其他可行的解决方案。
当然,在我的启动事件中添加Thread.Sleep(1000)
以便给我一些时间来在Visual Studio中附加该过程是不可能的!
答案 0 :(得分:81)
其实你可以;你没有附上它,你就开始了。在项目的属性上,在“调试”选项卡上,在“命令”文本框中指定要附加到的程序的路径。
您还可以在“命令参数”框中输入程序的任何命令行参数:
确保“附加”设置为“否”。
答案 1 :(得分:18)
我正在外部生成的进程中调试C ++插件,该进程在启动时抛出异常而崩溃,这对我来说非常有用:
添加免费Reattach Extension for Visual Studio。要求它在启动之前重新连接到进程名称。它会弹出一个模态对话框,说它正在等待进程名称启动。
现在启动该进程,Visual Studio调试器将立即附加,捕获异常并命中断点。
答案 2 :(得分:10)
如果您有Visual Studio 2017,请执行以下步骤:
比其他建议容易得多:您不必弄乱项目属性,也不需要扩展。
答案 3 :(得分:8)
当我寻找类似的东西时,我找到了这个答案。就我而言,我不能简单地将可执行文件用作我项目的启动程序,因为它需要在一个我无法轻易复制的特定环境中启动(namly:从cygwin开始)
我看了一下Reattach扩展名为suggested by mrstrange以及非常相似的Attach To Anything扩展名......但我的可执行文件似乎关闭得太快,无法通知和附加扩展名。
最终帮助我的是:https://stackoverflow.com/a/4042545/1560865,它引用了MSDN文章How to: Launch the Debugger Automatically,后者又列出了以下步骤:
debugger
。 vsjitdebugger.exe
。 希望将来能帮助其他人!
答案 4 :(得分:3)
如果没有进程,则Visual Studio无法附加。
但是,您可以将项目的启动程序设置为项目输出以外的其他程序。
答案 5 :(得分:3)
您可以通过以下方式从代码中启动调试器
public static void Main(string[] args)
{
System.Diagnostics.Debugger.Launch();
}
但是,请勿在发送应用程序之前删除此行。也许您想使用编译器标志来确保:
public static void Main(string[] args)
{
#if debug
System.Diagnostics.Debugger.Launch();
#endif
}
答案 6 :(得分:1)
一个可能适合很多人的小解决方案。
在exe运行的第一行代码中,添加此命令
System.Threading.Thread.Sleep(20000)
这将使exe在开始处理任何内容之前休眠20秒。然后你有20秒的时间来附加到进程,可以使用ctrl + alt + p快速完成,然后找到进程,然后输入attach。
答案不多,但对我来说是一种享受: - )
答案 7 :(得分:1)
您可以显示MessageBox,这会阻止应用程序,然后将调试器附加或重新附加到进程,然后单击“确定”继续:
public MainForm()
{
InitializeComponent();
MessageBox.Show("Attach process to debugger and click ok!");
}
你可以将它添加到Form构造函数中(如果你使用winforms),所以这将在其他任何东西之前执行,除了组件的初始化:
select distinct year, f3.NB
from tmpxx f1
left outer join lateral
(
select count(*) NB from tmpxx f2
where f1.year is null and f2.year is null or
f1.year>=f2.year
) f3 on 1=1
完成调试后,请注释掉该行。