最近在开发LINUX下的工具,调试一个BUG时遇到很郁闷的情况:
某处有个segmentation fault。懒得用gdb,于是随便加了几条调试信息,编译,运行之。直接显示错误信息。
唔......BUG在最近一条信息之前,再细分,再加调试信息,编译,运行,嗯,还得再分。
3次之后偶郁闷鸟,真正的郁闷鸟......两条消息,一条能正常显示,紧接着的,中间没有任何语句--也不是多线程--的第二条信息就是显示不出来!我靠!我招惹谁了啊?没有任何干扰啊
好吧,劳资怒了,上GDB!
一调之下更郁闷了,明显两条语句都正常调用了啊。没有错啊?
再仔细看,唔.....虽然正常调用了printf,可是怎么没显示?查代码,总算查出原因了。第二条语句的显示信息上没有加回车。
总算知道原因了:LINUX的printf()函数不会立即把字符串输出到设备,而是先存到一个缓冲区中,等缓冲区被填满到一定程度之后才会输出到设备,因此如果在缓冲区被填满前程序结束运行,那么恭喜你,上一个回车之后显示的内容就华丽地丢失了。
SO,这提高性能的做法,在调试状态就成为造成混乱的根源。在使用printf()输出调试信息时一定要加上回车。