Java如何跟踪代码 java追踪

有了java代码,如何测试

你这说的太笼统了,应该具体些。

成都创新互联公司是一家专业提供泾县企业网站建设,专注与成都网站建设、网站建设H5高端网站建设、小程序制作等业务。10年已为泾县众多企业、政府机构等服务。创新互联专业网站设计公司优惠进行中。

有了Java代码之后

1、可以在代码中写些测试的方法,把你想要验证的东西,输出看一下。

2、可以用Debug的形式,跟踪代码执行,验证程序的逻辑是否正确。

3、利用JUnit写断言,测试结果

如何跟踪java代码的执行

很简单,单元测试啊!引入包 import org.junit.Test;

比如下面这个测试函数,不是main函数,但是你可以执行它并测试输出。注意要有@标识,这是注释,必要的。还有就是可以打断点啊!断点就是执行停止的地方,可以是程序某个模块,某个变量值等。

@Test

public void selectUserByID() {

// 得到SqlSession实例,便于执行增删改查、事务提交回滚等操作。

SqlSession session = getSqlSessionFactory().openSession();

try {

userPOJO user = (userPOJO) session.selectOne("mapper.userPOJO.selectByName", 2);

System.out.println(user);

} finally {

session.close();

}

}

只有java有在线诊断工具吗

Arthas 是Alibaba开源的Java诊断工具。当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?

我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?

遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?

线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!

是否有一个全局视角来查看系统的运行状况?

有什么办法可以监控到JVM的实时运行状态?

怎么快速定位应用的热点,生成火焰图?

Arthas支持jdk6+,多种系统版本,采用命令行交互模式,同时提供丰富的tab自动补全功能,进一步方便我们进行问题的定位和诊断

1.2、快速安装

1.2.1、Linux下按

下载arthas-boot.jar,在使用java -jar方式启动即可。

命令

**注意:**在进行第二条命令之前,先运行一个Java程序在内存之中,否则会报错

2、快速入门

2.1、attach一个进程

目标:

1、执行一个jar包

2、通过arthas来attach来追踪

3、进行常用的命令操作

如果端口号被占用,也可以通过命令换成另一个端口号执行。

总结:

1、启动进程

2、启动arthas-boot.jar,进入启动的进程

3、不但可以通过命令行的方式来操作arthas也可以通过浏览器来访问arthas

2.2、常用命令接触

1、dashboard仪表板

2、通过thread命令来获取到arthas-demo进程的Main Class

3、通过jad来反编译Main Clas

4、wathch具体方法

2.2.1.、dashboard仪表板

在这里插入图片描述

2.2.2、通过thread命令来获取到arthas-demo进程的Main Class

在这里插入图片描述

2.2.3、通过jad反编译Main Class

在这里插入图片描述

2.2.4、watch监视

demo.MathGame primeFactors:

demo.MathGame:包名+类名

primeFactors:方法名

returnObj:返回参数的表达式

2.2.5、退出arthas

如果只是退出当前的连接,可以用quit或者exit命令。Attach到目标进程上的arthas还会继续运行,端口会保持开放,下次连接时可以直接连接上。

如果想完全退出arthas,可以执行stop命令

在这里插入图片描述

2.3、基础命令1

1、help:查看所有帮助信息

2、cat:显示文本文件内容

3、grep:匹配查找,和linux中的grep类似,但只能用于管道命令

在这里插入图片描述

4、pwd:显示当先目录的目录地址

5、cls:清屏

2.4、基础命令2

1、session:查看当前会话信息

在这里插入图片描述

2、reset:重置增强类,将被arthas增强过的类全部还原,arthas服务端关闭时会重置所有增强过的类

在这里插入图片描述

在这里插入图片描述

3、version:输出当前目标Java进程所加载 的Arthas版本号

4、quit:退出当前Arthas客户端,其他Arthas客户端不受影响。

5、stop:关闭Arthas服务端,所有Arthas客户端全部退出。

6、keymap:Arthas快捷键列表及自定义快捷键

7、history:和linux系统作用一样 打印命令历史

3、JVM相关命令

1、dashboard

在这里插入图片描述

2、thread 线程相关:查看当前jvm的线程堆栈的信息

在这里插入图片描述

3、jvm 虚拟机相关

4、sysprop 系统属性相关

5、sysenv:查看当前jvm的环境属性

在这里插入图片描述

6、vmoption:查看、更新vm诊断相关的参数

7、getstatic:方便的查看类的静态属性

语法:getstatic 类名 属性名

8、ognl

