最近工作中遇到了一个bug,程序crash了,但c++堆栈信息完全不相关,于是就顺着堆栈查代码,下断点,但是断点在crash之前还断不到,足够奇怪。并且屏蔽了某个功能后还是crash,但堆栈又完全不同了,加班搞了会儿,头痛欲裂,放弃了先下班回家。第二天早早来,头脑清醒,理清思路,逐步缩小范围,很快解决了。其实这个bug如果是在纯c++之中应该是很好查的,但是堆栈不对是由于bug出在lua中,c++堆栈只能显示到lua调用的情况,而在c++和lua混合代码中,控制流在lua和c++之间流动,导致了lua调用可能出现在不同的c++堆栈顶端。而两次堆栈不同是由于不同的c++代码最终调用到了lua的引起crash的代码。解决这个bug最后是靠逐步缩小范围并打印lua的调用堆栈。从这个bug中我总结几点教训:
1)出现crash类的bug, 不要第一时间就去查堆栈,先通过排除法逐步找到引起crash的代码。有些情况比如内存越界引起的crash,堆栈就更莫名其妙了。所以一定不要依赖于堆栈。先停下来想一想刚才干了啥。
2)对于lua引起的crash bug,找出可疑代码后打印lua堆栈来分析出问题的调用路径。
3)改bug一定要头脑清醒,如果搞了半小时还没搞定就先休息吧~