请仔细研究这些工具,如果你花15分钟时间对每个工具进行一下试验,将来在解决BUG问题是,它将会大大节约你的时间。
表1 用于检查源代码的工具
工具 | 位于何处 | 所做工作 |
cb | 随编译器附带 | C程序美化器,在源文件中运行这个过滤器,可以使源文件有标准的布局和缩进格式。来自Berkeley |
indent |
| 与cb作用相同,来自AT&T |
cdecl |
| 分析C语言的声明 |
cscope | 随编译器附带 | 一个基于ASCII码C程序的交互式浏览器。用于检查头文件修改的效果。 |
ctags | /usr/bin | 创建一个标签文件,供vim/vi编辑器使用。标签文件能加快检查程序源文件的速度,方法是维护一个表,里面有绝大多数对象的位置 |
lint | 随编译器附带 | C程序检查器 |
cflow | 随编译器附带 | 打印程序中调用者/被调用者的关系 |
sccs | /usr/ccs/bin | 源代码版本控制系统 |
vgrind | /usr/bin | 格式器,用于打印漂亮的C列表 |
医生可以使用X射线、声谱仪、内窥镜和探查术查看病人的身体内部。上面这些工具就是软件世界的X射线。
表2 用于检查可执行文件的工具
工具 | 位于何处 | 所做工作 |
dis | /usr/ccs/bin | 目标代码反汇编工具 |
dump -Lv | /usr/ccs/bin | 打印动态链接信息 |
ldd | /usr/bin | 打印文件所需的动态 |
nm | /usr/ccs/bin | 打印目标文件的符号表 |
strings | /usr/bin | 查看嵌入于二进制文件中的字符串。用于查看二进制文件可能产生的错误信息、内置文件名和(有时候)符号名或版本和版权信息 |
sum | /usr/bin | 打印文件的校验和与程序块计数。回答这样的问题:“这些可执行文件是同一版本吗?”“传输是否成功?” |
表3 帮助调试的工具
工具 | 位于何处 | 所做工作 |
truss | /usr/bin | Trace的SVr4版本,这个工具打印可执行文件所进行的系统调用。它可用于查看二进制文件正在干什么,为什么阻塞或失败。这将非常有用 |
ps | /usr/bin | 显示进程的特征 |
ctrace | 随编译器附带 | 修改你的源文件,文件打印时按行打印。是一个对小程序非常有用的工具 |
debugger | 随编译器附带 | 交互式调试器 |
file | /usr/bin | 告诉你一个文件包含的内容(如可执行文件、数据、ASCII、shell、script、archive等) |
表4 性能优化辅助工具
工具 | 位于何处 | 所做工作 |
collector | 随编译器附带 | (SunOS 独有) 在调试器控制下收集运行时性能数据 |
analyzer | 随编译器附带 | (SunOS 独有) 分析已收集的性能数据 |
gprof | /usr/ccs/bin | 显示调用图配置数据(确定计算密集的函数) |
prof | /usr/ccs/bin | 显示每个程序所消耗时间的百分比 |
gcov | 随编译器附带 | 显示每条语句执行次数的计数(确定一个函数中计算密集循环) |
time | /usr/bin/time | 显示程序所使用的实际时间和CPU时间 |
如果你工作于操作系统的内核模式,则无法使用绝大多数运行时工具,因为内核并不像用户进程那样运行。可以使用编译时工具Lint,但除此之外我们只能使用石刀和燧斧了;将有序模式放入内存中,看看他们何时被覆盖(最常使用的两个是十六进制常量deadbeef和abadcafe) ,使用printf或类似的函数并记录跟踪信息。