【问题标题】:WinCE: Debug version works, Release version crashes while reading from stream device driverWinCE:Debug 版本有效,Release 版本在读取流设备驱动程序时崩溃
【发布时间】:2013-12-04 09:39:02
【问题描述】:
我正在使用 Platform builder 在 Visual Studio 2005 中创建 Windows CE 6.0。我集成了一个流设备驱动程序(通过 USB HID)。我还有一个小应用程序,它打开与设备的连接并从中读取数据。当我构建此 Windows CE 6.0 的调试版本并在设备上对其进行调试时,我可以启动应用程序并且与设备的通信工作正常。现在我构建了 Windows CE 6.0 的发布版本(源代码没有更改!),在设备上运行它并在设备上启动应用程序。当我尝试通过 ReadFile() 从设备读取数据时,(我猜这会从流驱动程序调用 XXX_Read())我的 Windows 崩溃并重新启动。太糟糕了,因为我无法调试 Windows 完全崩溃的 CE...(因为它在调试版本中不会崩溃;)。
WinCE 6 的调试版和发布版有什么区别?有没有人暗示我需要仔细查看流设备驱动程序的哪一部分来解决这个问题?我知道在调试/发布中没有采用项目设置。但我想不出任何可能影响流设备驱动程序的设置。
问候
【问题讨论】:
标签:
visual-studio-2005
driver
windows-ce
【解决方案1】:
Release 和 Debug 之间的最大区别在于,在代码的 Debug 版本中,所有变量都被初始化为零。在 Release 中,它们根本不会被初始化,因此通常会在分配变量时在变量的存储位置中出现任何非零垃圾。
如果您在代码中创建指针然后对照NULL 检查它们,这通常是一个问题。调试版本会告诉您指针是NULL,因为它已初始化为零。在 Release 中它最终非零,然后您尝试取消引用指针中的垃圾,它会导致访问冲突崩溃。
故事的寓意:总是,总是在代码中初始化你的变量。 ZeroMemory/memset是你的朋友。
【解决方案2】:
您可以做的一件事是设置 Dr. Watson,以便在发生崩溃时生成 KDMP 文件,然后您可以使用 KDMP 文件进行事后调试分析以查看崩溃的位置正在发生。有关在 WinCE 6.0 上设置 Dr Watson 的更多信息,请参阅 the docs。
生成故障转储文件 (*.KDMP) 后,您可以使用 Visual Studio 2005 打开 KDMP 文件 (File | Open Project/Solution)。加载后,使用Target | Attach device 菜单选项启动事后调试会话(请注意,您实际上是通过KDMP 文件“附加”到设备,您不需要在发布时物理访问目标设备- 死机调试)
【解决方案3】:
您还可以在发布映像中启用 KITL 和内核调试器。
调试发布代码时会遇到一些奇怪的行为(代码没有按顺序执行或单步执行多条指令,有些变量因为存入寄存器等而无法观察),但你应该能够理解您的系统崩溃的地方。如果你有一个看门狗,这可能只在发布版本中启用,这可以解释重启。