在生产中调试应用程序

时间:2014-10-04 00:15:14

标签: c# winforms remote-debugging

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

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文件,如何在客户机中失败?而不是我的。

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

您有任何我可以使用的建议或工具

2 个答案:

答案 0 :(得分:3)

解决方案1:告诉应用程序等待您准备好

如果可以更改应用程序,则可以设置命名事件并等待它。 然后,创建另一个设置该事件的应用程序。然后执行以下操作:

  1. 启动您的申请。它将等待事件设置
  2. 附加调试器。
  3. 使用目标系统上的小应用程序,设置事件。
  4. 之后,您的应用程序将继续执行,您将能够进行调试。

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

    解决方案2:添加日志记录和异常处理

    您可以使用nlog之类的免费库向应用程序添加日志记录。这将有助于您的流程。您还可以添加try catch块,并在此时将异常与堆栈一起记录。

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

答案 1 :(得分:0)

有太多的场景,应用程序在开发机器中运行得很好,根本无法运行或在其他机器上崩溃。首先考虑客户端计算机的环境与开发环境的不同之处。例如:

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

关于正确的调试方法,您应该考虑诱导应用程序在崩溃时创建minidump文件的方法(请参阅this question),然后使用WinDbg + SOS使用VS调试应用程序(除非您'重新使用Visual Studio 2013 Ultimate,在这种情况下你可能根本不需要WinDbg / SOS。