Visual Studio应用程序启动时的远程调试

28

据我了解,目前使用远程调试器的唯一方法是启动目标应用程序,然后通过Visual Studio附加到它。是否有一种方式可以从程序一开始就捕获所有断点?

我的程序中有需要调试的代码,但我永远无法快速地附加调试器以捕获执行的代码。


@HaraldDutch在此提供了一个非常好的解决方案:https://dev59.com/K2Ik5IYBdhLWcg3wL7fj - eFloh
5个回答

18

如果你能更改代码,尝试在应用程序的起始点注入以下代码行:

System.Diagnostics.Debugger.Launch();

当程序执行到这一行时,它会提示您附加调试器,等待您的响应。由于您正在使用远程调试器,所以此时应该能够附加调试器,然后取消对话框。希望这可以帮助到您。


1
难道不应该是 System.Diagnostics.Debugger.Launch(); 吗?这是一个没有参数的方法调用,像任何语句一样需要在末尾加上分号。 - rory.ap
2
无效。应用程序将正常启动,这使得调试应用程序启动变得不可能。 - AH.

17

解决方案

System.Diagnostics.Debugger.Launch 

对我也没用。不过,我设法解决了我的问题,在我的应用程序启动时写入以下内容:

while (!System.Diagnostics.Debugger.IsAttached)
    System.Threading.Thread.Sleep(100);

这样应用程序将一直等待,直到调试器连接上。


2
这实际上是一个不错的解决方案。它被打包在#ifdef DEBUGendif中,不会干扰发布版本,并且在我调试我的机器时可以无缝运行。但是当我需要远程调试时,它只是等待。谢谢! - ecth

10
在目标机器上设置与本地机器Visual Studio版本相匹配的Visual Studio远程调试器。
注意该行代码会给出服务器名称。
在本地机器的Visual Studio中,打开启动项目的属性,然后打开调试部分。
勾选“使用远程机器”复选框,然后在文本字段中输入从Visual Studio远程调试器获取的服务器名称。
在“启动操作”下,选择“启动外部程序”。然后在字段中放置您希望在目标机器上启动的.exe文件的路径。
现在,当您从本地机器按下启动按钮时,它将附加调试器并在目标机器上启动程序。

1
这对我来说解决了问题。如此简单,我只是“假设”它只能在本地工作。 - FastAl
根据我注意到的旧的uservoice条目,这在VS 2017之前是不可能的。(然而,uservoice的Visual Studio实例已经消失了。) - MattTT
1
不要忘记将**工作目录**设置为有效的远程路径。(顺便说一句:对于我在VS 2022中的Makefile项目,这些字段的名称略有不同:_启动调试器_、_远程服务器名称_和_远程命令_) - MattTT
1
提示:您可以按照此答案的描述,在运行之前关闭构建。 - MattTT

4
使用Visual Studio Pro 2010构建.NET 4应用程序时,这对我无效。
显然,这是一个已知的错误:

https://connect.microsoft.com/VisualStudio/feedback/details/611486/debugger-launch-is-now-crashing-my-net-application-after-upgrading-to-net-4-0

一个(有点不太正规的)解决方法是在主窗口初始化时让应用程序弹出一个MessageBox(),这个方法对我来说有效。
public partial class MainWindow : Form
{
    public MainWindow()
    {
        // To allow you time to attach a remote debugger ...
        MessageBox.Show("Please attach debugger");

        InitializeComponent();
        ...

现在您可以随意附加VS远程调试器,然后在消息框上点击“确定”按钮。
丑陋但实用。

0

对我来说正确的解决方案是答案的结合。

while循环将检查Visual Studio是否附加了调试器,并在它被附加时退出循环。

        System.Diagnostics.Debugger.Launch();
        while (!System.Diagnostics.Debugger.IsAttached)
        {
            System.Threading.Thread.Sleep(100);
        }

实际上,这行代码 "System.Diagnostics.Debugger.Launch();" 不是必要的。 - AH.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接