精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

使用 Arthas 排查開源 Excel 組件問題

開發
JVMTI(JVM Tool Interface):是 JVM 暴露出來的一些供用戶擴展的接口集合,JVMTI 是基于事件驅動的,JVM 每執行到一定的邏輯就會調用一些事件的回調接口(如果有的話),這些接口可以供開發者去擴展自己的邏輯。

 [[408346]]

背景介紹

項目中有使用到 com.github.dreamroute excel-helper 這個工具來輔助 Excel 文件的解析,出錯時的代碼是這樣寫的:如下所示(非源代碼)

  1. try { excelDTOS = ExcelHelper.importFromFile(ExcelType.XLSX, file, ExcelDTO.class); } catch (Exception e) { log.error("ExcelHelper importFromFile exception msg {}", e.getMessage()); } 

因為打印異常信息時,使用了 e.getMessage() 方法,沒有將異常信息打印出來。而且本地復現也沒有復現出來。所以只能考慮使用 arthas 來協助排查這個問題了。

排查過程

1、線上服務器安裝 Arthas。
https://arthas.aliyun.com/doc/install-detail.html

2、使用 watch 命令監控指定方法,打印出異常的堆棧信息,命令如下:

watch com.github.dreamroute.excel.helper.ExcelHelper importFromFile '{params,throwExp}' -e -x 3
再次調用方法,捕獲到異常棧信息如下:

已經捕獲到異常,并打印出堆棧信息。

3、根據對應的堆棧信息,定位到具體的代碼,如下:

代碼很簡單,從代碼中可以很清晰的看到如果沒有從 headerInfoMap 中沒有獲取到指定的 headerInfo ,就會拋這個異常。沒有找到只有兩種情況:

headerInfoMap 中保存的信息不對。

cell 中的 columnIndex 超出的正常的范圍導致沒有獲取到對應 HeaderInfo 。
對于第二種情況,首先去校驗了一下上傳的 Excel 文件是否有問題,本地測試了一下 Excel 文件,沒有任何問題。本地測試也是成功的,所以主觀判斷,第二種情況的可能性不大。

所以說主要檢查第一種情況是否發生,這個時候可以再去看一下該方法的第一行代碼

  1. MapheaderInfoMap = processHeaderInfo(rows,cls); 

可以看到headerInfoMap是通過processHeaderInfo中獲取的。找到processHeaderInfo 的代碼,如下所示。

  1. public static MapproceeHeaderInfo(Iteratorrows, Class cls) { if (rows.hasNext()) { Row header = rows.next(); return CacheFactory.findHeaderInfo(cls, header); } return new HashMap<>(0);}public static MapfindHeaderInfo(Class cls, Row header) { MapheaderInfo = HEADER_INFO.get(cls); if (MapUtils.isEmpty(headerInfo)) { headerInfo = ClassAssistant.getHeaderInfo(cls, header); HEADER_INFO.put(cls, headerInfo); } return headerInfo;}public static MapgetHeaderInfo(Class cls, Row header) { IteratorcellIterator = header.cellIterator(); Listfields = ClassAssistant.getAllFields(cls); MapheaderInfo = new HashMap<>(fields.size()); while (cellIterator.hasNext()) { org.apache.poi.ss.usermodel.Cell cell = cellIterator.next(); String headerName = cell.getStringCellValue(); for (Field field : fields) { Column col = field.getAnnotation(Column.class); String name = col.name(); if (Objects.equals(headerName, name)) { HeaderInfo hi = new HeaderInfo(col.cellType(), field); headerInfo.put(cell.getColumnIndex(), hi); break; } } } return headerInfo;} 

主要通過 CacheFactory 類的 findHeaderInfo 來生成,在 findHeaderInfo 方法中,通過一個被 static final 修飾的 HEADER_INFO 變量來做緩存,被調用時先去HEADER_INFO 中查,如果有則直接返回,沒有則重新創建(也就說明相同的 Excel 文件,僅初始化一次 HeaderInfo )。創建的步驟在 ClassAssistant.getHeaderInfo() 方法中。

