WinCE:调试版本工作,从流设备驱动程序读取时发布版本崩溃

时间:2013-12-04 09:39:03

标签: visual-studio-2005 driver windows-ce

我正在使用Platform构建器在Visual Studio 2005中创建Windows CE 6.0。我集成了一个流设备驱动程序(通过USB HID)。我还有一个小应用程序,它打开与设备的连接并从中读取数据。当我构建这个Windows CE 6.0的Debug-Version并在设备上调试它时,我可以启动应用程序,并且与设备的通信正常。现在我构建Windows CE 6.0的发行版本(不更改源!),在设备上运行它并在设备上启动应用程序。当我尝试通过ReadFile()从设备读取数据时,(我猜这会从流驱动程序调用XXX_Read())我的窗口崩溃并重新启动。它太糟糕了,因为我无法调试CE完全崩溃的CE ...(因为它在调试版中没有崩溃;)。

WinCE 6的调试版和发行版之间有什么区别?有没有人提示我需要仔细研究Stream Device驱动程序的哪一部分来解决这个问题?我知道在Debug / Release中没有采用Project设置。但我无法想到任何可能影响流设备驱动程序的设置。

此致

3 个答案:

答案 0 :(得分:1)

Release和Debug之间的最大区别在于,在Debug的代码构建中,所有变量都被初始化为零。在Release中,它们根本没有被初始化,因此在分配变量时,通常最终会得到变量存储位置中的非零垃圾。

如果您在代码中创建指针然后针对NULL进行检查,则通常会出现问题。 Debug构建将告诉您指针是NULL,因为它已初始化为零。在Release中它最终非零,然后你尝试解除引用指针中的垃圾,它会导致访问冲突崩溃。

故事的寓意:始终,始终在代码中初始化变量。 ZeroMemory / memset是您的朋友。

答案 1 :(得分:0)

您可以做的一件事是设置Dr. Watson以便在崩溃发生时生成KDMP文件,然后您可以使用KDMP文件进行事后调试分析看看崩溃发生的地方。请参阅the docs以获取有关在WinCE 6.0上设置Dr Watson的更多信息。

生成故障转储文件(*.KDMP)后,可以使用Visual Studio 2005打开KDMP文件(File | Open Project/Solution)。加载后,使用Target | Attach device菜单选项启动事后调试会话(请注意,您实际上是通过KDMP文件“附加”到设备,您无需实际访问验尸时调试目标设备)

答案 2 :(得分:0)

您还可以在发布图像中启用KITL和内核调试器。 当您调试发布代码时,您将遇到一些奇怪的行为(代码未按顺序执行或多个指令在一个步骤中执行,某些变量无法监视,因为它们存储在寄存器等中),但您应该能够理解你的系统崩溃的地方。如果您有监视程序,则只能在发布版本中启用,这可以解释重新启动。