练习 1.4:创建更高级的探针

在开始之前,必须已完成练习 1.3:部署探针

Probekit 可以用于解决很多现实世界的调试和运行时分析问题。您现在已经了解编写和部署探针的基础,所以下列课程将不再重复这些活动,而是为您可能编写以调查自己的应用程序的探针提供一些建议。

调查异常

假设 servlet 中的某个方法偶尔会抛出异常。生成的日志消息不太有帮助;它没有明确指示问题所在。 要获取更多信息,您可以编写方法抛出异常时执行的探针,并且探针段中的 Java 代码可以记录异常消息以及方法的自变量。 这将帮助您查看抛出异常的原因。

编写和部署探针时,注意以下几点:

调查方法的不稳定性能

以下是一个相当复杂的探针示例。假设程序中有一个通常执行很快的方法,但是偶尔要耗费比较长时间(例如超过 100 毫秒)。

您可以编写一个探针,只要执行了此方法,该探针就会记下进入和退出的时间。当执行时间短时,探针不执行任何操作。 执行时间长时,探针报告方法的自变量,以及其它与当时的程序状态有关的重要信息。这允许您确定导致执行时间较长的情况。

编写探针时,请注意以下几点:

在方法入口,探针报告当前时间。在方法出口,探针比较当前时间和记录的进入时间, 并且如果已过去的时间量多于特定时间量(在“thresholdDuration”中指定的量),将使用 System.out 打印报告。

调查递归或多线程方法中的不稳定性能

刚才讨论的探针不能处理递归(直接或间接的)的方法,并且不能处理可能同时运行于多个线程的方法。 要解决递归问题,您可以在“堆栈”中记录进入时间;要解决多线程问题,您可以在 ThreadLocal 变量中存储堆栈。

下面是创建递归安全和线程安全版本的探针所需的内容:

继续教程练习 1.5:为更复杂的探针逻辑使用“运行时库”

反馈
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.