电脑技术学习

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

dn001

  通过 清单 2 中的输出可以看出,我们打开了调试器,通过指定名称在 calc_diff() 函数中设置了一个断点,然后在调试器中运行程序,提供与命令行相同的参数。

  当调试器到达创建的断点时,执行过程停止,您可以检查应用程序代码和调用的函数。通过使用调试器,可以查看提供给函数的参数及其值(在这里是为目标日期提供的日期信息)。执行停止之后,可以查看堆栈跟踪,查看代码中调用 calc_diff 函数的行,可以获得 days_diff 变量的值。因为应用程序的执行过程已经暂停了,所以还可以修改变量的值。这样就可以在应用程序中尝试使用不同的值,从而寻找潜在的问题。

  可以使用这些信息,因为定义了特定的调试信息(组成函数和变量名的符号)和其他元数据(比如定义函数的代码行)。

  必须在编译时把特定的调试信息添加到二进制应用程序中;更重要的是,必须访问源代码,才能把调试信息包含在编译的应用程序中。如果无法识别函数名和变量,那么几乎不可能调试程序。

  跟踪与调试的对比

  系统管理员(和开发人员)常常希望发现正在运行的程序中的错误。例如,某个程序为什么造成了其他问题(比如内存和其他错误),应用程序的表现为什么不符合预期,它过去发生了什么情况。在这种情况下,调试应用程序的特定方面往往没什么用。需要查明的实际上是操作系统如何执行应用程序。

  在进行调试时,检查的是应用程序中定义的各个函数的执行过程。调试主要关注应用程序本身,包括其中的函数和结构,通常会忽视应用程序向操作系统发出的系统调用和库函数调用。调试能够提供关于应用程序的大量信息,但是对于了解操作系统如何执行应用程序帮助不大。

  在进行跟踪时,监视应用程序和操作系统之间的交互,常常会检查应用程序在执行期间调用的操作系统函数。

标签: