C# 调试在生产中的应用

C# 调试在生产中的应用,c#,winforms,remote-debugging,C#,Winforms,Remote Debugging,在我的开发环境中,我的应用程序运行,然后当我将其安装到客户端计算机中时,它没有启动,我唯一想看到原因的方法是显示一个消息框,例外情况如下: AppDomain.CurrentDomain.UnhandledException += delegate(object sender, UnhandledExceptionEventArgs args) { var exception = (Exception) args.E

在我的开发环境中,我的应用程序运行,然后当我将其安装到客户端计算机中时,它没有启动,我唯一想看到原因的方法是显示一个消息框,例外情况如下:

AppDomain.CurrentDomain.UnhandledException
            += delegate(object sender, UnhandledExceptionEventArgs args)
            {
                var exception = (Exception) args.ExceptionObject;
                MessageBox.Show("El programa se ha detenido debido a un error interno: " + 
                       Environment.NewLine + exception.Message + exception);
                Environment.Exit(1);
            };
这将显示下一条消息

对象引用未设置为对象的实例。controli.Program.Main()

我对这个异常很熟悉,但不是在
Program.cs
文件中,这怎么可能在客户机中失败呢?而不是我的

最后,我了解了远程调试,但问题是它只允许连接到已经启动的进程,并且我的应用程序在加载时抛出

您是否有任何建议或工具可供我使用

解决方案1:告诉应用程序等待,直到您准备就绪 如果可以更改应用程序,可以设置一个命名事件,然后等待它。 然后,创建另一个设置该事件的应用程序。然后执行以下操作:

  • 启动您的应用程序。它将等待事件被设置
  • 附加调试器
  • 在目标系统上使用小应用程序,设置事件
  • 之后,您的应用程序将继续执行,您将能够调试它

    如果您不熟悉命名事件,请查看此

    解决方案2:添加日志记录和异常处理 您可以使用一个免费的库,比如向应用程序添加日志记录。这将帮助您处理流程。您还可以添加
    try-catch
    块,并在该点将异常与堆栈一起记录

    请注意,即使您的应用程序使用多个线程,nlog也支持分别记录每个线程。

    解决方案1:告诉应用程序等待,直到您准备好为止 如果可以更改应用程序,可以设置一个命名事件,然后等待它。 然后,创建另一个设置该事件的应用程序。然后执行以下操作:

  • 启动您的应用程序。它将等待事件被设置
  • 附加调试器
  • 在目标系统上使用小应用程序,设置事件
  • 之后,您的应用程序将继续执行,您将能够调试它

    如果您不熟悉命名事件,请查看此

    解决方案2:添加日志记录和异常处理 您可以使用一个免费的库,比如向应用程序添加日志记录。这将帮助您处理流程。您还可以添加
    try-catch
    块,并在该点将异常与堆栈一起记录

    请注意,即使您的应用程序使用多个线程,nlog也支持分别记录每个线程。

    解决方案1:告诉应用程序等待,直到您准备好为止 如果可以更改应用程序,可以设置一个命名事件,然后等待它。 然后,创建另一个设置该事件的应用程序。然后执行以下操作:

  • 启动您的应用程序。它将等待事件被设置
  • 附加调试器
  • 在目标系统上使用小应用程序,设置事件
  • 之后,您的应用程序将继续执行,您将能够调试它

    如果您不熟悉命名事件,请查看此

    解决方案2:添加日志记录和异常处理 您可以使用一个免费的库,比如向应用程序添加日志记录。这将帮助您处理流程。您还可以添加
    try-catch
    块,并在该点将异常与堆栈一起记录

    请注意,即使您的应用程序使用多个线程,nlog也支持分别记录每个线程。

    解决方案1:告诉应用程序等待,直到您准备好为止 如果可以更改应用程序,可以设置一个命名事件,然后等待它。 然后,创建另一个设置该事件的应用程序。然后执行以下操作:

  • 启动您的应用程序。它将等待事件被设置
  • 附加调试器
  • 在目标系统上使用小应用程序,设置事件
  • 之后,您的应用程序将继续执行,您将能够调试它

    如果您不熟悉命名事件,请查看此

    解决方案2:添加日志记录和异常处理 您可以使用一个免费的库,比如向应用程序添加日志记录。这将帮助您处理流程。您还可以添加
    try-catch
    块,并在该点将异常与堆栈一起记录


    请注意,即使您的应用程序使用多个线程,nlog也支持分别记录每个线程。

    在太多的情况下,应用程序在开发机器上运行正常,而在其他机器上运行失败或崩溃。首先考虑客户机的环境与您的开发环境有何不同。例如:

    • 这两种环境中是否存在与安全相关的差异 是否会导致应用程序在其中一个应用程序中崩溃,而不是在另一个应用程序中崩溃
    • 客户端机器的.NET安装和配置是否适合您的应用程序
    • 等等

    关于正确的调试方法,您应该考虑诱导应用程序在崩溃时创建一个MIDIDUMP文件(见),然后使用Valbg+SOS使用VS对应用程序进行调试(除非您使用Visual Studio 2013终极版,在这种情况下,您可能根本不需要WANDBG/SOS)。.

    有太多的场景,在这些场景中,应用程序在开发机器中运行正常,而在其他机器中根本无法运行或崩溃。首先考虑客户机的环境与您的开发环境有何不同。例如:

    • 这两种环境中是否存在与安全相关的差异 是否会导致应用程序在其中一个应用程序中崩溃,而不是在另一个应用程序中崩溃
    • 客户端机器的.NET安装和配置是否适合您的应用程序
    • 等等

    关于正确的调试方法,您应该考虑诱导应用程序创建MIDIDUM FI的方法。