JVM異常診斷神器Greys實(shí)戰(zhàn) - 玩轉(zhuǎn)JVM

Greys是一個JVM進(jìn)程執(zhí)行過程中的異常診斷神器栈拖。 在不中斷程序執(zhí)行的情況下輕松完成JVM相關(guān)問題排查工作。目前Greys僅支持Linux/Unix/Mac上的Java6+艰垂,Windows暫時無法支持。

使用場景

例如打logger埋虹,開發(fā)環(huán)境一般有五種情況:
1猜憎、異常情況,打error
2搔课、警告情況胰柑,打warm
3、非本系統(tǒng)調(diào)用入口爬泥、任務(wù)等柬讨,logger入?yún)⒑徒Y(jié)果
4、本系統(tǒng)調(diào)用袍啡,debug入?yún)⒑徒Y(jié)果
5踩官、必要信息,info一下

而在生產(chǎn)環(huán)境境输,一般不會開啟debug日志蔗牡。這時,出現(xiàn)問題如何debug嗅剖?沒錯辩越,用debug診斷神器Greys完美解決。

安裝Greys

[root@mvxl52738 tmp]# curl -sLk http://ompc.oss.aliyuncs.com/greys/install.sh|bash
# or 
[root@mvxl52738 tmp]# wget http://ompc.oss.aliyuncs.com/greys/release/greys-stable-bin.zip
[root@mvxl52738 tmp]#  unzip greys-stable-bin.zip
[root@mvxl52738 tmp]# cd greys
[root@mvxl52738 tmp]# sh ./install-local.sh

啟動關(guān)閉Greys

