LINUX调试技巧一则
2007-08-10 05:05
232 查看
最近在开发LINUX下的工具,调试一个BUG时遇到很郁闷的情况:
某处有个segmentation fault。懒得用gdb,于是随便加了几条调试信息,编译,运行之。直接显示错误信息。
唔......BUG在最近一条信息之前,再细分,再加调试信息,编译,运行,嗯,还得再分。
......
3次之后偶郁闷鸟,真正的郁闷鸟......
两条消息,一条能正常显示,紧接着的,中间没有任何语句--也不是多线程--的第二条信息就是显示不出来!我靠!我招惹谁了啊?没有任何干扰啊
好吧,劳资怒了,上GDB!
一调之下更郁闷了,明显两条语句都正常调用了啊。没有错啊?!
再仔细看,唔.....虽然正常调用了printf,可是怎么没显示?
查代码,总算查出原因了。
第二条语句的显示信息上没有加回车!
总算知道原因了:LINUX的printf()函数不会立即把字符串输出到设备,而是先存到一个缓冲区中,等缓冲区被填满到一定程度之后才会输出到设备,因此如果在缓冲区被填满前程序结束运行,那么恭喜你,上一个回车之后显示的内容就华丽地丢失了。
SO,这提高性能的做法,在调试状态就成为造成混乱的根源。在使用printf()输出调试信息时一定要加上回车。
某处有个segmentation fault。懒得用gdb,于是随便加了几条调试信息,编译,运行之。直接显示错误信息。
唔......BUG在最近一条信息之前,再细分,再加调试信息,编译,运行,嗯,还得再分。
......
3次之后偶郁闷鸟,真正的郁闷鸟......
两条消息,一条能正常显示,紧接着的,中间没有任何语句--也不是多线程--的第二条信息就是显示不出来!我靠!我招惹谁了啊?没有任何干扰啊
好吧,劳资怒了,上GDB!
一调之下更郁闷了,明显两条语句都正常调用了啊。没有错啊?!
再仔细看,唔.....虽然正常调用了printf,可是怎么没显示?
查代码,总算查出原因了。
第二条语句的显示信息上没有加回车!
总算知道原因了:LINUX的printf()函数不会立即把字符串输出到设备,而是先存到一个缓冲区中,等缓冲区被填满到一定程度之后才会输出到设备,因此如果在缓冲区被填满前程序结束运行,那么恭喜你,上一个回车之后显示的内容就华丽地丢失了。
SO,这提高性能的做法,在调试状态就成为造成混乱的根源。在使用printf()输出调试信息时一定要加上回车。
相关文章推荐
- linux内核调试技巧之一 dump_stack
- Linux下多线程的简单调试技巧
- 嵌入式linux调试技巧
- linux驱动调试技巧:灌寄存器---------以mma7660为例
- Linux内核开发的一点调试技巧
- linux 内核调试技巧
- 分享一则javascript 调试技巧
- Linux中调试程序使用打印日志纠错的技巧
- linux python调试技巧
- Linux 工程编译调试Makefile及技巧
- Linux kernel oops panic 调试技巧
- linux内核调试技巧 dump_stack()
- Linux下常用调试技巧
- Linux0.00 调试技巧
- Linux驱动调试时的一些技巧
- 分享一则javascript 调试技巧
- 【转】【调试技巧】Linux环境下段错误的产生原因及调试方法小结
- linux驱动调试技巧:灌寄存器---------以mma7660为例
- 深入探索Linux coredump调试技巧
- 深入探索Linux coredump调试技巧