JProfiler帮助文档Download

脚本探针


在您的IDE中开发自定义探针需要清晰理解拦截点及探针将提供的好处。而使用脚本探针,您可以直接在JProfiler GUI中快速定义简单探针并进行实验,而无需学习任何API。与嵌入式或注入式自定义探针不同,脚本探针可以在运行中的分析会话期间重新定义,从而实现快速的编辑-编译-测试循环。

定义脚本探针

通过选择一个被拦截的方法并输入返回探针有效负载字符串的脚本来定义脚本探针。多个这样的方法-脚本对可以捆绑在一个探针中。

可以在会话设置中访问脚本探针配置。这是创建和删除脚本探针以及将您的脚本探针保存到可以被其他分析会话导入的集合中的地方。

每个脚本探针需要一个名称和可选的描述。名称用于在JProfiler的视图选择器中的"JEE & Probes"部分添加探针视图。描述显示在探针视图的标题中,应为其目的提供简短的解释。

对于选择方法,您有多种选项,包括从配置的类路径中选择一个类或从被分析的类中选择一个类(如果分析会话已经在运行)。在第二步中,您可以从选定的类中选择一个方法。

从调用树视图中选择被拦截的方法要容易得多。在上下文菜单中,使用脚本探针拦截方法操作将询问您是否要创建新探针或将拦截添加到现有探针。

探针脚本

在脚本编辑器中,您可以访问被拦截方法的所有参数以及调用该方法的对象。如果您需要访问被拦截方法的返回值或任何抛出的异常,则必须编写嵌入式或注入式探针。

在此环境中,您的脚本可以构建有效负载字符串,既可以是表达式,也可以是带有返回语句的语句序列。此类脚本的最简单版本只是为一个参数返回parameter.toString()或为具有原始类型的参数返回String.valueOf(parameter)。如果返回null,则不会创建有效负载。

如果您同时记录CPU和探针数据,CPU部分的调用树视图将在适当的调用栈中显示到探针视图的链接。或者,您可以选择在CPU调用树视图中内联显示有效负载字符串。探针向导的"有效负载拦截->调用树注释"步骤包含此选项。

脚本可用的另一个参数是脚本上下文,一个类型为com.jprofiler.api.agent.ScriptContext的对象,允许您在为当前探针定义的任何脚本的调用之间存储数据。例如,假设被拦截的方法A只看到没有良好文本表示的对象,但对象和显示名称之间的关联可以通过拦截方法B获得。然后,您可以在同一个探针中拦截方法B,并将对象到文本的关联直接保存到脚本上下文中。在方法A中,您可以从脚本上下文中获取该显示文本并使用它来构建有效负载字符串。

拦截方法 A:· object c· name nscriptContext.putObject(c,n);return null;定时拦截方法 B:· object creturn scriptContext.getObject(c);12

如果这些类型的关注点变得过于复杂,您应该考虑切换到嵌入式或注入式探针API。

缺失的功能

脚本探针旨在促进自定义探针开发的简单入门,但它们缺少完整探针系统中的一些功能,您应该注意:

  • 脚本探针无法进行调用树拆分。在JProfiler UI中,这是一个单独的功能,如自定义探针概念中所述。嵌入式和注入式探针直接提供调用树拆分功能。
  • 脚本探针无法创建控制对象或创建自定义探针事件类型。这只能通过嵌入式或注入式探针实现。
  • 脚本探针无法访问返回值或抛出的异常,不像嵌入式和注入式探针。
  • 脚本探针无法处理重入拦截。如果一个方法递归调用,则只有第一次调用会被拦截。嵌入式和注入式探针为您提供对重入行为的细粒度控制。
  • 不可能将默认遥测以外的遥测捆绑到探针视图中。相反,您可以使用脚本遥测功能,如自定义探针概念中所示。