记bug总是一件很难的事情,因为很多时候出现bug很难解决的原因是你不知道这个bug是因为什么而出现的,但是当你解决了bug,发现了问题原因所在的时候,这个bug又变得理所当然的“简单”。因此,可能对遇到和我有同样的bug的人因为不会往“全局变量”或“中断优先级”这些关键字寻找问题吧,我的随笔也很难被这些遇到和我一样问题的人找到。所以就是当个随笔写了
这次就是一个队友遇到的摸不着头脑的“玄学”bug了。
在进行调试的时候发现中断里面发现中断的逻辑完全不对,比如
if(num==1)
{
//Do something A
}
在代码段A中因为变量不正确而导致程序跑死,可是在这个代码段中打断点竟然发现num不是1而是一些其他的数字,同时也发现这个情况下的其他变量也很不正常,最终导致了代码段A跑死了。
最后发现的原因是:变量num和一些其他变量因是全局变量或是全局变量的指针,然后这些全局变量会在一个比当前中断优先级更高的中断被修改。因此有很小一部分的概率会发生在当前中断下num==1时进入了代码段A,但是未执行完成就被更高优先级的中断打断了并修改了全局变量的值,然后回到当前中断后因为数据完全变化了而导致发生了逻辑的错误。