在这里插入图片描述

3.1、反编译 jad

比如编译string类

–source-only : 只显示源码

只反编译指定的方法

xx 就是方法名

3.2、内存编译mc

内存编译器,编译.java文件生成.class

在这里插入图片描述

在这里插入图片描述

4、Arthas进阶

4.1、目标

类与类加载器

monitor、watch、trace、stack等核心命令的使用

火焰图的生存

arthas实战案例

4.2、dump

将已加载的字节码文件保存到特定的目录下,logs/arthas/classdump/

在这里插入图片描述

举例:

在这里插入图片描述

4.3、classloader

获取类加载器的信息

作用:

将jvm中所有的classloader的信息统计出来,并可以展示继承树,urls等。

让指定的classloader去getResources,打印出所有查找到的resources的url。

在这里插入图片描述

4.4、monitor

监控指定类中方法的执行情况

作用:

在这里插入图片描述

在这里插入图片描述

4.5、watch(重要)

观察到指定方法的调用情况

作用:

方法执行数据观测,方便观测到指定方法的调用情况

能观察到的范围:返回值、抛出异常、入参。通过编写OGNL表达式进行对应变量的查看

在这里插入图片描述

在这里插入图片描述

只查看第一个参数小于0的情况

在这里插入图片描述

文章知识点与官方知识档案匹配

Java技能树首页概览

89145 人正在系统学习中

打开CSDN,阅读体验更佳

java应用线上诊断神器--Arthas_linyb极客之路的博客

c、保存好/tmp/UserServiceImpl.java之后,使用mc(Memory Compiler)命令来编译,并且通过–classLoaderClass参数指定ClassLoader mc--classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader/tmp/UserServiceImpl.java-d/tmp ...

继续访问

java线上诊断工具,Java线上诊断神器Arthas-1_Skogkatt的博客-CSDN...

Arthas 是Alibaba 开源的一款线上诊断工具,相比Java 自带的jinfo, jmap,jstat 等工具更方便(起码不用记那么多参数),而且利用字节码增强技术,可以很好的对线上的问题进行定位以及解决,不用再为生产或者测试环境无法debug而感到无能为力。...

继续访问

最新发布 Arthas常用命令

arthas指令大全

继续访问

Arthas在线java进程诊断工具 在线调试神器

Arthas在线java进程诊断工具 在线调试神器 tag: java 诊断 堆栈 在线调试 耗时 死锁 arthas 阿里巴巴 Arthas 是 Alibaba 开源的Java诊断工具,深受开发者喜爱。 官网文档: 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? 遇到问题无法在.

继续访问

Java在线诊断利器之Arthas_Java老K的博客

Arthas是阿里在2019年9月份开源的一款java在线诊断工具,能够分析、诊断、定位java应用问题,例如:jvm信息、线程信息、搜索类中的方法、 跟踪代码执行、观测方法的入参和返回参数等等。 Arthas最大的特点是能在不修改代码和不需要重新发布的...

继续访问

java线上诊断神器 --Arthas__小鱼塘的博客_java网络诊断

java线上诊断神器 --Arthas 最近在工作中用到的一个非常很好的线上诊断,分析问题的神器,再次记录一下: 官方文档:简介 | arthas GitHub 地址:GitHub - alibaba/arthas: Alibaba Java Diagnostic Tool Arthas/Alibaba Java诊断利器Arthas...

继续访问

Arthas使用教程(8大分类)

1、基础命令。2、JVM相关。3、类与类加载器。4、option全局选项。5、项目中使用案例。

继续访问

Arthas介绍

这篇文章为大家推荐一个为Java应用程序排查问题的非常好用的工具:Arthas,首先声明一下,这边文章并不是教大家如何使用,它只是一个搬运工,在Arthas的github上已经有非常详细的使用教程了。 Arthas(阿尔萨斯)是阿里巴巴开源的Java诊断工具,深受开发者喜爱 当你遇到以下类似问题而束手无策时,Arthas统统可以帮你解决 某个类是从哪个jar包加载的,为什么会报各种类相关的Exc...

继续访问

Arthas - Java线上诊断工具_是良辰的博客

java -jar arthas-boot.jar 启动之后就可以看到一个java程序列表,像我这就是只有一个java程序在跑,就是当前根目录下面的app.jar 选择1,即可对app.jar进行监控诊断。 PS:如果是虚拟机,直接在应用服务器上面执行上面的命令,如果是docke...

继续访问

java线上诊断工具Arthas-实战案例_小姐姐修灯泡吗的博客

