Keil5,debug过程中,在watch窗口中看不到局部变量的值,显示not in scope,并且警告variable "变量" was set but never used,这两个问题是同一个原因。编译器把变量优化掉了。
本想设置个临时变量存储一个结果,然后在调试器中查看。开始没有注意这个警告,调试时才发现变量不可访问,出现这个警告的时候,编译器可能已经把这个它认为没有用的变量给优化掉了。
不让优化也好办:
MDK仿真 Watch 窗口的变量 出现<not in scope>(不在范围内),解决办法_<not in scope>-CSDN博客
这三个变量值得说道说道
idq是全局变量
i是局部变量
state是局部变量
编译时state报警 variable "state" was set but never used
在watch窗口中idq和i可以正常显示,state不能<not in scope>
我寻思我也使用了啊??后面的调用是这样的
如此理解一下state为什么没有使用,因为state接收了返回值之后,没有输出,也没有赋值操作了
i是有赋值的,idq是全局变量,不存在这个警告。
声明了没有使用这个问题,是因为编译器把这个变量优化掉了
如果你确实需要这个变量,在定义时加上volatile
关键字,以明确告诉编译器不要优化它。
这样警告就没有了,watch也能观察到state了。
补充:
1、对于局部变量的调试,最好使用call stack+ locals,这个窗口用于查看当前程序调度关系,当出现有进入硬件错误异常调试时可以快速定位到是哪里触发的异常。这个窗口是的调度关系是从当前程序堆栈里获取的数据并将其图形化,所以如果当前堆栈数据被破坏,则此窗口也将无法查看调度关系。
该窗口里显示的调度关系是从下至上调用的,最上面的表示当前程序所处的函数。展开对应的函数,可以查看各层调用函数跳转之前保存的一些临时变量等信息。
2、watch窗口注意,只有全局变量可以全程监视,临时变量只有在进入当前函数中才可监视到其数据,用static关键词修饰的变量无法监视。。
KIEL 调试那些事儿之窗口展示——变量(二)_wx5d217eb5a181e的技术博客_51CTO博客
断点调试高级技巧,拿大屏幕狠狠看这个小骚技巧!!