簡單的看一下 HeaderInfo 的生成過程,根據 Excel 文件的第一行中的各個 Cell 值與自定義實體類的注解比較,如果名字相同,就存為一個鍵值對( HeaderInfo 的數據結構為 HashMap )。

4、這個時候需要再確認一下 HEADER_INFO 中保存的 ExcelDTO.class 相關的 HeaderInfo 是怎樣的。通過 ognl 命令或者 getstatic 命令來查看。這里使用 ognl 命令。

  1. ognl '#value=new com.tom.dto.ExcelDTO(),#valueMap=@com.github.dreamroute.excel.helper.cache.CacheFactory@HEADER_INFO,#valueMap.get(#value.getClass()).entrySet().iterator.{#this.value.name}' 

結果如下:正常情況下這個 Excel 文件有 6 列信息,為什么只產生了 4 個鍵值對呢?如果 HEADER_INFO 中保存了錯的,從上面的邏輯來看,后面上傳的正確的 Excel 文件在解析時都會拋錯。

5、詢問了當時發現這個問題的同事,得知他第一次上傳的 Excel 文件是有問題的,后面想改正,再上傳時便出現了問題。到這里問題也算是找到了。

Arthas 原理探究

有了實際的使用之后,不免會想到,Arthas 是如何做到在程序運行時,動態監測我們的代碼的呢?帶著這樣的問題,我們一起來看下 Java Agent 技術實現原理。

Java Agent 技術

Agent 是一個運行在目標 JVM 的特定程序,它的職責是負責從目標 JVM 中獲取數據,然后將數據傳遞給外部進程。加載 Agent 的時機可以是目標 JVM 啟動之時,也可以是在目標 JVM 運行時進行加載,而在目標 JVM 運行時進行 Agent 加載具備動態性。

基礎概念

JVMTI(JVM Tool Interface):是 JVM 暴露出來的一些供用戶擴展的接口集合,JVMTI 是基于事件驅動的,JVM 每執行到一定的邏輯就會調用一些事件的回調接口(如果有的話),這些接口可以供開發者去擴展自己的邏輯。
JVMTIAgent(JVM Tool Interface):是一個動態庫,利用 JVMTI 暴露出來的一些接口幫助我們在程序啟動時或程序運行時 JVM Attach 機制,將 Agent 加載到目標 JVM 中。
JPLISAgent(Java Programming Language Instrumentation Services Agent):它的作用是初始化所有通過 Java Instrumentation API 編寫的 Agent,并且也承擔著通過 JVMTI 實現 Java Instrumentation 中暴露 API 的責任。
VirtualMachine :提供了Attach 動作和 Detach 動作,允許我們通過 attach 方法,遠程連接到 JVM 上,然后通過 loadAgent 方法向 JVM 注冊一個代理程序 agent ,在該 agent 的代理程序中會得到一個 Instrumentation 實例,該實例可以在 class 加載前改變 class 的字節碼,也可以在 class 加載后重新加載。
Instrumentation:可以在 class 加載前改變 class 的字節碼(premain),也可以在 class 加載后重新加載(agentmain)。

執行過程

動手寫一個 Demo

通過 javassist,在運行時更改指定方法的代碼,在方法之前后添加自定義邏輯。

1、定義 Agent 類。當前 Java 提供了兩種方式可以將代碼代碼注入到 JVM 中,這里我們的 Demo 選擇使用 agentmain 方法來實現。

