Compact Framework 3.5应用程序在CE7 / Motorola MC32N0

时间:2015-12-21 15:28:05

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

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

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

现在,这款MC3190已经淘汰,并被摩托罗拉/ 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应用程序中看到过像这样的崩溃?

  • 是否有人将CLR Profiler用于MC32N0?

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

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

非常感谢任何帮助!

更新

设备已经使用视觉崩溃工件撞击了我几次,如下所示:

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

崩溃症状通常如下所示:

  • 快乐地使用应用程序,在世界范围内无需小心选择订单
  • 突然,应用程序不再处理键盘输入
  • 有趣的是,此时我经常能够聚焦不同的TextBox,光标会在那里闪烁一会儿
  • 经过多次互动后,系统完全锁定,Windows启动按钮也无法响应
  • 几次 - 我见过的大约100起崩溃中的3次 - 设备会产生如上图所示的碰撞模式

注意:我们的供应商提供了两台产生崩溃的MC3200设备,因此我发现很难相信这是一个硬件问题。

有没有人认识到这些"症状"?有什么想法吗?

3 个答案:

答案 0 :(得分:3)

我们正在经历同样的"锁定"我们在MC32N0上的应用程序出现问题。

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

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

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

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

我再也找不到帖子了,或者我会在这里引用它。这是一篇微软帖子,在终结器运行时将问题描述为随机锁定,但他们也表示已经纠正。

我们自从没有锁定问题就一直在运行。

希望这有助于某人...

答案 1 :(得分:1)

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

您可以执行的操作是安装错误报告,然后查看问题显示时是否创建了内核转储文件。但是,您需要SMZ再次提供帮助,因为kdmp文件必须与操作系统映像/固件构建的调试符号一起使用。然后,内核转储中的地址和寄存器值会导致Build中存在问题的函数/ 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是一个名为“Windows Embedded Compact 7每月更新2015年11月”的已知问题的html。可能您可以避免使用已知问题。

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

要点:

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

  • 尝试启用错误报告

  • 尝试使用PowerTools for WEC7

  • 尝试更新设备的固件

  • 尝试更新的CF35(如果有)

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

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

答案 2 :(得分:1)

我使用这种设备(和MC32N0)已经很多年了,您已经正确地完成了所有操作。我通常所做的唯一一件事就是尝试不断减少应用程序的功能副本,直到最终显示出故障的小得多的东西为止。然后尝试创建一个新的测试应用程序,使您可以更轻松地重现该问题。

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

当CE 6设备没有发出EMDK时,我也遇到了发送扫描仪取消事件的问题。由于我的应用将其误认为是扫描事件并做了奇怪的事情,这导致了问题。我现在忽略了它们,这似乎还可以。

对于您的问题,我的猜测是它与内存有关,因此请查找图像或GC代码之类的大物件。也许检查控制面板中的内存小程序中的程序内存是否没有被设置得太小。