小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
镜像中的JAVA程序问题排查
生成dump文件
1. tar zxvf jdk1.8.0_131.tgz //解压压缩包
2. docker cp jdk1.8.0_131 xxx:/home/admin //将jdk包拷入容器
3. docker exec -it xxx bash //进入容器
4. cd jdk1.8.0_131/bin //进入jdk的bin目录 \
5. ps -ef | grep 'xxx' //获取console的进程id
6. ./jmap -dump:live,format=b,file=aaa.hprof 进程id //生成hprof文件
7. exit # 退出容器
8. docker cp xxx:/home/admin/jdk1.8.0_131/bin/aaa.hprof /home/admin //从容器中拷出 \
Arthas
请求事件监控导出数据报数据格式错误异常
问题描述:点击事件监控的导出按钮 报数据格式错误异常,检查error.log无明确报错信息打印,不能确 定是什么字段数据类型错误。
- 翻阅代码 异常最终会被ControllerExceptionHandler拦截处理
- watch命令查看handleException的入参
watch
com.xxx.xxx.xxx.xxx.ControllerExceptionHandler
handleException '{params,returnObj,throwExp}' -v -n 5 -x 3 '1==1
- 发现问题
发现入参的异常对象打印出了 logExortParam.policyStatus 字段。
查看代码发现该字段为 Sting 类型,在SET方法中未对传入 空字符串 情况做处理。
最终异常为 java.lang.IllegalArgumentException: No enum constant com.xxx.xxx.xxx.constant.PolicyStatus.POLICYSTATUS
Docker引入方式
FROM xxx/basic/oracle-jdk:8
COPY --from=hengyunabc/arthas:latest /opt/arthas /opt/arthas
有的镜像使用了特殊的JRE基础镜像,无法正常使用Arthas,可以将Arthas拷入JDK包,再将JDK包拷入
镜像中,在bin目录使用 ./java -jar arthas-boor.jar 启动。