使用说明

一、Web应用集成步骤:

上述命令参数中的, " 等符号有特殊含义,请不要删除,另外路径等需要替换的参数已经用《》标记出来。完成以上配置后,正常访问Web应用时就会在本地生成快照数据(在sample.config的baseLogPath路径下)并且把少量信息(如请求id、类名、服务入口方法名)发送到本网站。

用户登陆本网站后,可以在“请求列表”中查看快照记录。点击链接进入详情页面可以看到对应的代码和调用堆栈等信息(注意:访问详情页面前需要本地运行parser代理程序用于分析本地的快照文件),默认是定位到服务入口方法结束的时刻。

二、分布式应用集成步骤:

三、详情代码分析操作说明:

1、进入详情页面可以看到代码定位到请求对应的 Controller 处理方法的结束,左上是调用堆栈,左下是变量列表,右边是源代码。该源代码是通过反编译生成,和实际的源代码会有一些出入,比如跳转定位的行上也会有偏差。

2、基础类型之外的变量,如果包含成员,变量名前面会显示+,可以点击进行展开。

3、点击变量名会弹出操作选项,可以查看变量最近一次是在哪里赋值的,也可以直接定位到取值的源头。

4、此图为第3步选择"回退到最近赋值"时的效果,可以看到代码定位到productAmount变量赋值的地方。这个时候可以看到源代码的左侧出现了一个"操作"按钮,所有的查看操作都会在对应行放置一个"操作"按钮,用于基于当前位置继续向前或者向后操作。

5、点击"操作"按钮,会弹出操作选项,可以在之前基础上选择向前或者向后执行,也可以继续定位到上次赋值的地方。

6、此图为第5步选择"回退到上次赋值"时的效果,可以看到代码虽然还是同样的行,但是左侧的 productAmount 变量值却变小了,程序恢复到for循环的上一次轮询时的状态。

7、也点击源代码中的赋值语句中的 "=" 号 或者调用的方法名,这时也会弹出选项,便于定位目标代码行。比如"运行到此"、"回退到此"。此处点击order.setTotalAmount所在行的setTotalAmount处,弹处选项如下:

8、选择"运行到此",可以看到左边变量值也发生相应改变。

9、点击 int totalQuantity = 0;一行的 "=" 符号,也会弹出选项,便于定位目标代码行。比如"运行到此"、"回退到此"。

10、选择"回退到此",可以看到相关变量也回滚到方法入口处的状态。

11、点击 totalQuantity += 所在行的方法调用 "getQuantity",选择运行到此。代码状态运行到 "getQuantity" 方法调用前。

12、继续点击 "getQuantity" 选单步执行(也可以点"操作"按钮选单步执行)。可以看到单步进入方法调用的效果,调用堆栈上多了一行。并且变量列表更新为此frame的变量列表。可以点击frame进行切换,查看其他frame的变量列表。

13、继续点击"操作"按钮选择单步执行。

14、点击其他frame后的效果,选中的frame会红色标记,并且显示其对应的变量列表。

15、重新选中顶部的frame,可以看到变量列表也相应刷新。

16、点击"操作"按钮选择单步回退,可以看到 frame 列表上的行号从 41 行变为 40行。

四、其他说明:

注意事项:jsnapshot是基于javaagent修改java类的字节码注入插桩代码实现,对性能有影响,不建议在生产环境使用。并且目前尚不支持反射、多线程、Map类等的场景,如有遇到以上场景相关对象的取值和溯源可能会不准确。比如对A对象的id进行了两次写操作,第一次是A.id=X 的方式,第二次是采用反射写入,那么通过反射写入的那次就会被漏掉。