JProfiler帮助文档

脚本探针


在IDE中开发一个自定义探针,需要对拦截点和该探针的用处有清晰的了解。另一方面,使用脚本探针, 你可以直接在JProfiler GUI中快速定义简单的探针并进行实验,而无需学习任何API。 与嵌入式或注入式自定义探针不同,脚本探针可以在正在运行的分析会话中重新定义,从而实现快速的编辑-编译-测试流程。

定义脚本探针

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

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

每个脚本探针都需要一个名称和可选描述。名称用于将探针视图添加到"JEE&探针"部分的JProfiler视图选择器中。 描述显示在探针视图的头部,其用途的一个简短描述。

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

选择被拦截的方法的一个更简单方式是从调用树视图中选择。在上下文菜单中, 使用脚本探针拦截方法操作会询问你是要创建一个新探针还是向现有探针添加一个拦截。

探针脚本

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

在这个环境中,你的脚本可以以表达式或带有返回语句的一系列语句构建有效负载字符串。 这种脚本的最简单版本是返回一个参数的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中,这是一个单独的功能,就像在自定义探针概念中解释的。 嵌入式和注入式探针直接提供调用树拆分功能。
  • 脚本探针不能创建控制对象或创建自定义探针事件类型。这只有在嵌入式或注入式探针中才有可能。
  • 脚本探针不能访问返回值或抛出的异常,不像嵌入式和注入式探针。
  • 脚本探针不能处理重入式拦截。如果一个方法被递归调用,只有对它的第一次调用才会被拦截。 嵌入式和注入式探针为你提供对重入行为的精细控制。
  • 除了默认遥测之外,无法将遥测捆绑到探针视图中。 但是你可以像自定义探针概念中展示的那样使用脚本遥测功能,