首先我就来简单介绍下他的作用:(粘贴官网)Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 Arthas 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的...

继续访问

arthas 使用教程

arthas安装使用 首先是安装,说白了其实把他当成一个工具来用就行了,你什么服务需要在线进行性能情况的一个监测和性能的瓶颈排查。第三步启动arthas-boot.jar,启动的时候要注意你需要监测的java是启动的可以用jps-l命令查看你的java服务。第二步把jar包上传到你需要进行java性能监测的服务器上。线上正式环境把他当成一个排查慢问题的工具还是很好用的。以上就是启动服务了下面开始介绍常用的一些排查命令。...

继续访问

Arthas

Arthas.md 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? 线上遇到某个用户的数据处理有问题,...

继续访问

Java线上问题诊断工具Arthas_星光Starsray的博客

java -jar arthas-boot.jar //启动 当看到控制台出现arthas的标志,表明启动成功!注意此时已经进入控制台,主要是arthas的命令使用。 [root@xxptweb01 arthas]# java -jar arthas-boot.jar

继续访问

【Java】性能问题诊断利器Arthas --常用命令示例_叹了口丶气的博客-C...

Arthas 是一款阿里开源的 Java 线上诊断工具,功能强大,可以在不修改代码或者重启服务的情况下快速定位线上问题。 官方文档:Arthas官网 二、安装 从官网下载 Arthas 全量包安装(因为快速安装可能因网络原因下载失败),然后用 java -jar 方...

继续访问

Java诊断工具Arthas使用说明

Arthas 是Alibaba开源的Java诊断工具,Arthas支持JDK 6+,支持Linux/Mac/Windows,支持命令行交互模式、 Tab 自动补全功能,方便进行问题的定位和诊断。

继续访问

JVM性能调优篇07-阿里巴巴Arthas工具详解

阿里巴巴Arthas工具详解

继续访问

Arthas 是Alibaba开源的Java诊断工具

Arthas是Alibaba开源的Java诊断工具,深受开发者喜爱。 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! 是否有一个全局视角来查看系统的运行...

继续访问

JVM之GC 调优工具 Arthas 实战使用(二)

Arthas 是 Alibaba 开源的 Java 诊断工具,深受开发者喜爱。Arthas 支持 JDK 6以上版本,支持 Linux/Mac/Windows,而且这些环境的命令都一样,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进行问题的定位和诊断 官方文档参考 一、下载和安装 不需要安装,就是一个 jar 包 curl -O

继续访问

Arthas详解

文章目录概述安装快速安装使用`arthas-boot`(官网推荐)使用`as.sh`全量安装把Arthas安装到基础镜像里卸载使用命令详解基础命令helpcatechogrepbase64teepwdclsversionhistorykeymap后台异步命令相关快捷键会话相关quitstopsessionresetjvm相关dashboardthreadjvmsyspropsysenvvmoptionperfcounterloggergetstaticognlmbeanheapdumpvmtoolclass

继续访问

Arthas基础

Arthas:快速入门

继续访问

Arthas入门到精通

Arthas是Alibaba开源的一款Java诊断工具,方便开发者在线排查问题,无需重启,同时可以跟踪Java代码,实时监控JVM状态,目前Arthas仅支持JDK6+,支持Linux/Mac/Windows,采用命令行交互模式,具有 Tab 自动补全功能,便于开发者进行快速定位和诊断问题。 离线全量下载(如果服务器没有外网可以采用这种情况)

继续访问

阿里Java诊断工具 arthas - 介绍及指令大全

一、arthas Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! 是否有一个全局视角来查看系统的运行状况? 有什么办法可以监控到

继续访问

java诊断神器 arthas(阿尔萨斯)

java诊断神器 arthas(阿尔萨斯) 官网地址: 1、快速开始 1.1、windows版本安装 # 命令行输入 curl -0 --output arthas-boot.jar # 启动arthas 注意:启动前已经要有java进程运行,否则无法进入 java -jar arthas-boot.jar --telnet-por

继续访问

帮助定位Java方法优化之arthas端口被占用解决的办法

另起一个端口号 启动arthas命令的后面加上端口号的相关参数 java -jar arthas-boot.jar --telnet-port 端口号 --http-port -1 关闭占用端口的服务 先进入占用端口的服务,然后输入stop将它停掉就可以了 注:请再每一次使用之后使用stop命令退出,这样也省掉一些不必要的麻烦!!! ...

继续访问

Java 诊断工具之 Arthas

