【问题标题】:Compact Framework 3.5 application crashing intermittently on CE7 / Motorola MC32N0Compact Framework 3.5 应用程序在 CE7/摩托罗拉 MC32N0 上间歇性崩溃
【发布时间】:2015-12-21 15:28:05
【问题描述】:

我们有一个使用 Compact Framework 3.5 的 C# 应用程序,在运行 Windows CE 5.0 和 Windows Mobile 的“移动计算机”上运行。

该应用程序在这些设备上运行良好,包括 Motorola/Symbol MC3190,运行 Windows CE 5.0。

现在,此 MC3190 已报废,由 Motorola/Symbol MC3200(也称为 MC32N0)取代。该设备运行 Windows CE 7.0 并预装了 Compact Framework 3.5。

我们的应用程序在此设备上间歇性且神秘地崩溃。

通过在我们的应用程序中打开和关闭许多表单,我可以在某种程度上一致地重现该问题。这些操作不会导致任何网络流量。有时我会在 30 秒内崩溃,有时需要 10 分钟的随机操作。

在某些时候,应用程序将完全冻结。按下 Windows CE 开始按钮将在冻结的应用程序上绘制开始菜单,但再次按下它不会隐藏开始菜单。

工具包中似乎存在某种无限循环,但我不知道它是什么。这是我尝试过的事情的清单:

  • 我对源库进行了许多更改(主要更改了表单的显示和处理方式)

  • 我尝试在连接到 VS 调试器时使应用程序崩溃,然后“全部中断”,但这只会停止,直到我硬重启设备。

  • 我尝试使用 .NET Compact Framework 远程性能监视器,它显示了有关垃圾收集等的有趣数字,但没有内存泄漏,也没有任何信息可以帮助我查明冻结。

    李>
  • 我尝试使用“CLR Profiler”,但在我的设备上出现了错误消息“连接时出现未知错误:RemoteInstall:不支持的指令集”。

  • 我曾尝试联系摩托罗拉支持,甚至将我的源代码发送给他们,但他们只是要求知道“哪个 API 导致了崩溃”(我希望他们能告诉我)

问题:

  • 有没有人在 MC32N0 上运行的 CF 应用程序上看到类似的崩溃?

  • 有人在 MC32N0 上使用 CLR Profiler 吗?

  • 有谁知道如何在冻结的 CF 应用程序上获得一种线程转储? (有点像 JVM 的 jstack)

  • 有没有人知道如何调试这个?

非常感谢任何帮助!

更新

设备在我身上发生了几次崩溃,并出现了视觉崩溃现象,如下所示:

http://i.stack.imgur.com/HAxt8.jpg

崩溃症状通常如下所示:

  • 快乐使用应用程序,世界各地无忧拣货
  • 突然间,应用程序不再处理键盘输入
  • 有趣的是,在这一点上,我通常能够聚焦不同的 TextBox,并且光标会在那里闪烁一会儿
  • 再进行几次交互后,系统完全锁定,Windows 开始按钮也无响应
  • 几次 - 我见过的大约 100 次崩溃中的 3 次 - 设备会产生如上图所示的崩溃模式

注意:我们的供应商交付了两台 MC3200 设备,它们都产生了崩溃,所以我很难相信这是硬件问题。

有人认识这些“症状”吗?有什么想法吗?

【问题讨论】:

  • 不幸的是(对我而言),我不得不使用这个充满炸弹的框架工作了几年;不幸的是(对你来说),《公主新娘》的一句话在这里适用:“习惯于失望。”

标签: c# .net compact-framework windows-ce


【解决方案1】:

我们在 MC32N0 上的应用程序遇到了同样的“锁定”问题。

Zebra 确实有一些工具可以让您更好地了解正在发生的事情。 eMscript 是您可以使用的一种工具,它将在后台运行并进行一些进程和资源监控。 RTLog(在设备上)可以为您提供一些信息,但仅对未捕获异常等严重故障有用。在我们的设备上,我们可以使用 FUNC-F9 启动 RTLog 转储,如果成功,设备会发出哔声,转储文件将位于设备的根目录中。

好的,经过数小时的调试/测试/重写代码,我们最终在一篇晦涩的帖子中发现锁定问题是由垃圾回收引起的。我们似乎锁定了表单转换,所以我们在导航之前所做的就是在基本表单的 Uninitialize() 方法中添加两行代码。

        GC.Collect();
        GC.WaitForPendingFinalizers();