# ./greys.sh <PID>[@IP:PORT]
[root@mvxl52738 ]# greys.sh 57951
                                                        _                    
  ____  ____ _____ _   _  ___ _____ _____ ____  _____ _| |_ ___  ____  _   _ 
 / _  |/ ___) ___ | | | |/___|_____|____ |  _ \(____ (_   _) _ \|    \| | | |
( (_| | |   | ____| |_| |___ |     / ___ | | | / ___ | | || |_| | | | | |_| |
 \___ |_|   |_____)\__  (___/      \_____|_| |_\_____|  \__)___/|_|_|_|\__  |
(_____|           (____/                                              (____/ 
                                              +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                                              |v|e|r|s|i|o|n|:|1|.|7|.|6|.|6|
                                              +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
ga?>help
# 查看幫助文檔
ga?>shutdown
Greys Server is shut down.

遠(yuǎn)程連接Greys

遠(yuǎn)程連接信粮,當(dāng)然也是可以的黔攒。配置對應(yīng)的ip和端口,就能遠(yuǎn)程協(xié)助了强缘。

[root@mvxl52740 greys]# ./greys.sh @10.18.40.183:3658 
                                                        _                    
  ____  ____ _____ _   _  ___ _____ _____ ____  _____ _| |_ ___  ____  _   _ 
 / _  |/ ___) ___ | | | |/___|_____|____ |  _ \(____ (_   _) _ \|    \| | | |
( (_| | |   | ____| |_| |___ |     / ___ | | | / ___ | | || |_| | | | | |_| |
 \___ |_|   |_____)\__  (___/      \_____|_| |_\_____|  \__)___/|_|_|_|\__  |
(_____|           (____/                                              (____/ 
                                              +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                                              |v|e|r|s|i|o|n|:|1|.|7|.|6|.|6|
                                              +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
ga?>
ga?>tt -t -n 3 *OrderReportFacadeImpl *
Press Ctrl+D to abort.
Affect(class-cnt:1 , method-cnt:12) cost in 68 ms.
+----------+------------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
|    INDEX | PROCESS-ID |            TIMESTAMP |   COST(ms) |   IS-RET |   IS-EXP |          OBJECT |                          CLASS |                         METHOD |
+----------+------------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
|     1003 |       1003 |  2018-09-15 17:40:24 |         14 |     true |    false |       0x68d36ec |          OrderReportFacadeImpl |            lambda$selectItem$3 |
+----------+------------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
|     1004 |       1004 |  2018-09-15 17:40:24 |         15 |     true |    false |       0x68d36ec |          OrderReportFacadeImpl |                     selectItem |

常見用法

monitor命令

對匹配class-pattern/method-pattern的類.方法的調(diào)用進(jìn)行監(jiān)控督惰。

ga?>monitor -c 5  *OrderReportFacadeImpl selectItem
+---------------------+------------------------------------------------------------+------------+-------+---------+------+-----------+------------+------------+------------+
| TIMESTAMP           | CLASS                                                      | METHOD     | TOTAL | SUCCESS | FAIL | FAIL-RATE | AVG-RT(ms) | MIN-RT(ms) | MAX-RT(ms) |
+---------------------+------------------------------------------------------------+------------+-------+---------+------+-----------+------------+------------+------------+
| 2018-09-15 14:55:08 | com.meicloud.ecu.fc.impl.facade.impl.OrderReportFacadeImpl | selectItem | 1     | 1       | 0    | 00.00%    | 22.00      | 22         | 22         |
+---------------------+------------------------------------------------------------+------------+-------+---------+------+-----------+------------+------------+------------+

+---------------------+------------------------------------------------------------+------------+-------+---------+------+-----------+------------+------------+------------+
| TIMESTAMP           | CLASS                                                      | METHOD     | TOTAL | SUCCESS | FAIL | FAIL-RATE | AVG-RT(ms) | MIN-RT(ms) | MAX-RT(ms) |
+---------------------+------------------------------------------------------------+------------+-------+---------+------+-----------+------------+------------+------------+
| 2018-09-15 14:55:13 | com.meicloud.ecu.fc.impl.facade.impl.OrderReportFacadeImpl | selectItem | 3     | 3       | 0    | 00.00%    | 11.67      | 11         | 13         |
+---------------------+------------------------------------------------------------+------------+-------+---------+------+-----------+------------+------------+------------+

trace和ptrace命令

渲染和統(tǒng)計(jì)整個調(diào)用鏈路上的所有性能開銷和追蹤調(diào)用鏈路。但是旅掂,動態(tài)代理好像追不進(jìn)去姑丑。所以,Spring注入的調(diào)用追蹤不了辞友。

ga?>ptrace -t  *OrderReportFacadeImpl  *
Press Ctrl+D to abort.
Affect(class-cnt:1 , method-cnt:12) cost in 47 ms.
`---+pTracing for : thread_name="DubboServerHandler-10.18.40.183:20888-thread-21" thread_id=0x21e;is_daemon=true;priority=5;process=1003;
    `---+[36,36ms]com.meicloud.ecu.fc.impl.facade.impl.OrderReportFacadeImpl:selectLog(); index=1006;
        `---[33,17ms]com.meicloud.ecu.fc.impl.facade.impl.OrderReportFacadeImpl:lambda$selectLog$5(); index=1005;
+----------+------------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
|    INDEX | PROCESS-ID |            TIMESTAMP |   COST(ms) |   IS-RET |   IS-EXP |          OBJECT |                          CLASS |                         METHOD |
+----------+------------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
|     1005 |       1003 |  2018-09-15 15:03:54 |         16 |     true |    false |       0x68d36ec |          OrderReportFacadeImpl |             lambda$selectLog$5 |
+----------+------------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
|     1006 |       1003 |  2018-09-15 15:03:54 |         20 |     true |    false |       0x68d36ec |          OrderReportFacadeImpl |                      selectLog |
+----------+------------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+

tt命令(重點(diǎn)掌握)

時間隧道命令記錄下當(dāng)時方法調(diào)用的所有入?yún)⒑头祷刂怠伋龅漠惓?/p>

# 記錄下當(dāng)前方法的每次調(diào)用環(huán)境現(xiàn)場
ga?>tt -t -n 3 *OrderReportFacadeImpl *
Press Ctrl+D to abort.
Affect(class-cnt:1 , method-cnt:12) cost in 70 ms.
+----------+------------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
|    INDEX | PROCESS-ID |            TIMESTAMP |   COST(ms) |   IS-RET |   IS-EXP |          OBJECT |                          CLASS |                         METHOD |
+----------+------------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
|     1008 |       1005 |  2018-09-15 16:49:28 |        189 |    false |     true |       0x68d36ec |          OrderReportFacadeImpl |            lambda$selectItem$3 |
+----------+------------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
|     1009 |       1006 |  2018-09-15 16:49:28 |        192 |     true |    false |       0x68d36ec |          OrderReportFacadeImpl |                     selectItem |

ga?>tt -l
+----------+------------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
|    INDEX | PROCESS-ID |            TIMESTAMP |   COST(ms) |   IS-RET |   IS-EXP |          OBJECT |                          CLASS |                         METHOD |
+----------+------------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
|     1001 |       1001 |  2018-09-15 15:02:10 |         15 |     true |    false |       0x68d36ec |          OrderReportFacadeImpl |            lambda$selectItem$3 |
+----------+------------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
|     1002 |       1001 |  2018-09-15 15:02:10 |         17 |     true |    false |       0x68d36ec |          OrderReportFacadeImpl |                     selectItem |
+----------+------------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
|     1003 |       1002 |  2018-09-15 15:02:46 |         13 |     true |    false |       0x68d36ec |          OrderReportFacadeImpl |            lambda$selectItem$3 |
+----------+------------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
|     1004 |       1002 |  2018-09-15 15:02:46 |         14 |     true |    false |       0x68d36ec |          OrderReportFacadeImpl |                     selectItem |
+----------+------------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
|     1005 |       1003 |  2018-09-15 15:03:54 |         16 |     true |    false |       0x68d36ec |          OrderReportFacadeImpl |             lambda$selectLog$5 |
+----------+------------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
|     1006 |       1003 |  2018-09-15 15:03:54 |         20 |     true |    false |       0x68d36ec |          OrderReportFacadeImpl |                      selectLog |
+----------+------------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
|     1007 |       1004 |  2018-09-15 16:44:45 |         14 |     true |    false |       0x68d36ec |          OrderReportFacadeImpl |                   sendItem2SAP |
+----------+------------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
|     1008 |       1005 |  2018-09-15 16:49:28 |        189 |    false |     true |       0x68d36ec |          OrderReportFacadeImpl |            lambda$selectItem$3 |
+----------+------------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
|     1009 |       1006 |  2018-09-15 16:49:28 |        192 |     true |    false |       0x68d36ec |          OrderReportFacadeImpl |                     selectItem |
+----------+------------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+

# 查看調(diào)用信息
ga?>tt -i 1006 -x 3


# 查看異常信息
ga?>tt -i 1008 -x 3
+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
|           INDEX | 1008                                                                                                                                                   |
+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
|      PROCESS-ID | 1005                                                                                                                                                   |
+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
|      GMT-CREATE | 2018-09-15 16:49:28                                                                                                                                    |
+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
|        COST(ms) | 189                                                                                                                                                    |
+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
|          OBJECT | 0x68d36ec                                                                                                                                              |
+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
|           CLASS | com.meicloud.ecu.fc.impl.facade.impl.OrderReportFacadeImpl                                                                                             |
+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
|          METHOD | lambda$selectItem$3                                                                                                                                    |
+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
|       IS-RETURN | false                                                                                                                                                  |
+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
|    IS-EXCEPTION | true                                                                                                                                                   |
+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
|   PARAMETERS[0] | OrderReportRequest(reportId=null, reportIdList=null, orderSubId=null, orderId=null, shopIdList=[1], startTime=Mon Sep 03 16:49:15 CST 2018, endTime=Sa |
|                 | t Sep 15 16:49:20 CST 2018, clientIdList=null, skuTypeList=null, packingId=null, companyCodeList=null, salesTypeList=[], statusList=[], applyId=null,  |
|                 | exceptionType=0)                                                                                                                                       |
+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
|   PARAMETERS[1] | 0                                                                                                                                                      |
+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
|   PARAMETERS[2] | 10                                                                                                                                                     |
+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
|   PARAMETERS[3] | CommonResponse(result=null)                                                                                                                            |
+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
| THROW-EXCEPTION | org.springframework.jdbc.BadSqlGrammarException:                                                                                                       |
|                 | ### Error querying database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'shop_id' in 'where clause'             |
|                 | ### The error may exist in file [/apps/zoomlion/ecu-fc-sales/tomcat-9008/webapps/fc-sales/WEB-INF/classes/sqlmaps/fcsqlmaps/custom/CustomOrderReportMa |
|                 | pper.xml]                                                                                                                                              |
|                 | ### The error may involve com.meicloud.ecu.fc.impl.model.dao.fc.custom.CustomOrderReportMapper.selectByEntity-Inline                                   |
|                 | ### The error occurred while setting parameters                                                                                                        |
|                 | ### SQL: SELECT  count(*)  FROM f_order_report AS item LEFT OUTER JOIN f_order_report_extend AS extend ON (item.report_id = extend.report_id) WHERE (( |
|                 | (1 = 1) AND (shop_id IN ( ? ))) AND (consign_time >= ( ? ))) AND (consign_time < ( ? ))                                                                |
|                 | ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'shop_id' in 'where clause'                                       |
|                 | ; bad SQL grammar []; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'shop_id' in 'where clause'        |
|                 |     at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:237)                    |
|                 |     at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)               |
|                 |     at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)                                  |
|                 |     at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:371)                                                 |
|                 |     at com.sun.proxy.$Proxy22.selectList(Unknown Source)                                                                                               |
|                 |     at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:198)                                                                   |
|                 |     at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:119)                                                                    |
|                 |     at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:63)                                                                            |
|                 |     at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:52)                                                                               |
|                 |     at com.sun.proxy.$Proxy23.selectByEntity(Unknown Source)                                                                                           |
|                 |     at com.meicloud.ecu.fc.impl.service.impl.OrderReportServiceImpl.selectItem(OrderReportServiceImpl.java:224)                                        |
|                 |     at com.meicloud.ecu.fc.impl.service.impl.OrderReportServiceImpl$$FastClassBySpringCGLIB$$60343937.invoke(<generated>)                              |
|                 |     at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)                                                                        |
|                 |     at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:629)                                     |
|                 |     at com.meicloud.ecu.fc.impl.service.impl.OrderReportServiceImpl$$EnhancerBySpringCGLIB$$9a3e9305.selectItem(<generated>)                           |
|                 |     at com.meicloud.ecu.fc.impl.facade.impl.OrderReportFacadeImpl.lambda$selectItem$3(OrderReportFacadeImpl.java:122)                                  |
|                 |     at com.meicloud.ecu.fc.impl.utils.RespPackUtil.execInvokeService(RespPackUtil.java:31)                                                             |
|                 |     at com.meicloud.ecu.fc.impl.facade.impl.OrderReportFacadeImpl.selectItem(OrderReportFacadeImpl.java:121)                                           |
|                 |     at com.alibaba.dubbo.common.bytecode.Wrapper4.invokeMethod(Wrapper4.java)                                                                          |
|                 |     at com.alibaba.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java:46)                                           |
|                 |     at com.alibaba.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:72)                                                           |
|                 |     at com.alibaba.dubbo.config.invoker.DelegateProviderMetaDataInvoker.invoke(DelegateProviderMetaDataInvoker.java:36)                                |
|                 |     at com.alibaba.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:53)                                                                    |
|                 |     at com.alibaba.dubbo.rpc.filter.ExceptionFilter.invoke(ExceptionFilter.java:64)                                                                    |
|                 |     at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:69)                                                    |
|                 |     at com.alibaba.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:75)                                                                   |
|                 |     at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:69)                                                    |
|                 |     at com.alibaba.dubbo.rpc.filter.TimeoutFilter.invoke(TimeoutFilter.java:42)                                                                        |
|                 |     at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:69)                                                    |
|                 |     at com.alibaba.dubbo.rpc.protocol.dubbo.filter.TraceFilter.invoke(TraceFilter.java:78)                                                             |
|                 |     at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:69)                                                    |
|                 |     at com.alibaba.dubbo.rpc.filter.ContextFilter.invoke(ContextFilter.java:61)                                                                        |
|                 |     at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:69)                                                    |
|                 |     at com.alibaba.dubbo.rpc.filter.GenericFilter.invoke(GenericFilter.java:132)                                                                       |
|                 |     at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:69)                                                    |
|                 |     at com.alibaba.dubbo.rpc.filter.ClassLoaderFilter.invoke(ClassLoaderFilter.java:38)                                                                |
|                 |     at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:69)                                                    |
|                 |     at com.alibaba.dubbo.rpc.filter.EchoFilter.invoke(EchoFilter.java:38)                                                                              |
|                 |     at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:69)                                                    |
|                 |     at com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol$1.reply(DubboProtocol.java:98)                                                               |
|                 |     at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.handleRequest(HeaderExchangeHandler.java:98)                           |
|                 |     at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.received(HeaderExchangeHandler.java:170)                               |
|                 |     at com.alibaba.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:52)                                                              |
|                 |     at com.alibaba.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:81)                                          |
|                 |     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)                                                                 |
|                 |     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)                                                                 |
|                 |     at java.lang.Thread.run(Thread.java:748)                                                                                                           |
|                 | Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'shop_id' in 'where clause'                                       |
|                 |     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)                                                                           |
|                 |     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)                                                    |
|                 |     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)                                            |
|                 |     at java.lang.reflect.Constructor.newInstance(Constructor.java:423)                                                                                 |
|                 |     at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)                                                                                            |
|                 |     at com.mysql.jdbc.Util.getInstance(Util.java:384)                                                                                                  |
|                 |     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052)                                                                                  |
|                 |     at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4232)                                                                                      |
|                 |     at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4164)                                                                                      |
|                 |     at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2615)                                                                                           |
|                 |     at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2776)                                                                                        |
|                 |     at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2838)                                                                                 |
|                 |     at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2082)                                                                   |
|                 |     at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1307)                                                                           |
|                 |     at sun.reflect.GeneratedMethodAccessor99.invoke(Unknown Source)                                                                                    |
|                 |     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)                                                           |
|                 |     at java.lang.reflect.Method.invoke(Method.java:498)                                                                                                |
|                 |     at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:62)                                                  |
|                 |     at com.sun.proxy.$Proxy59.execute(Unknown Source)                                                                                                  |
|                 |     at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:59)                                           |
|                 |     at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:73)                                             |
|                 |     at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:60)                                                                       |
|                 |     at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:267)                                                                |
|                 |     at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:137)                                                                            |
|                 |     at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:96)                                                                       |
|                 |     at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:77)                                                                       |
|                 |     at sun.reflect.GeneratedMethodAccessor97.invoke(Unknown Source)                                                                                    |
|                 |     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)                                                           |
|                 |     at java.lang.reflect.Method.invoke(Method.java:498)                                                                                                |
|                 |     at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49)                                                                                 |
|                 |     at com.github.pagehelper.PageHelper.intercept(PageHelper.java:211)                                                                                 |
|                 |     at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:60)                                                                                          |
|                 |     at com.sun.proxy.$Proxy56.query(Unknown Source)                                                                                                    |
|                 |     at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:108)                                                     |
|                 |     at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:102)                                                     |
|                 |     at sun.reflect.GeneratedMethodAccessor163.invoke(Unknown Source)                                                                                   |
|                 |     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)                                                           |
|                 |     at java.lang.reflect.Method.invoke(Method.java:498)                                                                                                |
|                 |     at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:358)                                                 |
|                 |     ... 43 more                                                                                                                                        |
+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
|           STACK | thread_name="DubboServerHandler-10.18.40.183:20888-thread-39" thread_id=0x239;is_daemon=true;priority=5;                                               |
|                 |     @com.meicloud.ecu.fc.impl.facade.impl.OrderReportFacadeImpl.lambda$selectItem$3(OrderReportFacadeImpl.java:124)                                    |
|                 |         at com.meicloud.ecu.fc.impl.utils.RespPackUtil.execInvokeService(RespPackUtil.java:31)                                                         |
|                 |         at com.meicloud.ecu.fc.impl.facade.impl.OrderReportFacadeImpl.selectItem(OrderReportFacadeImpl.java:121)                                       |
|                 |         at com.alibaba.dubbo.common.bytecode.Wrapper4.invokeMethod(Wrapper4.java:-1)                                                                   |
|                 |         at com.alibaba.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java:46)                                       |
|                 |         at com.alibaba.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:72)                                                       |
|                 |         at com.alibaba.dubbo.config.invoker.DelegateProviderMetaDataInvoker.invoke(DelegateProviderMetaDataInvoker.java:36)                            |
|                 |         at com.alibaba.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:53)                                                                |
|                 |         at com.alibaba.dubbo.rpc.filter.ExceptionFilter.invoke(ExceptionFilter.java:64)                                                                |
|                 |         at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:69)                                                |
|                 |         at com.alibaba.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:75)                                                               |
|                 |         at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:69)                                                |
|                 |         at com.alibaba.dubbo.rpc.filter.TimeoutFilter.invoke(TimeoutFilter.java:42)                                                                    |
|                 |         at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:69)                                                |
|                 |         at com.alibaba.dubbo.rpc.protocol.dubbo.filter.TraceFilter.invoke(TraceFilter.java:78)                                                         |
|                 |         at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:69)                                                |
|                 |         at com.alibaba.dubbo.rpc.filter.ContextFilter.invoke(ContextFilter.java:61)                                                                    |
|                 |         at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:69)                                                |
|                 |         at com.alibaba.dubbo.rpc.filter.GenericFilter.invoke(GenericFilter.java:132)                                                                   |
|                 |         at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:69)                                                |
|                 |         at com.alibaba.dubbo.rpc.filter.ClassLoaderFilter.invoke(ClassLoaderFilter.java:38)                                                            |
|                 |         at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:69)                                                |
|                 |         at com.alibaba.dubbo.rpc.filter.EchoFilter.invoke(EchoFilter.java:38)                                                                          |
|                 |         at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:69)                                                |
|                 |         at com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol$1.reply(DubboProtocol.java:98)                                                           |
|                 |         at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.handleRequest(HeaderExchangeHandler.java:98)                       |
|                 |         at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.received(HeaderExchangeHandler.java:170)                           |
|                 |         at com.alibaba.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:52)                                                          |
|                 |         at com.alibaba.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:81)                                      |
|                 |         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)                                                             |
|                 |         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)                                                             |
|                 |         at java.lang.Thread.run(Thread.java:748)                                                                                                       |
+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+



# 重跑一次。
# 當(dāng)你少少做了一些調(diào)整之后称龙,你可能需要前端系統(tǒng)重新觸發(fā)一次你的調(diào)用留拾,此時得求爺爺告奶奶的需要前端配合聯(lián)調(diào)的同學(xué)再次發(fā)起一次調(diào)用。而有些場景下鲫尊,這個調(diào)用不是這么好觸發(fā)的痴柔。
# tt命令由于保存了當(dāng)時調(diào)用的所有現(xiàn)場信息,所以我們可以自己主動對一個INDEX編號的時間片自主發(fā)起一次調(diào)用疫向,從而解放你的溝通成本咳蔚。此時你需要-p參數(shù)。
ga?>tt -i 1006 -p

watch命令(tt命令已經(jīng)包含了它)

能方便的讓你觀察到指定方法的調(diào)用情況搔驼。能觀察到的范圍為:返回值谈火、拋出異常、入?yún)⑸嗾牵ㄟ^編寫OGNL表達(dá)式進(jìn)行對應(yīng)變量的查看糯耍。

表達(dá)式核心變量

public class Advice {

    // 本次調(diào)用類所在的ClassLoader 
    private final ClassLoader loader; 
    // 本次調(diào)用類的Class引用
    private final Class<?> clazz;
    // 本次調(diào)用方法反射引用
    private final GaMethod method;
    // 本次調(diào)用類的實(shí)例
    private final Object target;
    // 本次調(diào)用參數(shù)列表,這是一個數(shù)組囊嘉,如果方法是無參方法則為空數(shù)組
    private final Object[] params;
    // 本次調(diào)用返回的對象温技。當(dāng)且僅當(dāng)isReturn==true成立時候有效,
    // 表明方法調(diào)用是以正常返回的方式結(jié)束扭粱。
    // 如果當(dāng)前方法無返回值void舵鳞,則值為null
    private final Object returnObj;
    // 本次調(diào)用拋出的異常。當(dāng)且僅當(dāng)isThrow==true成立時有效琢蛤,
    // 表明方法調(diào)用是以拋出異常的方式結(jié)束蜓堕。
    private final Throwable throwExp;
    private final boolean isBefore;
    private final boolean isThrow;
    private final boolean isReturn;

    // getter/setter  
}  

stack命令 (tt命令已經(jīng)包含了它)

很多時候我們都知道一個方法被執(zhí)行,但這個方法被執(zhí)行的路徑非常多虐块×├模或者你根本就不知道這個方法是從那里被執(zhí)行了,正在郁悶贺奠,正在彷徨霜旧。此時你需要的是stack命令。

詳情參考:https://github.com/oldmanpushcart/greys-anatomy

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末儡率,一起剝皮案震驚了整個濱河市挂据,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌儿普,老刑警劉巖崎逃,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異眉孩,居然都是意外死亡个绍,警方通過查閱死者的電腦和手機(jī)破婆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來判没,“玉大人啊送,你說我怎么就攤上這事」慊郑” “怎么了凯旋?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長钉迷。 經(jīng)常有香客問我至非,道長,這世上最難降的妖魔是什么糠聪? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任荒椭,我火速辦了婚禮,結(jié)果婚禮上枷颊,老公的妹妹穿的比我還像新娘戳杀。我一直安慰自己,他們只是感情好夭苗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布信卡。 她就那樣靜靜地躺著,像睡著了一般题造。 火紅的嫁衣襯著肌膚如雪傍菇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天界赔,我揣著相機(jī)與錄音丢习,去河邊找鬼。 笑死淮悼,一個胖子當(dāng)著我的面吹牛咐低,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播袜腥,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼见擦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了羹令?” 一聲冷哼從身側(cè)響起鲤屡,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎福侈,沒想到半個月后酒来,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肪凛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年堰汉,在試婚紗的時候發(fā)現(xiàn)自己被綠了辽社。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡衡奥,死狀恐怖爹袁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情矮固,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布譬淳,位于F島的核電站档址,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏邻梆。R本人自食惡果不足惜守伸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望浦妄。 院中可真熱鬧尼摹,春花似錦、人聲如沸剂娄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阅懦。三九已至和二,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間耳胎,已是汗流浹背惯吕。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留怕午,地道東北人废登。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像郁惜,于是被迫代替她去往敵國和親堡距。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容