阿里云Arthas使用——在日志没有输出异常情况下,如何进行线上bug定位 & stack命令 和 trace命令

前言

Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。

本篇博客介绍如何在日志没有输出异常情况下,如何进行线上bug定位,使用到了stack命令 和 trace命令。

其他的Arthas博客文章如下:

目录

引出


1.JVM调优的工具阿里云的Arthas的使用,安装和使用;

2.watch命令查看调用方法的输出参数;

3.stack定位方法调用堆栈;

4.trace命名分析调用路径;

使用arthas进行线上bug定位

前端访问链接报错

定位到调用的controller

java 复制代码
com.wattsonic.iot.gateway.controller.TestController#getLatestReportData

stack命令

输出当前方法被调用的调用路径,很多时候我们都知道一个方法被执行,但这个方法被执行的路径非常多,或者你根本就不知道这个方法是从那里被执行了,此时你需要的是 stack 命令。

java 复制代码
stack com.wattsonic.iot.gateway.controller.TestController getLatestReportData 

trace命令

trace 命令能主动搜索 class-pattern/method-pattern 对应的方法调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路。

未报异常

java 复制代码
trace org.springframework.web.method.support.InvocableHandlerMethod doInvoke

定位到异常

java 复制代码
trace org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter handle
java 复制代码
`---ts=2023-12-05 10:16:26;thread_name=http-nio-8082-exec-4;id=4e;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@5f45bc8e
    `---[1.108864ms] org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter:handle() [throws Exception]
        +---[80.80% 0.895941ms ] org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter:handleInternal() #87 [throws Exception]
        `---throw:org.springframework.http.converter.HttpMessageConversionException #462 [Type definition error: [simple type, class com.google.protobuf.UnknownFieldSet$Parser]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class com.google.protobuf.UnknownFieldSet$Parser and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: java.util.concurrent.ConcurrentHashMap["S231027J0043"]->com.wattsonic.iot.gateway.bolt.protocol.beta.Level2["unknownFields"]->com.google.protobuf.UnknownFieldSet["parserForType"])]

进一步分析

这里定位trace哪个类的时候,本质是用到了SpringMVC 的运行流程:从客户端发送请求request到springMvc框架返回响应response的全流程,理解其流程。

SpringMVC 的运行流程

相关博客文章如下:

SpringMvc框架------【深入】SpringMVC 的运行流程:从客户端发送请求request到springMvc框架返回响应response的全流程分析 & DispatcherServlet

(1)整个过程开始于客户端发出的一个HTTP请求,Web应用服务器接收到这个请求。如果匹配DispatcherServlet的请求映射路径,则Web容器将该请求转交给DispatcherServlet处理;

(2)DispatcherServlet的作用是将请求分发到不同的处理器:DispatcherServlet接收到这个请求后,根据请求的信息(包括URL、HTTP方法、请求报文头、请求参数、Cookies等)及HandlerMapping的配置找到处理该请求的处理器(Handler);

(3)可将HandlerMapping看做路由控制器,将Handler看做目标主机;值得注意的是,在Spring MVC中并没有定义一个Handler接口,实际上任何一个Object都可以成为请求处理器(任何一个对象都可以作为请求的Handler);

(4)当DispatcherServlet根据HandlerMapping得到对应当前请求的Handler后,通过HandlerAdapter对Handleri进行封装,再以统一的适配器接口调用Handler;HandlerAdapter是Spring MVC框架级接口,顾名思义,HandlerAdapter是一个适配器,它用统一的接口对各种Handler方法进行调用;

(5)处理器Handler完成业务逻辑的处理后,将返回一个ModelAndView给DispatcherServlet,其中ModelAndView包含了视图逻辑名和模型数据信息,ModelAndView顾名思义,包含了数据模型以及相应的视图的信息;

(6)ModelAndView中包含的是"逻辑视图名"而非真正的视图对象,DispatcherServlet借由视图解析器ViewResolver完成逻辑视图名到真实视图对象的解析工作;

(7)当得到真正的视图对象后,DispatcherServlet会利用视图对象对模型数据进行渲染;

(8)客户端得到响应,可能是一个普通的HTML页面,也可以是XML或JSON字符串,还可以是一张图片或者一个PDF文件;


总结

1.JVM调优的工具阿里云的Arthas的使用,安装和使用;

2.watch命令查看调用方法的输出参数;

3.stack定位方法调用堆栈;

4.trace命名分析调用路径;

相关推荐
河北小博博5 小时前
阿里云 ChatOps Agent 让非标准化环境可修复:内核漏洞换盘后的容器恢复
阿里云·云计算
边境悍匪7 小时前
蜗牛学苑 Java 智能体学习 Day49|贯穿项目 5 订单下单业务 思维导图复盘
java·开发语言·spring boot·学习·阿里云
轩轶子7 小时前
Python CLI Todo:一次数据结构错误引发的 Bug
数据结构·python·bug
鬼手点金7 小时前
Claude Code示范案例-修复 Bug 工作流
java·服务器·前端·javascript·bug·openclaw
会议咨询8 小时前
2026年数据科学、云计算与智能技术国际会议(DCIT 2026)
云计算·数据科学·智能技术
ha_lydms1 天前
MaxCompute中窗口函数
大数据·hadoop·阿里云·云计算·dataworks·maxcompute·odps
GPU实战笔记1 天前
云端 GPU 暂停任务:如何把短期关机与七天资源释放边界分开判断?
云计算·云服务器·数据盘·gpu云计算·实例生命周期
QYR-分析1 天前
刚需赛道:全球一次性有创压力传感器市场深度解析
云计算
小白跃升坊2 天前
阿里云2026年AI Agent 开发者调研报告解读:企业 Agent 到底卡在哪
阿里云·agent·ai agent·ai工程·调研报告
AKAMAI2 天前
随着瓦尔·基尔默的AI分身诞生,生成式AI是否正在将好莱坞推向边缘?
人工智能·云原生·云计算