premain:在啟動時通過 javaagent 命令,將代理注入到指定的 JVM 中。
agentmain:運行時通過 attach 工具激活指定代理。

  1. /** * AgentMain * * @author tomxin */public class AgentMain { public static void agentmain(String agentArgs, Instrumentation instrumentation) throws UnmodifiableClassException, ClassNotFoundException { instrumentation.addTransformer(new InterceptorTransformer(agentArgs), true); Class clazz = Class.forName(agentArgs.split(",")[1]); instrumentation.retransformClasses(clazz); }}/** * InterceptorTransformer * * @author tomxin */public class InterceptorTransformer implements ClassFileTransformer { private String agentArgs; public InterceptorTransformer(String agentArgs) { this.agentArgs = agentArgs; } @Override public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { //javassist的包名是用點分割的,需要轉換下 if (className != null && className.indexOf("/") != -1) { className = className.replaceAll("/", "."); } try { //通過包名獲取類文件 CtClass cc = ClassPool.getDefault().get(className); //獲得指定方法名的方法 CtMethod m = cc.getDeclaredMethod(agentArgs.split(",")[2]); //在方法執行前插入代碼 m.insertBefore("{ System.out.println(\"=========開始執行=========\"); }"); m.insertAfter("{ System.out.println(\"=========結束執行=========\"); }"); return cc.toBytecode(); } catch (Exception e) { } return null; }} 

2、使用 Maven 配置 MANIFEST.MF 文件,該文件能夠指定 Jar 包的 main 方法。

  1. <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.3.1</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> </manifest> <manifestEntries> <Agent-Class>com.tom.mdc.AgentMain</Agent-Class> <Can-Redefine-Classes>true</Can-Redefine-Classes> <Can-Retransform-Classes>true</Can-Retransform-Classes> </manifestEntries> </archive> </configuration> </plugin> </plugins> </build> 

3、定義 Attach 方法,通過 VirtualMachine.attach(#{pid}) 來指定要代理的類。

  1. import com.sun.tools.attach.VirtualMachine;import java.io.IOException;/** * AttachMain * * @author tomxin */public class AttachMain { public static void main(String[] args) { VirtualMachine virtualMachine = nulltry { virtualMachine = VirtualMachine.attach(args[0]); // 將打包好的Jar包,添加到指定的JVM進程中。 virtualMachine.loadAgent("target/agent-demo-1.0-SNAPSHOT.jar",String.join(",", args)); } catch (Exception e) { if (virtualMachine != null) { try { virtualMachine.detach(); } catch (IOException ex) { ex.printStackTrace(); } } } }} 

4、定義測試的方法

  1. package com.tom.mdc;import java.lang.management.ManagementFactory;import java.util.Random;import java.util.concurrent.TimeUnit;/** * PrintParamTarget * * @author toxmxin */public class PrintParamTarget { public static void main(String[] args) { // 打印當前進程ID System.out.println(ManagementFactory.getRuntimeMXBean().getName()); Random random = new Random(); while (true) { int sleepTime = 5 + random.nextInt(5); running(sleepTime); } } private static void running(int sleepTime) { try { TimeUnit.SECONDS.sleep(sleepTime); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("running sleep time " + sleepTime); }} 

 

責任編輯:梁菲 來源: 阿里云云棲號
相關推薦

2024-04-30 08:09:10

PulsarArthas消息隊列

2023-03-03 09:33:45

ArthasJava診斷工具

2021-04-19 17:25:08

Kubernetes組件網絡

2025-07-18 09:31:30

2021-06-01 09:29:43

ArthasJVM內存

2020-10-28 15:07:01

Arthas

2022-05-08 09:11:44

WiFi樹莓派GO

2009-08-21 09:14:47

C# Excel CO

2024-09-10 09:31:07

開源項目Arthas

2025-05-08 08:20:00

Arthas開源Java

2010-08-04 14:28:01

Flex組件

2024-08-14 14:20:00

2020-12-07 11:12:16

MySOLBinlogOtter

2022-01-26 19:42:05

MySQL亂碼排查

2021-11-14 05:00:56

排查Sdk方式

2021-06-01 07:55:42

DockerEOFk8s

2021-12-01 15:03:56

Java開發代碼

2025-03-18 08:10:00

iodump開源I/O

2020-04-23 10:07:45

工具IDEA阿里巴巴

2024-11-22 09:40:18

Visual內存泄漏內存
點贊
收藏

51CTO技術棧公眾號

黄色免费在线观看| 国产精品9191| 免费视频观看成人| 日韩一区欧美小说| 91网免费观看| 男人日女人网站| 91亚洲国产成人久久精品| 日韩视频123| 69堂免费视频| 国产乱色在线观看| 91一区二区三区在线播放| 国产极品精品在线观看| 国产人妻精品一区二区三区不卡| 美国十次av导航亚洲入口| 在线亚洲一区二区| 日韩一级特黄毛片| av在线免费观看网| 成人av午夜影院| 国产精品综合久久久| 国产精品二区一区二区aⅴ| 青青草成人影院| 亚洲国产精品成人精品| 亚洲三级视频网站| 超碰99在线| 亚洲日本在线视频观看| 欧美午夜精品久久久久免费视 | 久久麻豆精品| 亚洲精品aⅴ中文字幕乱码| 想看黄色一级片| 天天综合网站| 亚洲国产cao| 一区二区在线不卡| 国产在线自天天| 成人18视频日本| 999国产视频| 亚洲天堂免费av| 久久三级视频| 欧洲成人免费aa| 久久久久久国产精品视频| 日韩免费视频| 亚洲欧美一区二区三区在线| 精品伦一区二区三区| 99久久这里有精品| 欧美网站一区二区| 欧美精品色婷婷五月综合| 日本无删减在线| 成人免费在线视频观看| 天堂资源在线亚洲视频| 激情小视频在线观看| 99久久久久免费精品国产| 国产精品传媒毛片三区| 精品人妻少妇嫩草av无码专区| 久久成人免费日本黄色| 国产精品热视频| 奴色虐av一区二区三区| 午夜亚洲伦理| 国产91亚洲精品| 免费黄色网址在线| 久久精品三级| 国产成人综合亚洲| 久草视频在线免费| 美女在线视频一区| 国产欧美欧洲在线观看| 中文字幕日韩国产| 久久99久久99小草精品免视看| 国产精品久久久久影院日本| 亚洲一卡二卡在线| 精品亚洲国产成人av制服丝袜| 国产精品三级网站| 一区二区视频网站| 国产一区二区精品久久| 亚洲xxx自由成熟| www.五月婷婷| jlzzjlzz国产精品久久| 麻豆精品传媒视频| 国产永久免费高清在线观看| 国产精品卡一卡二卡三| 日本xxxxx18| 国产亚洲成av人片在线观看| 日韩欧美在线网址| gogogo高清免费观看在线视频| 久久影视精品| 91精品视频网| www.88av| 日韩国产在线| 欧美激情视频网站| 欧产日产国产69| 乱一区二区av| 99re国产在线播放| 六十路在线观看| 中文字幕一区二区日韩精品绯色| 日本天堂免费a| 久草在线资源站手机版| 欧美系列在线观看| 亚洲av午夜精品一区二区三区| 羞羞色国产精品网站| 中文字幕亚洲自拍| 日韩伦理在线视频| 奇米一区二区三区| 国产精品一区二区三区四区五区| 黄色片在线看| 亚洲精品国产无天堂网2021| 日韩黄色片视频| 久久免费福利| 亚洲一级片在线看| 久久久一区二区三区四区| 美女黄网久久| 99九九视频| 成黄免费在线| 精品福利在线视频| 欧美xxxxxbbbbb| 精品一区亚洲| 国内精品在线一区| 91久久久久国产一区二区| 99国产精品久| 97av中文字幕| 青娱乐极品盛宴一区二区| 亚洲国产欧美自拍| www欧美com| 美女在线视频一区| 欧美日韩精品免费观看| 国产第一页在线视频| 欧美少妇xxx| 性久久久久久久久久| 一区二区三区中文| 国产一区香蕉久久| 成人综合影院| 一本久久a久久精品亚洲| 亚洲熟女一区二区三区| 香蕉国产精品| 国产精品日本精品| 久久视频www| 欧美日韩精品二区| 影音先锋资源av| 欧美日韩国产亚洲一区| 成人一区二区电影| 激情在线小视频| 在线中文字幕一区| 免费看污黄网站在线观看| 黄色免费成人| 99视频在线免费观看| 男人天堂久久久| 欧美日韩亚洲综合一区二区三区| 波多野结衣 在线| 国产亚洲精品久久久久婷婷瑜伽| 国产精品嫩草在线观看| 免费网站在线观看人| 激情综合网av| 亚洲精品视频一区二区| 国产主播在线看| 久久午夜影院| 孩xxxx性bbbb欧美| 丰满少妇高潮在线观看| 一区二区三区中文字幕| 国产xxx在线观看| 伊人久久大香线蕉精品组织观看| 成人免费福利在线| 搞黄网站在线观看| 91精品国产乱码久久蜜臀| 91禁男男在线观看| 麻豆精品国产91久久久久久| 无码免费一区二区三区免费播放 | 欧美日本三级| 久久国产精品视频| 国产特级黄色片| 一区二区三区在线视频播放| 手机精品视频在线| 国产精品www.| 国产嫩草一区二区三区在线观看 | 国产精品久久二区| 91porn在线观看| 91精品福利在线一区二区三区| 五月天丁香激情| hitomi一区二区三区精品| 国产午夜伦鲁鲁| av一区二区在线播放| 国产精品中文在线| 天天色天天射天天综合网| 亚洲高清久久网| 亚洲国产精品无码久久久| 中文成人综合网| 最好看的中文字幕| 国产欧美日本| 亚洲欧美日产图| 亚洲视频一起| 日本中文字幕不卡免费| 免费观看在线午夜影视| 精品国产a毛片| 日韩av综合在线| 中文字幕精品一区二区精品绿巨人| 亚洲欧美手机在线| 亚洲欧洲另类| 香蕉久久夜色| 99国产精品免费网站| 国产成人avxxxxx在线看| 超碰在线无需免费| 日韩精品免费视频| 国产精品爽爽久久久久久| 午夜亚洲福利老司机| 亚洲一级片在线播放| 国产成人免费视| 成人中文字幕av| 国产专区一区| 亚洲一区二区精品在线观看| 都市激情亚洲欧美| 国产欧美 在线欧美| 91超碰在线| 久久九九热免费视频| 日韩一二三四| 精品粉嫩超白一线天av| 免费视频网站在线观看入口| 一区二区三区美女| 欧美另类69xxxx| 91小视频在线观看| 成人三级做爰av| 喷水一区二区三区| 欧美,日韩,国产在线| 亚洲自拍偷拍网| 久久久97精品| 欧美夫妇交换xxx| 久久精品99国产精品日本| 国产3p露脸普通话对白| 88国产精品视频一区二区三区| 免费国产一区二区| 99久久人爽人人添人人澡| 国产日韩av在线播放| 亚洲精品一区| 韩国视频理论视频久久| h网站久久久| 丝袜亚洲欧美日韩综合| 男同在线观看| 日韩国产在线看| 欧美77777| 精品日韩av一区二区| 国产精品一级视频| 欧美欧美欧美欧美首页| 天天爱天天做天天爽| 欧美日韩另类在线| 激情综合网五月婷婷| 一区二区三区视频在线观看| 国产男女猛烈无遮挡在线喷水| 日本一区二区三区在线不卡| 三级电影在线看| 成人夜色视频网站在线观看| 亚洲911精品成人18网站| 韩日av一区二区| 国产永久免费网站| 精品影视av免费| 香蕉视频999| 经典一区二区三区| 国产无色aaa| 久久97超碰色| а 天堂 在线| 国产麻豆精品视频| 色哟哟免费视频| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 欧美激情综合网| 最新中文字幕av| 日本一区二区三区国色天香| 亚洲精品成人av久久| 欧美激情在线一区二区| 中文字幕在线观看免费高清| 国产精品三级久久久久三级| 嘿嘿视频在线观看| 国产精品久久久久精k8| 国产高清视频免费在线观看| 成人免费一区二区三区在线观看| 国产黄在线免费观看| 亚洲一区二区欧美| www.av麻豆| 色综合久久66| 伊人网免费视频| 欧美日韩成人高清| 99视频在线观看免费| 欧美va在线播放| 污污网站免费在线观看| 亚洲免费福利视频| 大胆av不用播放器在线播放| 日韩中文字幕在线精品| 国产黄色小视频在线| 久久男人资源视频| 日本.亚洲电影| 成人xxxx视频| 久草在线综合| 日本精品一区二区三区不卡无字幕| 欧美hd在线| 性一交一乱一伧国产女士spa| 午夜在线视频观看日韩17c| 日本激情视频在线| 国产精品一区二区三区99| 亚洲精品乱码久久| 国产精品色婷婷| 日本少妇裸体做爰| 国产黑丝在线一区二区三区| 欧美另类xxx| 好吊日视频在线观看| 欧美日韩福利在线观看| 僵尸再翻生在线观看| 国产狼人综合免费视频| 国产精品白丝av嫩草影院| 欧美主播一区二区三区美女 久久精品人| 99视频精品视频高清免费| 福利视频一二区| 蜜臀精品一区二区三区在线观看| 潘金莲一级淫片aaaaa| 国产日韩av一区| 久久精品欧美一区二区| 欧美猛男gaygay网站| 深夜福利在线视频| 欧美成人性生活| 777午夜精品电影免费看| 精品国产乱码久久久久久久软件| 欧美顶级大胆免费视频| 欧美色图另类小说| 国产91丝袜在线观看| 日本欧美一区二区三区不卡视频| 亚洲国产视频直播| 国产精品无码久久久久成人app| 亚洲欧美中文另类| 久色国产在线| 91亚洲永久免费精品| 精品久久中文| 日韩欧美视频网站| 国产91精品一区二区| 中文字幕求饶的少妇| 欧洲精品在线观看| 色综合久久网女同蕾丝边| 欧美黑人又粗大| 国产999精品在线观看| 午夜精品美女久久久久av福利| 亚洲全部视频| 成人在线短视频| 亚洲欧洲日韩一区二区三区| 无码无套少妇毛多18pxxxx| 日韩精品一区二区三区第95| 色黄网站在线观看| 亚洲综合视频1区| 色135综合网| 亚洲 欧美 另类人妖| 国产欧美精品一区aⅴ影院| 亚洲永久精品在线观看| 精品无人区太爽高潮在线播放 | va婷婷在线免费观看| 中文国产成人精品| 国产精品诱惑| 亚洲一区二区高清视频| 麻豆精品一二三| 黑人操日本美女| 欧美精品一二三| 国产调教视频在线观看| 成人免费大片黄在线播放| 亚洲综合色站| 中文字幕第九页| 亚洲不卡一区二区三区| 欧美一区二区三区黄片| 久久久久久美女| 米奇精品关键词| 国产午夜福利在线播放| 久久综合精品国产一区二区三区| 久久99国产综合精品免费| 亚洲人成人99网站| 91超碰碰碰碰久久久久久综合| 日韩中文不卡| 精品一区二区在线免费观看| 国产成人久久久久| 精品国产免费久久| 天堂网在线最新版www中文网| 欧美黑人3p| 美女看a上一区| 免费成人深夜夜行网站| 欧美zozo另类异族| 热色播在线视频| 日本成人三级| 国模少妇一区二区三区| 久久成人国产精品入口| 亚洲国产精品久久久久秋霞蜜臀| 国产日韩电影| 亚洲一区三区在线观看| 国产精品一二三四五| 日韩免费一级片| 中文欧美在线视频| 99精品中文字幕在线不卡| 春日野结衣av| 国产精品白丝在线| 黄色片网站免费在线观看| 日本一区二区三区在线播放| 91精品1区| 变态另类丨国产精品| 欧美日韩午夜影院| 久久免费电影| 午夜一区二区三区| 成人激情免费网站| 在线免费观看av片| 91国产视频在线| 图片区亚洲欧美小说区| 挪威xxxx性hd极品| 欧美视频一区在线| 国产经典三级在线| 一区二区视频国产| 99国产精品久久久久久久久久|