幸运的是,我们所有的表单都是从一个基本表单派生的,所以我们只需要将它包含在一个位置。

我无法再找到该帖子,否则我将在此处引用它。这是微软的一篇文章,将问题描述为运行终结器时随机锁定,但他们也表示已更正。

从那以后,我们一直在运行,没有出现锁定问题。

希望这对某人有所帮助...

【讨论】:

    【解决方案2】:

    Symbol/Motorola/Zebra (SMZ) 的答案是“不好”。他们应该有工具在后台运行调试监视器以进行间歇性错误分析。

    您可以做的是启用错误报告,然后查看问题出现时是否创建了内核转储文件。但随后您需要 SMZ 再次提供帮助,因为 kdmp 文件必须与操作系统映像/固件构建的调试符号一起使用。内核转储中的地址和寄存器值会导致构建中存在问题的函数/API。

    如果没有内核转储,则不存在导致应用死锁的“本机”异常。如果可用,我会在设备上现有的顶部安装 CF35。还有支持扩展调试的 PowerTools:https://www.microsoft.com/en-us/download/details.aspx?id=47266

    Windows Embedded Compact 7 也有许多更新(似乎不再简称为 Windows CE7)。 OEM(此处为 Zebra Motorola Solutions)必须采用这些更新。在https://www.microsoft.com/en-us/download/details.aspx?id=50356 内部是一个存在已知问题的 html,称为“Windows Embedded Compact 7 月度更新 2015 年 11 月”。可能您可以避免使用已知问题。

    有关错误报告,请参阅https://msdn.microsoft.com/en-us/library/jj584896%28v=winembedded.70%29.aspx

    总结:

    • 尝试从 OEM 获取内核日志记录工具

    • 尝试打开错误报告

    • 试用适用于 WEC7 的 PowerTools

    • 尝试更新设备的固件

    • 尝试更新的 CF35(如果可用)

    • 避免 WEC7 更新列表中列出的已知故障功能。除了 OEM 确实在设备的操作系统版本中包含所有更新(他们可以随时执行或不执行)。

    • 切换到其他供应商/设备

    【讨论】:

    • 感谢您的评论约瑟夫。不幸的是,我没有收到任何异常或内核转储,操作系统只是完全冻结而没有给我任何继续。我在原始问题中添加了一些崩溃症状。我尝试使用不同版本的 CF35,但仍然存在崩溃。我确信这不是特定功能的问题,因为崩溃是随机发生的。
    • 这似乎是一个糟糕的操作系统映像。您是否更新到最新的操作系统映像 (portal.motorolasolutions.com/Support/US-EN/…)? - 再次联系 Zebra 支持寻求帮助,并提供调试选项。如果支持再次没有帮助,请忘记设备并更换为其他供应商。
    • 正要发表评论,才意识到这是一个僵尸线程。当这些在 SO 中回到顶部时,我会发疯
    【解决方案3】:

    多年来,我一直在使用这样的设备(以及 MC32N0),您所做的一切都是正确的。我通常也会做的唯一一件事就是尝试在功能上不断减少应用程序的副本,直到你最终得到一个小得多的东西来显示错误。然后尝试创建一个新的测试应用程序,让您更轻松地重现问题。

    希望一旦您知道它是什么,您就可以解决或修复它。或将其发送给 Zebra。我目前正在从 MC3190、MC2180 移植一个 .Net C# 应用程序,并且遇到了 MC32N0 的问题。我注意到调用 GC.Collect(); GC.WaitForPendingFinalizers();似乎正在使设备崩溃。需要在显示大图像后和在旧设备上使用它来回收内存。这与其他帖子之一的报道完全相反。

    当 CE 6 设备不发送扫描仪取消事件时,我也遇到了 EMDK 发送扫描仪取消事件的问题。它引起了问题,因为我的应用程序将它们误认为是扫描事件并做奇怪的事情。我现在忽略了它们,这似乎没问题。

    对于您的问题,我的猜测是它与内存有关,因此请寻找像图像或 GC 代码这样的大东西。可能检查控制面板内存小程序中的程序内存没有被意外设置太小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-15
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 2016-05-28
      相关资源
      最近更新 更多