大学四年,自诩努力上进,看了不少专业书,一到实习工作,马上显示出菜鸟的本性,连基本的程序调试都不会。大学时程序调试不是用printf输出运行时变量内容,就是肉眼看代码,小的算法Demo和功能代码,这样子调试就当是卖萌了;工作时一个服务器程序近万个源代码文件,客户端崩溃只有dump文件和日志信息反馈到服务器上,卖萌式的debug已经无法满足需求了。这段时间抽空看了一些关于debug的文档资料,加上工作半年来的一些实践,在这里小小的总结一下,大部分内容都是自己在阅读文档和实践中的一些想法,抛砖引玉,一些错误和不足,欢迎大家指出。
l 程序的debug信息
对于编译器来说(比如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。
原文:http://www.cnblogs.com/wj-19910302/p/3577440.html