跟踪 UNIX 应用程序的解决方案

本文示例源代码或素材下载
开始之前
本教程帮助 Unix 系统开发人员和管理员以最佳方式跟踪系统上运行的应用程序 。要想从本教程获得最大收获,您应该了解 UNIX 操作系统的基本知识及其操作方式 。具备基本的编程经验会有帮助,但不是必需的 。
关于本教程
大多数开发人员和系统管理员知道在他们的操作系统和应用程序中应该会发生什么情况,但糟糕的是,有时候不是这样的 。当应用程序崩溃或表现异常时,需要查明更多信息 。通过利用对应用程序正常工作方式的了解和一些基本 UNIX 技能,可以跟踪应用程序,查明造成问题的原因 。本教程讲解使用跟踪工具了解应用程序内部情况的基本技术 。
本教程首先讨论调试和跟踪的差异,以及这两种解决方案的工作方式差异 。然后,通过一些具体示例讲解如何使用跟踪解决应用程序中的问题 。DTrace 提供跟踪和调试两种系统的组件,还支持对应用程序进行计时和基准测试 。最后,本教程讲解如何跟踪在网络计算机之间交换的信息,帮助发现网络应用程序中的问题 。
跟踪概述
有时候,需要了解在应用程序内部正在发生的情况 。例如,应用程序可能会运行失败,而又没有显示有帮助的错误消息,或者系统服务没有按照预期的方式运行 。在这些情况下,您可能不掌握应用程序源代码,因此无法通过传统的调试过程寻找问题的原因 。跟踪提供了一种替代方法 。
调试
对于开发人员来说,寻找 UNIX 应用程序问题的主要方法是,使用开发环境或操作系统的调试特性检查源代码,查明造成问题的原因 。
大多数调试系统支持逐行监视和检查代码行的执行过程,还支持监视变量和结构的值 。可以使用调试器在代码中设置断点,执行过程会停在断点上;在断点上,可以获得关于调用堆栈(函数的调用路径)的信息以及变量值 。
我们来看一个例子,假设一个应用程序根据人的生日计算他的年龄,还要考虑到闰年等因素 。要想调试这个应用程序,需要有源代码,还需要在启用调试选项的情况下编译应用程序:$ gcc -g ageindays.c -o ageindays 。
运行这个应用程序,提供用户的生日和用来比较的目标日期(见清单 1) 。
清单 1. 执行比较
$ ./ageindays 24/1/1980 22/2/2009 
You have been alive 10622 days 
You were born on 24/1/1980 which is a Thursday
在调试应用程序时,首先怀疑问题出在 calc_diff 函数中,这个函数计算第一个和第二个日期的差 。接下来,可能按照清单 2 这样进行调试 。
清单 2. 调试 calc_diff 函数
$ gdb ageindays 
GNU gdb 6.3.50-20050815 (Apple version gdb-962) (Sat Jul 26 08:14:40 UTC 2008) 
Copyright 2004 Free Software Foundation, Inc. 
GDB is free software, covered by the GNU General Public License, and you are 
welcome to change it and/or distribute copIEs of it under certain conditions. 
Type "show copying" to see the conditions. 
There is absolutely no warranty for GDB. Type "show warranty" for details. 
This GDB was configured as "i386-apple-darwin"...Reading symbols for shared 
libraries ... done 
 
(gdb) b calc_diff 
Breakpoint 1 at 0x1bd7: file ageindays.c, line 27. 
(gdb) r 24/1/1980 26/3/2009 
Starting program: /nfs/MC/UnixSrc/c/bio/ageindays 24/1/1980 26/3/2009 
Reading symbols for shared libraries. done 
 
Breakpoint 1, calc_diff (day=26, month=3, year=2009) at ageindays.c:27 

推荐阅读