【问题标题】:debug application in production [closed]在生产中调试应用程序[关闭]
【发布时间】:2014-11-29 01:39:57
【问题描述】:

在我的开发环境中,我的应用程序运行,然后当我将它安装在客户端机器上时它没有启动,我唯一想知道原因是显示一个消息框,但有异常:

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 文件,这怎么可能在客户端计算机中失败?而不是我的。

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

你有什么我可以使用的建议或工具

【问题讨论】:

  • 您是否考虑过将异常记录到文件中?此外,如果您可以访问完整的堆栈跟踪,而不仅仅是异常消息,您将获得更好的信息。

标签: c# winforms remote-debugging


【解决方案1】:

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

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

  1. 启动您的应用程序。它将等待事件被设置
  2. 附加调试器。
  3. 使用目标系统上的小应用程序,设置事件。

之后,您的应用程序将继续执行,您将能够对其进行调试。

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

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

您可以使用像nlog 这样的免费库向应用程序添加日志记录。这将帮助您处理流程。您还可以添加 try catch 块并将异常与堆栈一起记录。

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

【讨论】:

  • 等待 System.Diagnostics.Debugger.IsAttached 不是更简单吗?
  • 很酷的小功能,谢谢!
  • 你能给我一个线索@allonym,我的问题是因为我不知道制作这个的工具
  • 在您的应用程序的入口点,在其他任何事情之前,编写一个 while 循环,直到 System.Diagnostics.Debugger.IsAttached 变为 true。在循环中稍作等待,以防止它旋转得太紧。这将使您有机会附加远程调试器;附加调试器后,循环将结束。
【解决方案2】:

应用程序在开发机器上运行良好而在其他机器上完全无法运行或崩溃的情况太多了。首先考虑客户端机器的环境与您的开发环境有何不同。例如:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    • 2015-01-23
    • 1970-01-01
    相关资源
    最近更新 更多