From 307e6bad5a28d92ccb6d5b5488139ab9c7c24c84 Mon Sep 17 00:00:00 2001 From: hengyunabc Date: Tue, 4 Dec 2018 01:40:16 +0800 Subject: [PATCH] update trace doc --- .../core/command/monitor200/StackCommand.java | 2 +- site/src/site/sphinx/en/stack.md | 108 ++++++----------- site/src/site/sphinx/stack.md | 109 ++++++------------ 3 files changed, 73 insertions(+), 146 deletions(-) diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/StackCommand.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/StackCommand.java index 4bd064a44..237806f7f 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/StackCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/StackCommand.java @@ -22,11 +22,11 @@ import com.taobao.middleware.cli.annotations.Summary; @Name("stack") @Summary("Display the stack trace for the specified class and method") @Description(Constants.EXPRESS_DESCRIPTION + Constants.EXAMPLE + - " stack -E org\\.apache\\.commons\\.lang\\.StringUtils isBlank\n" + " stack org.apache.commons.lang.StringUtils isBlank\n" + " stack *StringUtils isBlank\n" + " stack *StringUtils isBlank params[0].length==1\n" + " stack *StringUtils isBlank '#cost>100'\n" + + " stack -E org\\.apache\\.commons\\.lang\\.StringUtils isBlank\n" + Constants.WIKI + Constants.WIKI_HOME + "stack") public class StackCommand extends EnhancerCommand { private String classPattern; diff --git a/site/src/site/sphinx/en/stack.md b/site/src/site/sphinx/en/stack.md index fb9d7aabf..38af4c690 100644 --- a/site/src/site/sphinx/en/stack.md +++ b/site/src/site/sphinx/en/stack.md @@ -25,85 +25,49 @@ Pls. refer to [core parameters in expression](advice-class.md) for more details. ### Usage -> Notes: if there's quotes character (say, `'`) in the expression, then the whole expression must be wrapped by quotes but with the other type (in this case, `"`) too. On contrary, it's no need to quote the expression itself if there's no quotes character found in it, but it is strongly recommended. +#### Start Demo -Print out calling stack when the first method parameter is "K9-BD-01" for 'getProductById()' method: +Start `arthas-demo` in [Quick Start](quick-start.md). + + +#### stack + +```bash +$ stack demo.MathGame primeFactors +Press Ctrl+C to abort. +Affect(class-cnt:1 , method-cnt:1) cost in 36 ms. +ts=2018-12-04 01:32:19;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 + @demo.MathGame.run() + at demo.MathGame.main(MathGame.java:16) +``` + +#### Filtering by condition expression ```bash -$ stack com.alibaba.sample.petstore.dal.dao.ProductDao getProductById 'params[0]=="K9-BD-01"' +$ stack demo.MathGame primeFactors 'params[0]<0' -n 2 Press Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 51 ms. -thread_name="http-bio-8080-exec-4" thread_id=0x4a;is_daemon=true;priority=5; - @com.alibaba.sample.petstore.dal.dao.ibatis.IbatisProductDao.getProductById() - at com.alibaba.sample.petstore.web.store.module.screen.ItemList.execute(ItemList.java:50) - at com.alibaba.sample.petstore.web.store.module.screen.ItemList$$FastClassByCGLIB$$40b2f45f.invoke(:-1) - at net.sf.cglib.reflect.FastMethod.invoke(FastMethod.java:53) - at com.alibaba.citrus.service.moduleloader.impl.adapter.MethodInvoker.invoke(MethodInvoker.java:70) - at com.alibaba.citrus.service.moduleloader.impl.adapter.DataBindingAdapter.executeAndReturn(DataBindingAdapter.java:41) - at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.performScreenModule(PerformScreenValve.java:111) - at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.invoke(PerformScreenValve.java:74) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157) - at com.alibaba.citrus.turbine.pipeline.valve.PerformActionValve.invoke(PerformActionValve.java:73) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invoke(PipelineImpl.java:210) -...... - -thread_name="http-bio-8080-exec-2" thread_id=0x48;is_daemon=true;priority=5; - @com.alibaba.sample.petstore.dal.dao.ibatis.IbatisProductDao.getProductById() - at com.alibaba.sample.petstore.web.store.module.screen.ItemList.execute(ItemList.java:50) - at com.alibaba.sample.petstore.web.store.module.screen.ItemList$$FastClassByCGLIB$$40b2f45f.invoke(:-1) - at net.sf.cglib.reflect.FastMethod.invoke(FastMethod.java:53) - at com.alibaba.citrus.service.moduleloader.impl.adapter.MethodInvoker.invoke(MethodInvoker.java:70) - at com.alibaba.citrus.service.moduleloader.impl.adapter.DataBindingAdapter.executeAndReturn(DataBindingAdapter.java:41) - at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.performScreenModule(PerformScreenValve.java:111) - at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.invoke(PerformScreenValve.java:74) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157) - at com.alibaba.citrus.turbine.pipeline.valve.PerformActionValve.invoke(PerformActionValve.java:73) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invoke(PipelineImpl.java:210) - at com.alibaba.citrus.service.pipeline.impl.valve.ChooseValve.invoke(ChooseValve.java:98) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157) -... +Affect(class-cnt:1 , method-cnt:1) cost in 30 ms. +ts=2018-12-04 01:34:27;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 + @demo.MathGame.run() + at demo.MathGame.main(MathGame.java:16) + +ts=2018-12-04 01:34:30;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 + @demo.MathGame.run() + at demo.MathGame.main(MathGame.java:16) + +Command execution times exceed limit: 2, so command will exit. You can set it with -n option. ``` -Print out the calling stack when method 'execute()' takes more than 30ms to finish: + +#### Filtering by cost ```bash -$ stack com.alibaba.sample.petstore.web.store.module.screen.ItemList execute #cost>30 +$ stack demo.MathGame primeFactors '#cost>5' Press Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 123 ms. -stack com.alibaba.sample.petstore.web.store.module.screen.ItemList execute #cost>30 -thread_name=http-nio-8080-exec-10;id=31;is_daemon=true;priority=5;TCCL=com.taobao.pandora.boot.embedded.tomcat.TomcatEmbeddedWebappClassLoader - @com.alibaba.sample.petstore.web.store.module.screen.ItemList.execute() - at com.alibaba.sample.petstore.web.store.module.screen.ItemList$$FastClassByCGLIB$$40b2f45f.invoke(:-1) - at net.sf.cglib.reflect.FastMethod.invoke(FastMethod.java:53) - at com.alibaba.citrus.service.moduleloader.impl.adapter.MethodInvoker.invoke(MethodInvoker.java:70) - at com.alibaba.citrus.service.moduleloader.impl.adapter.DataBindingAdapter.executeAndReturn(DataBindingAdapter.java:41) - at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.performScreenModule(PerformScreenValve.java:111) - at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.invoke(PerformScreenValve.java:74) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157) - at com.alibaba.citrus.turbine.pipeline.valve.PerformActionValve.invoke(PerformActionValve.java:73) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invoke(PipelineImpl.java:210) - at com.alibaba.citrus.service.pipeline.impl.valve.ChooseValve.invoke(ChooseValve.java:98) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invoke(PipelineImpl.java:210) - at com.alibaba.citrus.service.pipeline.impl.valve.LoopValve.invokeBody(LoopValve.java:105) - at com.alibaba.citrus.service.pipeline.impl.valve.LoopValve.invoke(LoopValve.java:83) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157) - at com.alibaba.citrus.turbine.pipeline.valve.PageAuthorizationValve.invoke(PageAuthorizationValve.java:105) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157) - at com.alibaba.citrus.turbine.pipeline.valve.CheckCsrfTokenValve.invoke(CheckCsrfTokenValve.java:123) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157) - at com.alibaba.citrus.turbine.pipeline.valve.AnalyzeURLValve.invoke(AnalyzeURLValve.java:126) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157) - at com.alibaba.citrus.turbine.pipeline.valve.SetLoggingContextValve.invoke(SetLoggingContextValve.java:66) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157) - at com.alibaba.citrus.turbine.pipeline.valve.PrepareForTurbineValve.invoke(PrepareForTurbineValve.java:52) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invoke(PipelineImpl.java:210) - at com.alibaba.citrus.webx.impl.WebxControllerImpl.service(WebxControllerImpl.java:43) - at com.alibaba.citrus.webx.impl.WebxRootControllerImpl.handleRequest(WebxRootControllerImpl.java:53) - at com.alibaba.citrus.webx.support.AbstractWebxRootController.service(AbstractWebxRootController.java:165) -... +Affect(class-cnt:1 , method-cnt:1) cost in 35 ms. +ts=2018-12-04 01:35:58;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 + @demo.MathGame.run() + at demo.MathGame.main(MathGame.java:16) ``` + + diff --git a/site/src/site/sphinx/stack.md b/site/src/site/sphinx/stack.md index 7dab65838..99ad804c3 100644 --- a/site/src/site/sphinx/stack.md +++ b/site/src/site/sphinx/stack.md @@ -27,84 +27,47 @@ stack ### 使用例子 -> 注意:如果表达式里面包含了引号,那么需要把整个表达式用引号括起来,如果表达式中没有包含引号,那么可以不用引号。当然,一个好的习惯是,不管表达式中有没有引号,都使用引号括起来。 +#### 启动 Demo -``` -$ stack com.alibaba.sample.petstore.dal.dao.ProductDao getProductById 'params[0]=="K9-BD-01"' +启动[快速入门](quick-start.md)里的`arthas-demo`。 + +#### stack + +```bash +$ stack demo.MathGame primeFactors Press Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 51 ms. -thread_name="http-bio-8080-exec-4" thread_id=0x4a;is_daemon=true;priority=5; - @com.alibaba.sample.petstore.dal.dao.ibatis.IbatisProductDao.getProductById() - at com.alibaba.sample.petstore.web.store.module.screen.ItemList.execute(ItemList.java:50) - at com.alibaba.sample.petstore.web.store.module.screen.ItemList$$FastClassByCGLIB$$40b2f45f.invoke(:-1) - at net.sf.cglib.reflect.FastMethod.invoke(FastMethod.java:53) - at com.alibaba.citrus.service.moduleloader.impl.adapter.MethodInvoker.invoke(MethodInvoker.java:70) - at com.alibaba.citrus.service.moduleloader.impl.adapter.DataBindingAdapter.executeAndReturn(DataBindingAdapter.java:41) - at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.performScreenModule(PerformScreenValve.java:111) - at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.invoke(PerformScreenValve.java:74) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157) - at com.alibaba.citrus.turbine.pipeline.valve.PerformActionValve.invoke(PerformActionValve.java:73) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invoke(PipelineImpl.java:210) -...... - -thread_name="http-bio-8080-exec-2" thread_id=0x48;is_daemon=true;priority=5; - @com.alibaba.sample.petstore.dal.dao.ibatis.IbatisProductDao.getProductById() - at com.alibaba.sample.petstore.web.store.module.screen.ItemList.execute(ItemList.java:50) - at com.alibaba.sample.petstore.web.store.module.screen.ItemList$$FastClassByCGLIB$$40b2f45f.invoke(:-1) - at net.sf.cglib.reflect.FastMethod.invoke(FastMethod.java:53) - at com.alibaba.citrus.service.moduleloader.impl.adapter.MethodInvoker.invoke(MethodInvoker.java:70) - at com.alibaba.citrus.service.moduleloader.impl.adapter.DataBindingAdapter.executeAndReturn(DataBindingAdapter.java:41) - at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.performScreenModule(PerformScreenValve.java:111) - at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.invoke(PerformScreenValve.java:74) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157) - at com.alibaba.citrus.turbine.pipeline.valve.PerformActionValve.invoke(PerformActionValve.java:73) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invoke(PipelineImpl.java:210) - at com.alibaba.citrus.service.pipeline.impl.valve.ChooseValve.invoke(ChooseValve.java:98) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157) -...... +Affect(class-cnt:1 , method-cnt:1) cost in 36 ms. +ts=2018-12-04 01:32:19;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 + @demo.MathGame.run() + at demo.MathGame.main(MathGame.java:16) ``` -按照耗时查询: +#### 据条件表达式来过滤 + +```bash +$ stack demo.MathGame primeFactors 'params[0]<0' -n 2 +Press Ctrl+C to abort. +Affect(class-cnt:1 , method-cnt:1) cost in 30 ms. +ts=2018-12-04 01:34:27;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 + @demo.MathGame.run() + at demo.MathGame.main(MathGame.java:16) + +ts=2018-12-04 01:34:30;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 + @demo.MathGame.run() + at demo.MathGame.main(MathGame.java:16) +Command execution times exceed limit: 2, so command will exit. You can set it with -n option. ``` -$ stack com.alibaba.sample.petstore.web.store.module.screen.ItemList execute #cost>30 + + +#### 据执行时间来过滤 + +```bash +$ stack demo.MathGame primeFactors '#cost>5' Press Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 123 ms. -stack com.alibaba.sample.petstore.web.store.module.screen.ItemList execute #cost>30 -thread_name=http-nio-8080-exec-10;id=31;is_daemon=true;priority=5;TCCL=com.taobao.pandora.boot.embedded.tomcat.TomcatEmbeddedWebappClassLoader - @com.alibaba.sample.petstore.web.store.module.screen.ItemList.execute() - at com.alibaba.sample.petstore.web.store.module.screen.ItemList$$FastClassByCGLIB$$40b2f45f.invoke(:-1) - at net.sf.cglib.reflect.FastMethod.invoke(FastMethod.java:53) - at com.alibaba.citrus.service.moduleloader.impl.adapter.MethodInvoker.invoke(MethodInvoker.java:70) - at com.alibaba.citrus.service.moduleloader.impl.adapter.DataBindingAdapter.executeAndReturn(DataBindingAdapter.java:41) - at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.performScreenModule(PerformScreenValve.java:111) - at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.invoke(PerformScreenValve.java:74) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157) - at com.alibaba.citrus.turbine.pipeline.valve.PerformActionValve.invoke(PerformActionValve.java:73) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invoke(PipelineImpl.java:210) - at com.alibaba.citrus.service.pipeline.impl.valve.ChooseValve.invoke(ChooseValve.java:98) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invoke(PipelineImpl.java:210) - at com.alibaba.citrus.service.pipeline.impl.valve.LoopValve.invokeBody(LoopValve.java:105) - at com.alibaba.citrus.service.pipeline.impl.valve.LoopValve.invoke(LoopValve.java:83) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157) - at com.alibaba.citrus.turbine.pipeline.valve.PageAuthorizationValve.invoke(PageAuthorizationValve.java:105) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157) - at com.alibaba.citrus.turbine.pipeline.valve.CheckCsrfTokenValve.invoke(CheckCsrfTokenValve.java:123) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157) - at com.alibaba.citrus.turbine.pipeline.valve.AnalyzeURLValve.invoke(AnalyzeURLValve.java:126) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157) - at com.alibaba.citrus.turbine.pipeline.valve.SetLoggingContextValve.invoke(SetLoggingContextValve.java:66) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157) - at com.alibaba.citrus.turbine.pipeline.valve.PrepareForTurbineValve.invoke(PrepareForTurbineValve.java:52) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157) - at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invoke(PipelineImpl.java:210) - at com.alibaba.citrus.webx.impl.WebxControllerImpl.service(WebxControllerImpl.java:43) - at com.alibaba.citrus.webx.impl.WebxRootControllerImpl.handleRequest(WebxRootControllerImpl.java:53) - at com.alibaba.citrus.webx.support.AbstractWebxRootController.service(AbstractWebxRootController.java:165) -......... +Affect(class-cnt:1 , method-cnt:1) cost in 35 ms. +ts=2018-12-04 01:35:58;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 + @demo.MathGame.run() + at demo.MathGame.main(MathGame.java:16) ``` ->只会打印出耗时超过30ms的堆栈情况 \ No newline at end of file +