Arthas 是 Alibaba 开源的 Java 诊断工具。Ta 可以动态跟踪 Java 代码,实时监控 JVM 状态,可以在不中断程序执行的情况下轻松完成 JVM 相关问题排查工作。支持 JDK 6+,支持 Linux/Mac/Windows。

继续访问

Arthas-java在线调试工具的使用

一、arthas能干什么? 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! 是否有一个全局视角来查看系统的运行状况? 有什么办法可以监控到JVM的实时运行状态? 怎么快速定位应用的热点,生成火焰图? 怎样直接从JVM内查找某个类的实例? Arthas支持JDK 6+

继续访问

Java线上诊断工具Arthas

概述 Arthas是一个开源的线上诊断工具,可以实时查看线上代码运行情况,详情参考Arthas 命令列表 jad命令(获取已加载类的源码) //主要用来看已经加载了类的源码,一般用于动态加载的class的源码比较方便 [arthas@773]$ jad com/example/jvm/Hello ClassLoader: +-sun.misc.Launcher$AppClassLoader@18b4aac2 +-sun.misc.Launcher$ExtClassLoader@362d9..

继续访问

java 线上诊断命令

java

学习

如何调试跟踪Android Framework源代码

本文讲解如何在Eclipse中导入Android源代码(包括Framework和Application的代码),然后通过模拟器或真机跟踪/调试Android的Java代码,区别于一般基于Android SDK的纯应用开发,这里可以跟踪/调试Framework中的代码。

一、准备工作

确保机器上已经安装并配置下列软件环境:JDK/ Eclipse / Android SDK / ADT

即,机器上已经安装了Eclipse下Android应用开发所需的环境。如果还未配置,移步《搭建Windows下Android应用开发环境——Eclipse/Android/ADT》。

另外,为了跟踪调试Android源码,你还需要有Android源码,并有源码的编译环境,可以是:

虚拟机环境 虚拟机中安装Linux,Linux下编译Android源码。此环境下,如果要在宿主机的Eclipse中调试,还需要把Android的源码路径共享出来,宿主机可访问到;

有单独的可编译Android的网络环境 在你的客户端的机器上访问服务器共享出来的Android的源码路径;

Linux环境下直接通过Eclipse跟踪调试本机上的Android源码。

注意:不管哪种工作方式,Android源码要都是已经编译过的,且编译时采用的是Eng模式(vs User mode)。编译Android Platform和Kernel的过程,可参考《Ubuntu10.10下编译Android2.2平台》及《Ubuntu10.10下编译Android2.2内核》。

二、基本设置

准备工作完毕之后,现在做一些基本的设置。

1. 把Android源码路径Android_ROOT下的development\ide\eclipse中的.classpath文件复制到Android_ROOT下;如果需要在模拟器中进行调试的话,需要复制三个img(具体方法见)

2. 修改Eclipse的设置

修改eclipse.ini文件,更改下列内容:

[plain] view plaincopy

-Xms40m

-Xmx384m

改为:

[java] view plaincopy

-Xms128m

-Xmx512m

这里增大最小Java堆大小到128MB,增大最大Java堆大小到512MB。

三、Eclipse中创建工程

1. File New Java Project

2. 输入项目名

3. 取消Use default location,并在Location中输入或选择Android源码路径Android_ROOT

4. 选择Next Finish。会有一个漫长的等待过程

新建的工程可能会有错误,根据错误提示,加入或者删除项目中配置的程序包。

四、调试环境配置

1. 右击刚刚在#3中创建的项目;

2. 选择:Debug As Debug Configurations…;

3. 右击“Remote Java Application”,选择New。或者直接双击“Remote Java Application”创建一个新的Remote Application。

4. 填入Name;Project选择刚刚创建的项目Android2.3.7;端口填写8700(不一定是8700,到DDMS Perspective下的Device View中看所需的端口号)。

5. Apply保存,然后退出。

五、调试

可以通过模拟器或者真机调试。

无论模拟器还是真机,都要:

先启动机器(模拟器启动,或真机打开,并通过USB与PC正常连接),也就是要在DDMS Perspective的Devices视图中看到有机器连接;

确保运行中的代码与你要调试的代码是一样的。

假如,我们想要跟踪锁屏解锁的调用情况。

我们知道解锁的实现是在LockScreen.java的onGrabbedStateChange()函数,运行在system_process进程中。

那么,

1.        在onGrabbedStateChange()中要调试的地方设置断点;

2.        在Device View中,选中system_process,并点击小爬虫图标;

3.        用Section#4创建的Debug配置,Debug;

