大学四年,自夸努力上进,看了很多专业书,一到实习工做,立刻显示出菜鸟的本性,连基本的程序调试都不会。大学时程序调试不是用printf输出运行时变量内容,就是肉眼看代码,小的算法Demo和功能代码,这样子调试就当是卖萌了;工做时一个服务器程序近万个源代码文件,客户端崩溃只有dump文件和日志信息反馈到服务器上,卖萌式的debug已经没法知足需求了。这段时间抽空看了一些关于debug的文档资料,加上工做半年来的一些实践,在这里小小的总结一下,大部份内容都是本身在阅读文档和实践中的一些想法,抛砖引玉,一些错误和不足,欢迎你们指出。算法
l 程序的debug信息sass
对于编译器来讲(好比gcc),若是直接对程序进行编译,不保留编译时的信息,则编译后的汇编代码(固然最后是符合操做系统支持的格式的binary可执行文件)根本彻底不知道源代码的任何信息,不知道汇编代码与源代码之间的关系,好比源代码中的函数名称、变量的类型和名称等。好比在使用GDB进行程序调试的时候,step(单步调试)命令默认是不进入共享库函数(.lib,.so,.a等文件)的,由于共享库函数都是不带调试信息的二进制代码文件,固然共享库文件通常来讲也都是已经调试好了的没有bug的文件。服务器
在Unix/Linux环境下,使用gcc的-g选项会将调试信息编码输出到编译后的可执行目标代码文件中,这些调试信息通常来讲包括:函数
上面这些信息是确定的,我认为,应该还包括源代码和编译后的汇编代码之间的对应关系,在如今的编译技术下,汇编代码和源代码之间的一一对应关系彻底不可能从汇编代码倒推出来了。工具
用一个简单的31行的C语言Demo程序文件作试验,使用一样的编译优化级别,不使用-g选项编译出来的可执行目标代码文件的大小是6.85KB,使用-g选项后编译出的大小为8.79KB,而源代码文件的大小为404Byte,可见在使用-g选项后在可执行目标代码文件中调试信息所占文件大小的比重。当将源文件从当前目录下删除后,在调试目标代码文件时使用list指令,将出现No such file or directory的提示,可见在目标代码文件中保存的是源文件的路径信息。性能
在Windows环境中,调试信息并不被编码到最后的可执行目标文件中,而是经过一个和最后生成的.exe同名的.pdb文件来保存。在使用windbg或者VS来调试Windows下的程序的时候,须要设置和加载相应的.pdb文件,不然给出的调试信息极可能就是错误的。相关的信息能够查看:http://www.wintellect.com/blogs/jrobbins/pdb-files-what-every-developer-must-know(PDB Files: What Every Developer Must Know)。学习
另外还有两点须要说明一下:开发工具
l 一些Tips优化
整篇就是本身的读书笔记和一些理解,有什么错误,请你们指出。邮箱:wangjian_pg@sohu.com。编码