现象

程序在 debug 下正常运行,在 release 下运行时,无法响应下位机通过 usb 发送的指令。

背景

程序为 C# 项目,通过 usb 与下位机进行多线程通讯,debug 下未发现明显 bug

根据微软官方文档

在 Debug 配置中,程序使用完整符号调用信息编译,且不进行优化。 优化会使调试复杂化,因为源代码和生成的指令之间的关系更加复杂。
程序的 Release 配置进行了完全优化,且不包含任何符号调试信息。 对于托管代码和 C++ 代码,根据使用的编译器选项,可在 .pdb 文件中生成调试信息。

分析

通常可以通过修改编译选项来缩小错误范围,得益于 .pdb 文件,在 release 下仍然可以进行断点调试,调试发现是一个简单的多线程标志位没有添加 volatile 修饰符,导致经过优化后线程外的更新没有作用于 while 函数,造成的程序错误。联想到之前下位机在 gcc -O3 时的错误,推测也是某成员变量没有 volatile 修饰符。

发表评论

电子邮件地址不会被公开。