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命令。