记一次Arthas调试生产服务器BUG的记录,因未初始化导致的JNI结果错误

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ren365880/article/details/88021024

感谢阿里开源的好工具 Arthas 用户文档
在偶然的情况下发现了这个bug,这个BUG在启动tomcat后无论正确还是错误的参数返回的结果都是正确的,只有在启动tomcat后传递过一次正确参数再传递错误的才会出现,而且返回的是上一次正确的结果,当时发现bug并没有发现这个规律,所以使用阿里的Arthas在线上服务器上进行调试。

首先测试了一下调用C的方法,发现返回了结果,把这个结果保存下来
在这里插入图片描述
然后在本地开发debug出相同参数的结果,对比两个结果确实不一样,这次确定了这个bug确实存在,出现这种问题有2个方面,一个是服务器的Java代码有问题,一个是C代码有问题,为了确认是哪里产生的问题,又在线上服务器打印出方法的传参和JNI结果,发现传入的参数是正确的,但是在C中运算后返回的就是错误的,确定了问题出现在C代码中。
在这里插入图片描述
但是返回的byte并不是很直观,又观测另一个方法查看JNI返回的转成16进制的数据

在这里插入图片描述
看到16进制数据才发现这是上一次正确参数的结果,C代码是别人写的,JNI接口是我写的,如果是C经过一些列运算后发现参数无法运算出结果这返回0,结构体的没有进行操作,应为服务器启动后不会释放动态链接库,所以上次结果还在,我直接拿结构体中的数据还是上次的结果,赶紧在JNI接口中把结构体中的全部附0,打成动态连接库问题解决。

猜你喜欢

转载自blog.csdn.net/ren365880/article/details/88021024