【问题标题】:Troubleshooting a deployed c# program对已部署的 c# 程序进行故障排除
【发布时间】:2011-07-12 21:11:42
【问题描述】:

过去几周我一直在编写一个 c# 程序,文本构建刚刚获得最后的批准。我通过 Visual Studio 发布了它,将安装程序包发送给了我的客户,但它根本无法在他们的计算机上运行。为了测试,我在他们的设备上安装了我自己拥有的完全相同的二进制文件。它是一个以一系列弹出窗口开始的程序,在最后一个弹出窗口之后,程序只是关闭而不是打开主窗口。我知道如果无法访问我的资源和客户的计算机故障排除是不可能的,但坦率地说,我什至不知道从哪里开始。我能得到一些关于看什么的建议吗?我们都在运行 Windows 7,虽然我有 64 位版本,但我认为这不会有什么不同,尤其是在程序开始运行之后。

关于从哪里开始寻找的任何建议?

编辑 我的解决方案依赖于一个自定义控件库,该控件库直到(我猜)程序失败的 this.Show() 命令才会出现。有没有办法检查它是否不包括在内,但是,因为它是在我的计算机上构建的,所以引用在那里工作?我问是因为发布按钮只是命名我的项目而不是整个解决方案,尽管当我构建它时,它在我的计算机上运行良好,并且项目将库设置为其依赖项中的依赖项。

【问题讨论】:

  • 您是否在您的应用中实现了日志功能?如果没有,那么这样做不会帮助您立即纠正,建议您进行长期发展。
  • 看看eventlog,有没有消息?
  • 您是否在使用任何不附带标准 .net 运行时框架的外部库?如果是这样,所有这些都安装在目标计算机上吗?
  • @Avada 好名字,除非 Excel 互操作不是框架的一部分?我不确定如何找到它,我假设我导入的所有东西都是。
  • @Vlad,有一个 .NET 运行时说它由于未处理的异常和 KernelBase.dll 上的应用程序错误而关闭 - 这是什么意思?

标签: c# deployment publishing


【解决方案1】:

我建议您看一下 Windows 事件查看器。最有可能的是,它包含有关崩溃的一些有用信息。此外,可以远程调试您的应用程序,如How to: Set Up Remote Debugging 中所述。这就是我会做的。此外,尝试通过订阅Application.UnhandledException 和AppDomain 的UnhandledException 事件来捕获应用程序中引发的所有异常。这将允许您获取调用堆栈。

【讨论】:

  • 我们应该在事件查看器中的哪个位置?在应用程序下,我的子视图是 WLAN、Cisco、Hardware、IE、Key Management、Media Center、Microsoft、Microsoft Office Alerts 和 Windows PowerShell,这些听起来都不是很合适......
  • 有一个 .NET 运行时说它由于未处理的异常和 KernelBase.dll 上的应用程序错误而关闭 - 你猜到了吗?
  • 由于您可以访问客户端计算机,因此请尝试使用我在回答中提到的事件来获取调用堆栈。这将为您提供有关该错误的更多信息。恐怕没有人会使用这些信息告诉你真正的原因:(
  • 由于您要发布应用程序,请转到“属性”对话框中的“应用程序发布”选项卡,然后单击“应用程序文件”按钮。请确保所有必需的程序集都设置为包含到您的应用程序的已发布版本中。
【解决方案2】:

从关于 Excel Interop 正在使用的评论中,我从 MSDN 得到了这个。这可能很明显,但无论如何。

  1. 您必须在系统上安装 Excel,此代码才能正常运行。

  2. 要使用 COM 互操作,您必须具有管理员或高级用户安全权限。有关安全性的详细信息,请参阅 .NET Framework 安全性。

在他们的示例中,他们使用以下代码。在您的启动代码中添加类似的检查可能会很好。

Microsoft.Office.Interop.Excel.Application xlApp;
xlApp = new Microsoft.Office.Interop.Excel.Application();
if (xlApp == null)
{
   Console.WriteLine("EXCEL could not be started. Check that your office installation and project references are correct.");
}

(注意:我自己从来没有使用过这个,所以我对此知之甚少,它纯粹是来自 cmets 的线索和一些在 MSDN 上的搜索)。

【讨论】:

    【解决方案3】:

    如果您可以对应用程序进行更改,您可以尝试使用Trace 输出或长期使用 log4net 等专用记录器记录任何引发的异常。此外,使用 DependencyWalker 查看依赖项可能很有用 - 如果您在运行时加载了程序集,64 位可能仍然是一个问题,您可能会得到著名的“BadImageFormat”异常。

    如果可以的话,我还会设置一个 Win 7 32 位 VM 以在“干净”机器上模拟客户端环境,这可能有助于重现问题。

    编辑以阐明跟踪配置:

    您可以在 app.config 中添加跟踪侦听器:

    <system.diagnostics>
        <trace autoflush="true" indentsize="4">
            <listeners>
                <add name="LogFileWriter" type="System.Diagnostics.TextWriterTraceListener" initializeData="C:\logs\FooApp.log"/>
            </listeners>
        </trace>
    </system.diagnostics>
    

    这将导致您程序中的所有Trace.Write() 语句写入您的日志(前提是您有权写入配置的文件夹)。

    【讨论】:

    • 你能链接一个资源吗?我用 try/catch 包围了整个 MainWindow(默认对象)构造函数,它应该将异常打印到 C 驱动器上的文件中,但没有任何乐趣。
    【解决方案4】:

    您的目标 CPU 是什么?也许您已将其设置为 x64,并且您的客户端运行在 32 位版本的 Windows 7 上

    【讨论】:

    • 针对 32 位,程序启动它只是没有完全进入。
    【解决方案5】:
    1. 添加日志可能性和(如果还没有)和“架构”它至少用于 “simple”“verbose” 日志记录,其中:

      简单:只是您可能需要阅读的常见信息

      详细:只是你能做的一切,或者有记录的意义(取决于你的应用程序)

    2. 确保您记录已处理的异常,并且能够通过您的AppDomain 的标准订阅处理甚至未处理的异常。
    3. 在每个窗口 Show() 和 OnClosing() 方法上添加日志(至少在那些挂起的窗口上)
    4. 验证操作系统是否在您的构建机器和客户端上相同
    5. 如果您的软件在某处写了一些东西,请确保您有足够的权限来执行此操作(简单的测试只是要求客户端运行您的程序以管理员身份
    6. 如果仍然无法正常工作,请启用详细模式并在客户端上运行应用程序并检查日志。

    迟早你会发现一些东西可能不会直接解释你的问题,但肯定会帮助你找到解决问题的正确方法。

    问候。

    【讨论】:

      【解决方案6】:

      曾经在与您的情况几乎相似的情况下帮助我的是在客户端计算机上安装来自 System Internals 的 DebugView 并部署应用程序的调试版本 (here's how to trace and debug from C#)。

      DebugView 将显示您的程序发出的所有调试消息,这可能会让您轻松找出问题所在。

      在安装 DebugView 和您的应用程序后,客户端将运行 DebugView,确保捕获处于活动状态,然后运行您的应用程序。您的所有调试消息(发送至System.Diagnostics.Debug)将显示在 DebugView 中,然后您的客户端可以将其保存到文件中并发送给您进行分析。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-12
        • 1970-01-01
        • 2017-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-05
        相关资源
        最近更新 更多