4.        在模拟器或真机上,执行到解锁操作时,代码就会停在断点处;

这样你就可以,

把鼠标放在某个变量上,看它的值。也可以Eclipse中的各种调试手段调试你的代码。

通过Step Into / Step Over / Resume / Suspend / Terminate等在Debug View中控制程序的执行。

总结

通过本文可以:

本文讲解是基于Windows环境的,但是不仅适用于Windows环境,同样适用于Mac OS和Linux系统,只是一些路径和使用方式有差别;

可以跟踪/调试所有Android中Java的源码(无论Framework的代码,还是App中的代码),并不能Debug Framework中的c/c++ code;

为了使整个项目在Eclipse中都能编译过,.classpath中也包含了out/里编译生成的内容,所以必须保证Android源码是已经编译过的。

跟踪/调试的前提是要在所要调试代码处设置断点,并知道该处代码执行在哪个进程中。

===================================================================================================================

如果导入的工程有错误,可以参照下面方法操作。

===================================================================================================================

我们导入一个android自带应用的工程时,往往有很多错误。以自带的 AlarmClock 为例,导入eclipse后,往往出现很多错误,如下图所示:

例如,上图中的Intent.ACTION_ALARM_CHANGED 无法访问,下面我们就找到源代码看看原因何在?

根据java 编程规范,我们知道这个api (静态变量)被隐藏掉了,所以在sdk中无法使用。在知道了原因之后,我们有几种解决方案(建议使用方法二):

1. 自己将源代码中的@hide去掉,然后编译一个sdk来替换默认的sdk。

在linux上使用  make PRODUCT-sdk-sdk 命令,编译一个新的sdk出来,注意编译后其实我们不需要整个sdk,只需要android.jar这个文件替换掉sdk里的android.jar,例如:笔者的sdk里的jar对应的目录为:

F:/Program Files/Android/android-sdk-windows/platforms/android-8/android.jar

具体编译sdk的方法是,在linux编译环境下用命令 make PRODUCT-sdk-sdk ,成功后,会有如下提示: 

Package SDK: out/host/linux-x86/sdk/android-sdk_eng.stevewang_linux-x86.zip

我们进入到 linux编译环境的 out/host/linux-x86/sdk/android-sdk_eng.stevewang_linux-x86/platforms/android-2.2/目录下可以看到android.jar 文件。使用此文件替换   F:/Program Files/Android/android-sdk-windows/platforms/android-8/android.jar 即可。替换前记得备份

此方法较为麻烦,建议使用方法二

2. 添加framework 编译出来的class.jar文件到 eclipse的build path

其实在编译android的时候,我们将framework 编译到一个临时的jar包中了,这个jar包的路径一般为: 

out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar

[font='dejavu]我们只需要在linux上android源代码目录下使用make 命令即可生成此文件。

[font='dejavu]

[font='dejavu]由于这个jar文件中的api 还没有重新打包,里面被@hide掉的api并没有被去掉。所以我们依然能够引用里面

[font='dejavu]被@hide的api 。而sdk 中的android.jar文件时重新打包生成的,其里标记有@hide的api已经被去掉了。

[font='dejavu]所以我们把 out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar 拷贝到本地pc上。

然后在工程中添加此jar包。

具体方法: 

1 . 拷贝linux编译生成的  out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar到本机PC。

2,在eclipse的Android项目中,选择项目属性-Java Build Path-Libraries-Add Library-User Library-Next- UserLibraries进入到User Libraries管理界面,点击New新建一个User Library,比如android_framework,点击Add Jars把Jar包加入到建立的User Library中,最后点击OK。

3.选择项目属性-Java Build Path-Order and Export,把所建立的User Libraries移到Android SDK的上面。

如下图:

之后我们的工程错误消失了:

怎么看别人的java代码

看别人的代码是一件比较痛苦的事情,如果代码注释多并且编写很规则的话那就比较好,

如果有项目需求文档或流程设计图最好先看看系统的整体功能

然后根据项目的模块划分对整体有一个认知

再根据模块找到对应的代码模块(需要注意模块间的关联)

根据DB设计说明查看业务表的关联关系

最后根据项目文档重新查看项目整体构成,这样看印象比较深刻一些,千万不要抠某一个功能的具体业务与实现,只需要知道模块的大概业务,然后当需要的时候再进行细细研究某一功能

以上是我的经验之谈,希望对你有帮助。


当前文章:Java如何跟踪代码 java追踪
文章URL:http://azwzsj.com/article/dooppji.html