From 464d4ed1228b8abb6ab28aeb2c8c5fe530f7f6cb Mon Sep 17 00:00:00 2001 From: hollowman6 Date: Wed, 12 Aug 2020 10:13:45 +0800 Subject: [PATCH] Fix classloaderhash problem in advance tutorial Signed-off-by: hollowman6 --- .../arthas-advanced-cn/case-classloader.md | 7 ++--- .../case-jad-mc-redefine.md | 6 ++++- .../case-logger-config-problem.md | 14 +++++----- .../case-ognl-update-logger-level.md | 12 ++++----- tutorials/katacoda/arthas-advanced-cn/ognl.md | 25 ++++++++++++++++-- .../arthas-advanced-en/case-classloader.md | 8 +++--- .../case-jad-mc-redefine.md | 6 ++++- .../case-logger-config-problem.md | 14 +++++----- .../case-ognl-update-logger-level.md | 12 ++++----- tutorials/katacoda/arthas-advanced-en/ognl.md | 24 +++++++++++++++-- .../common-resources/assets/demo-web.png | Bin 0 -> 24593 bytes 11 files changed, 90 insertions(+), 38 deletions(-) create mode 100644 tutorials/katacoda/common-resources/assets/demo-web.png diff --git a/tutorials/katacoda/arthas-advanced-cn/case-classloader.md b/tutorials/katacoda/arthas-advanced-cn/case-classloader.md index 7508fd97c..32e561ba3 100644 --- a/tutorials/katacoda/arthas-advanced-cn/case-classloader.md +++ b/tutorials/katacoda/arthas-advanced-cn/case-classloader.md @@ -80,12 +80,13 @@ $ classloader -t +-org.apache.jasper.servlet.JasperLoader@21ae0fe2 ``` +注意:请使用你的classLoaderHash值覆盖 `` ,然后手动执行下面相关命令: ### 列出ClassLoader的urls 比如上面查看到的spring LaunchedURLClassLoader的 hashcode是`1be6f5c3`,可以通过`-c`参数来列出它的所有urls: -`classloader -c 1be6f5c3`{{execute T2}} +`classloader -c ` ``` $ classloader -c 1be6f5c3 @@ -97,7 +98,7 @@ jar:file:/home/scrapbook/tutorial/demo-arthas-spring-boot.jar!/BOOT-INF/lib/spri ### 加载指定ClassLoader里的资源文件 -查找指定的资源文件: `classloader -c 1be6f5c3 -r logback-spring.xml`{{execute T2}} +查找指定的资源文件: `classloader -c -r logback-spring.xml` ``` $ classloader -c 1be6f5c3 -r logback-spring.xml @@ -108,7 +109,7 @@ $ classloader -c 1be6f5c3 -r logback-spring.xml 比如用上面的spring LaunchedURLClassLoader 尝试加载 `java.lang.String` : -`classloader -c 1be6f5c3 --load java.lang.String`{{execute T2}} +`classloader -c --load java.lang.String` ``` $ classloader -c 1be6f5c3 --load java.lang.String diff --git a/tutorials/katacoda/arthas-advanced-cn/case-jad-mc-redefine.md b/tutorials/katacoda/arthas-advanced-cn/case-jad-mc-redefine.md index 92b7a244c..6cb8d7fc5 100644 --- a/tutorials/katacoda/arthas-advanced-cn/case-jad-mc-redefine.md +++ b/tutorials/katacoda/arthas-advanced-cn/case-jad-mc-redefine.md @@ -45,11 +45,15 @@ $ sc -d *UserController | grep classLoaderHash 可以发现是 spring boot `LaunchedURLClassLoader@1be6f5c3` 加载的。 +请记下你的classLoaderHash,后面需要使用它。在这里,它是 `1be6f5c3`。 + +注意:请使用你的classLoaderHash值覆盖 `` ,然后手动执行这些命令: + ### mc 保存好`/tmp/UserController.java`之后,使用`mc`(Memory Compiler)命令来编译,并且通过`-c`参数指定ClassLoader: -`mc -c 1be6f5c3 /tmp/UserController.java -d /tmp`{{execute T2}} +`mc -c /tmp/UserController.java -d /tmp` ```bash $ mc -c 1be6f5c3 /tmp/UserController.java -d /tmp diff --git a/tutorials/katacoda/arthas-advanced-cn/case-logger-config-problem.md b/tutorials/katacoda/arthas-advanced-cn/case-logger-config-problem.md index e37c7d0c5..da6ad4dc2 100644 --- a/tutorials/katacoda/arthas-advanced-cn/case-logger-config-problem.md +++ b/tutorials/katacoda/arthas-advanced-cn/case-logger-config-problem.md @@ -6,11 +6,11 @@ 以`UserController`为例,它使用的是slf4j api,但实际使用到的logger系统是logback。 -`ognl -c 1be6f5c3 '@com.example.demo.arthas.user.UserController@logger'`{{execute T2}} +`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger'`{{execute T2}} ```bash -$ ognl -c 1be6f5c3 '@com.example.demo.arthas.user.UserController@logger' +$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger' @Logger[ serialVersionUID=@Long[5454405123156820674], FQCN=@String[ch.qos.logback.classic.Logger], @@ -28,15 +28,15 @@ $ ognl -c 1be6f5c3 '@com.example.demo.arthas.user.UserController@logger' ### 获取logback实际加载的配置文件 -`ognl -c 1be6f5c3 '#map1=@org.slf4j.LoggerFactory@getLogger("root").loggerContext.objectMap, #map1.get("CONFIGURATION_WATCH_LIST")'`{{execute T2}} +`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '#map1=@org.slf4j.LoggerFactory@getLogger("root").loggerContext.objectMap, #map1.get("CONFIGURATION_WATCH_LIST")'`{{execute T2}} ### 使用classloader命令查找可能存在的logger配置文件 -`classloader -c 1be6f5c3 -r logback-spring.xml`{{execute T2}} +`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r logback-spring.xml`{{execute T2}} ``` -$ classloader -c 1be6f5c3 -r logback-spring.xml +$ classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r logback-spring.xml jar:file:/Users/hengyunabc/code/java/spring-boot-inside/demo-arthas-spring-boot/target/demo-arthas-spring-boot-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/logback-spring.xml Affect(row-cnt:1) cost in 13 ms. @@ -45,8 +45,8 @@ Affect(row-cnt:1) cost in 13 ms. 可以尝试加载容易冲突的文件: -`classloader -c 1be6f5c3 -r logback.xml`{{execute T2}} +`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r logback.xml`{{execute T2}} -`classloader -c 1be6f5c3 -r log4j.properties`{{execute T2}} +`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r log4j.properties`{{execute T2}} diff --git a/tutorials/katacoda/arthas-advanced-cn/case-ognl-update-logger-level.md b/tutorials/katacoda/arthas-advanced-cn/case-ognl-update-logger-level.md index 2cffd64b9..a2c3fcca8 100644 --- a/tutorials/katacoda/arthas-advanced-cn/case-ognl-update-logger-level.md +++ b/tutorials/katacoda/arthas-advanced-cn/case-ognl-update-logger-level.md @@ -14,10 +14,10 @@ $ sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash ### 用ognl获取logger -`ognl -c 1be6f5c3 '@com.example.demo.arthas.user.UserController@logger'`{{execute T2}} +`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger'`{{execute T2}} ```bash -$ ognl -c 1be6f5c3 '@com.example.demo.arthas.user.UserController@logger' +$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger' @Logger[ serialVersionUID=@Long[5454405123156820674], FQCN=@String[ch.qos.logback.classic.Logger], @@ -36,14 +36,14 @@ $ ognl -c 1be6f5c3 '@com.example.demo.arthas.user.UserController@logger' ### 单独设置UserController的logger level -`ognl -c 1be6f5c3 '@com.example.demo.arthas.user.UserController@logger.setLevel(@ch.qos.logback.classic.Level@DEBUG)'`{{execute T2}} +`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger.setLevel(@ch.qos.logback.classic.Level@DEBUG)'`{{execute T2}} 再次获取`UserController@logger`,可以发现已经是`DEBUG`了: -`ognl -c 1be6f5c3 '@com.example.demo.arthas.user.UserController@logger'`{{execute T2}} +`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger'`{{execute T2}} ```bash -$ ognl -c 1be6f5c3 '@com.example.demo.arthas.user.UserController@logger' +$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger' @Logger[ serialVersionUID=@Long[5454405123156820674], FQCN=@String[ch.qos.logback.classic.Logger], @@ -62,5 +62,5 @@ $ ognl -c 1be6f5c3 '@com.example.demo.arthas.user.UserController@logger' 通过获取`root` logger,可以修改全局的logger level: -`ognl -c 1be6f5c3 '@org.slf4j.LoggerFactory@getLogger("root").setLevel(@ch.qos.logback.classic.Level@DEBUG)'`{{execute T2}} +`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@org.slf4j.LoggerFactory@getLogger("root").setLevel(@ch.qos.logback.classic.Level@DEBUG)'`{{execute T2}} diff --git a/tutorials/katacoda/arthas-advanced-cn/ognl.md b/tutorials/katacoda/arthas-advanced-cn/ognl.md index 3fb2c2322..7a1c25d20 100644 --- a/tutorials/katacoda/arthas-advanced-cn/ognl.md +++ b/tutorials/katacoda/arthas-advanced-cn/ognl.md @@ -18,15 +18,36 @@ $ sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash classLoaderHash 1be6f5c3 ``` +注意hashcode是变化的,需要先查看当前的ClassLoader信息,提取对应ClassLoader的hashcode。 + +如果你使用`-c`,你需要手动输入hashcode:`-c ` + +```bash +$ ognl -c 1be6f5c3 @com.example.demo.arthas.user.UserController@logger +``` + +对于只有唯一实例的ClassLoader可以通过`--classLoaderClass`指定class name,使用起来更加方便: + +```bash +$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader @org.springframework.boot.SpringApplication@logger +@Slf4jLocationAwareLog[ + FQCN=@String[org.apache.commons.logging.LogAdapter$Slf4jLocationAwareLog], + name=@String[org.springframework.boot.SpringApplication], + logger=@Logger[Logger[org.springframework.boot.SpringApplication]], +] +``` + + `--classLoaderClass` 的值是ClassLoader的类名,只有匹配到唯一的ClassLoader实例时才能工作,目的是方便输入通用命令,而`-c `是动态变化的。 + ### 获取静态类的静态字段 获取`UserController`类里的`logger`字段: -`ognl -c 1be6f5c3 @com.example.demo.arthas.user.UserController@logger`{{execute T2}} +`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader @com.example.demo.arthas.user.UserController@logger`{{execute T2}} 还可以通过`-x`参数控制返回值的展开层数。比如: -`ognl -c 1be6f5c3 -x 2 @com.example.demo.arthas.user.UserController@logger`{{execute T2}} +`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -x 2 @com.example.demo.arthas.user.UserController@logger`{{execute T2}} ### 执行多行表达式,赋值给临时变量,返回一个List diff --git a/tutorials/katacoda/arthas-advanced-en/case-classloader.md b/tutorials/katacoda/arthas-advanced-en/case-classloader.md index 4a05d65fe..06d50c16b 100644 --- a/tutorials/katacoda/arthas-advanced-en/case-classloader.md +++ b/tutorials/katacoda/arthas-advanced-en/case-classloader.md @@ -81,11 +81,13 @@ $ classloader -t +-org.apache.jasper.servlet.JasperLoader@21ae0fe2 ``` +Note: Please replace `` with your classLoaderHash above, then execute the related commands manually in the following steps: + ### List the urls of the ClassLoader For example, the hashcode of spring `LaunchedURLClassLoader` viewed above is `1be6f5c3`, and all its urls can be listed by the `-c` parameter: -`classloader -c 1be6f5c3`{{execute T2}} +`classloader -c ` ``` $ classloader -c 1be6f5c3 @@ -97,7 +99,7 @@ jar:file:/home/scrapbook/tutorial/demo-arthas-spring-boot.jar!/BOOT-INF/lib/spri ### Load the resource file in the specified ClassLoader -Load the specified resource file: `classloader -c 1be6f5c3 -r logback-spring.xml`{{execute T2}} +Load the specified resource file: `classloader -c -r logback-spring.xml` ``` $ classloader -c 1be6f5c3 -r logback-spring.xml @@ -108,7 +110,7 @@ $ classloader -c 1be6f5c3 -r logback-spring.xml For example, try loading `java.lang.String` with spring LaunchedURLClassLoader : -`classloader -c 1be6f5c3 --load java.lang.String`{{execute T2}} +`classloader -c --load java.lang.String` ``` $ classloader -c 1be6f5c3 --load java.lang.String diff --git a/tutorials/katacoda/arthas-advanced-en/case-jad-mc-redefine.md b/tutorials/katacoda/arthas-advanced-en/case-jad-mc-redefine.md index 7bd589bd7..320395eb4 100644 --- a/tutorials/katacoda/arthas-advanced-en/case-jad-mc-redefine.md +++ b/tutorials/katacoda/arthas-advanced-en/case-jad-mc-redefine.md @@ -46,11 +46,15 @@ $ sc -d *UserController | grep classLoaderHash It can be found that it is loaded by spring boot `LaunchedURLClassLoader@1be6f5c3`. +Please write down your classLoaderHash here, in the case here, it's `1be6f5c3`. It will be used in the future steps. + +Note: Please replace `` with your classLoaderHash above, then execute the related commands manually in the following steps: + ### mc After saving `/tmp/UserController.java`, compile with the `mc` (Memory Compiler) command and specify the ClassLoader with the `-c` option: -`mc -c 1be6f5c3 /tmp/UserController.java -d /tmp`{{execute T2}} +`mc -c /tmp/UserController.java -d /tmp` ```bash $ mc -c 1be6f5c3 /tmp/UserController.java -d /tmp diff --git a/tutorials/katacoda/arthas-advanced-en/case-logger-config-problem.md b/tutorials/katacoda/arthas-advanced-en/case-logger-config-problem.md index 7c3d56a9d..908298d50 100644 --- a/tutorials/katacoda/arthas-advanced-en/case-logger-config-problem.md +++ b/tutorials/katacoda/arthas-advanced-en/case-logger-config-problem.md @@ -7,11 +7,11 @@ In this case, show how to troubleshoot logger conflicts. Take `UserController` as an example, it uses slf4j api, but the actual logger system used is logback. -`ognl -c 1be6f5c3 '@com.example.demo.arthas.user.UserController@logger'`{{execute T2}} +`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger'`{{execute T2}} ```bash -$ ognl -c 1be6f5c3 '@com.example.demo.arthas.user.UserController@logger' +$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger' @Logger[ serialVersionUID=@Long[5454405123156820674], FQCN=@String[ch.qos.logback.classic.Logger], @@ -29,15 +29,15 @@ $ ognl -c 1be6f5c3 '@com.example.demo.arthas.user.UserController@logger' ### Find the configuration file actually loaded by the logback -`ognl -c 1be6f5c3 '#map1=@org.slf4j.LoggerFactory@getLogger("root").loggerContext.objectMap, #map1.get("CONFIGURATION_WATCH_LIST")'`{{execute T2}} +`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '#map1=@org.slf4j.LoggerFactory@getLogger("root").loggerContext.objectMap, #map1.get("CONFIGURATION_WATCH_LIST")'`{{execute T2}} ### Use the classloader command to find possible logger configuration files -`classloader -c 1be6f5c3 -r logback-spring.xml`{{execute T2}} +`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r logback-spring.xml`{{execute T2}} ``` -$ classloader -c 1be6f5c3 -r logback-spring.xml +$ classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r logback-spring.xml jar:file:/Users/hengyunabc/code/java/spring-boot-inside/demo-arthas-spring-boot/target/demo-arthas-spring-boot-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/logback-spring.xml Affect(row-cnt:1) cost in 13 ms. @@ -46,8 +46,8 @@ You can know the specific source of the loaded configuration. You can try to load files that are prone to conflict: -`classloader -c 1be6f5c3 -r logback.xml`{{execute T2}} +`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r logback.xml`{{execute T2}} -`classloader -c 1be6f5c3 -r log4j.properties`{{execute T2}} +`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r log4j.properties`{{execute T2}} diff --git a/tutorials/katacoda/arthas-advanced-en/case-ognl-update-logger-level.md b/tutorials/katacoda/arthas-advanced-en/case-ognl-update-logger-level.md index 671f86432..ac3fe73a5 100644 --- a/tutorials/katacoda/arthas-advanced-en/case-ognl-update-logger-level.md +++ b/tutorials/katacoda/arthas-advanced-en/case-ognl-update-logger-level.md @@ -12,10 +12,10 @@ $ sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash ### Use ognl command to get the logger -`ognl -c 1be6f5c3 '@com.example.demo.arthas.user.UserController@logger'`{{execute T2}} +`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger'`{{execute T2}} ```bash -$ ognl -c 1be6f5c3 '@com.example.demo.arthas.user.UserController@logger' +$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger' @Logger[ serialVersionUID=@Long[5454405123156820674], FQCN=@String[ch.qos.logback.classic.Logger], @@ -36,14 +36,14 @@ The user can know that `UserController@logger` actually uses logback. Because `l ### Change the logger level of UserController -`ognl -c 1be6f5c3 '@com.example.demo.arthas.user.UserController@logger.setLevel(@ch.qos.logback.classic.Level@DEBUG)'`{{execute T2}} +`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger.setLevel(@ch.qos.logback.classic.Level@DEBUG)'`{{execute T2}} Get `UserController@logger` again, the user can see that it is already `DEBUG`: -`ognl -c 1be6f5c3 '@com.example.demo.arthas.user.UserController@logger'`{{execute T2}} +`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger'`{{execute T2}} ```bash -$ ognl -c 1be6f5c3 '@com.example.demo.arthas.user.UserController@logger' +$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger' @Logger[ serialVersionUID=@Long[5454405123156820674], FQCN=@String[ch.qos.logback.classic.Logger], @@ -62,5 +62,5 @@ $ ognl -c 1be6f5c3 '@com.example.demo.arthas.user.UserController@logger' By getting the `root` logger, the user can modify the global logger level: -`ognl -c 1be6f5c3 '@org.slf4j.LoggerFactory@getLogger("root").setLevel(@ch.qos.logback.classic.Level@DEBUG)'`{{execute T2}} +`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@org.slf4j.LoggerFactory@getLogger("root").setLevel(@ch.qos.logback.classic.Level@DEBUG)'`{{execute T2}} diff --git a/tutorials/katacoda/arthas-advanced-en/ognl.md b/tutorials/katacoda/arthas-advanced-en/ognl.md index cc31fac58..e5e1a6ca4 100644 --- a/tutorials/katacoda/arthas-advanced-en/ognl.md +++ b/tutorials/katacoda/arthas-advanced-en/ognl.md @@ -20,15 +20,35 @@ $ sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash classLoaderHash 1be6f5c3 ``` +Please write down your classLoaderHash here since it's dynamic. In the case here, it's `1be6f5c3`. + +if you use`-c`, you have to manually type hashcode by `-c `. + +```bash +$ ognl -c 1be6f5c3 @com.example.demo.arthas.user.UserController@logger +``` + +For classloader with only one instance, it can be specified by `--classLoaderClass` using class name, which is more convenient to use. + +```bash +$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader @org.springframework.boot.SpringApplication@logger +@Slf4jLocationAwareLog[ + FQCN=@String[org.apache.commons.logging.LogAdapter$Slf4jLocationAwareLog], + name=@String[org.springframework.boot.SpringApplication], + logger=@Logger[Logger[org.springframework.boot.SpringApplication]], +] +``` +The value of `--classloaderclass` is the class name of classloader. It can only work when it matches a unique classloader instance. The purpose is to facilitate the input of general commands. However, `-c ` is dynamic. + ### Get static fields of static classes Get the `logger` field of the `UserController` class: -`ognl -c 1be6f5c3 @com.example.demo.arthas.user.UserController@logger`{{execute T2}} +`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader @com.example.demo.arthas.user.UserController@logger`{{execute T2}} Control the number of expansion layers of the return value with the `-x` parameter. such as: -`ognl -c 1be6f5c3 -x 2 @com.example.demo.arthas.user.UserController@logger`{{execute T2}} +`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -x 2 @com.example.demo.arthas.user.UserController@logger`{{execute T2}} ### Execute multi-line expressions diff --git a/tutorials/katacoda/common-resources/assets/demo-web.png b/tutorials/katacoda/common-resources/assets/demo-web.png new file mode 100644 index 0000000000000000000000000000000000000000..a1466ad0a62a437e744907640fc73c0e57eae51e GIT binary patch literal 24593 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 literal 0 HcmV?d00001