Java方法调用追踪方案:IDEA插件与代码实现
"鍏勫紵钀岋紝浣犱滑鏈夋病鏈夌粡鍘嗚繃杩欑缁濇湜锛熸槑鏄庡湪鏀逛竴涓畝鍗曠殑Java鏂规硶锛岀粨鏋滄暣涓郴缁熺獊鐒跺穿浜嗭紝鍥犱负涓嶇煡閬撳摢涓妱瑙掓棶鏃皟鐢ㄤ簡杩欎釜鏂规硶锛? 涓婂懆鎴戝徃鏂颁汉灏忕帇灏辫俯浜嗚繖涓潙锛屼粖澶╁挶浠氨鍞犲敔鎬庝箞鐢ㄢ€?strong>鈥婭DEA鎻掍欢鈥?/strong>鈥嬪拰鈥?strong>鈥嬩唬鐮佸疄鐜扳€?/strong>鈥嬩袱澶ф潃鍣紝鎶婅繖涓毦棰樻憗鍦ㄥ湴涓婃懇鎿︺€?/p>
涓€銆両DEA鎻掍欢鍏ㄥ妗?馃О
鈥?strong>鈥?鎴戝彧浼氱敤Ctrl+榧犳爣宸﹂敭鏌ヨ皟鐢紝杩欏鐢ㄥ悧锛?鈥?/strong>鈥?閱掗啋鍚у皯骞达紒杩欏氨濂芥瘮鎷胯彍鍒€闆曠背绮掆€斺€斿ぇ鏉愬皬鐢ㄥ晩銆?/p>
鍏堢キ鍑轰笁澶х鍣ㄦ彃浠讹細
- 鈥?strong>鈥婥all Graph锛堣皟鐢ㄥ浘璋憋級鈥?/strong>鈥嬶細瀹夎鍚庡鐫€鏂规硶鍙抽敭閫?Generate Call Graph"锛岀洿鎺ョ粰浣犵敾鍑烘爲鐘跺浘銆備笂涓湀鎺掓煡鏀粯妯″潡闂锛屾垜灏辨槸鐢ㄥ畠鍙戠幇鏈変釜椋庢帶鏈嶅姟鍋峰伔璋冪敤浜嗗姞瀵嗘柟娉曘€?/li>
- 鈥?strong>鈥婼equenceDiagram锛堟椂搴忓浘锛夆€?/strong>鈥嬶細杩欑帺鎰忓効鑳芥妸鏂规硶璋冪敤鍙樻垚娴佺▼鍥撅紝鐗瑰埆閫傚悎鐞嗘竻澶嶆潅涓氬姟銆備妇涓牀瀛愶紝涓婃鏈変釜璁㈠崟鐘舵€佹祦杞殑闂锛岀敤杩欎釜鎻掍欢5鍒嗛挓灏遍攣瀹氫簡闂鑺傜偣銆?/li>
- 鈥?strong>鈥婮ava Stack Trace锛堝爢鏍堣拷韪級鈥?/strong>鈥嬶細鐩存帴鎶婃姤閿欏爢鏍堢矘璐磋繘鍘伙紝鑷姩楂樹寒鏄剧ず鍏抽敭璋冪敤璺緞銆?/li>
鈥?strong>鈥嬮噸鐐规潵浜嗏€?/strong>鈥嬶細鍦ㄦ彃浠跺競鍦烘悳绱㈡椂璁板緱鍕鹃€?寮€婧愬厤璐?鏍囩锛屽埆鍌讳箮涔庤姳閽变拱鏀惰垂鎻掍欢锛堝埆闂垜鏄€庝箞鐭ラ亾鐨勶級銆傛湁涓悓浜嬪幓骞翠拱浜嗘楂樹环鎻掍欢锛岀粨鏋滃彂鐜板姛鑳借繕涓嶅绯荤粺鑷甫鐨凢ind Usages濂界敤锛岀幇鍦ㄦ彁璧疯繖浜嬭繕鑴哥孩銆?/p>
浜屻€佷唬鐮佸疄鐜伴獨鎿嶄綔 馃洜锔?/h3>
"瑕佹槸娌℃湁IDE鎬庝箞鍔烇紵姣斿鐢熶骇鐜..." 杩欐椂鍊欏氨寰楁帍鍑轰唬鐮佸疄鐜扮殑鐪嬪鏈浜嗐€?/p>
鈥?strong>鈥嬫柟妗圓锛氬爢鏍堣窡韪湳鈥?/strong>鈥?br/> 鍦ㄦ柟娉曞叆鍙e姞杩欐浠g爜锛?/p>
java澶嶅埗public void doSomething() { // 寮€鍚睛鎺㈡ā寮?/span> StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); Arrays.stream(stackTrace) .filter(e -> e.getClassName().startsWith("com.yourpackage")) .forEach(e -> System.out.println("馃悰杩借釜鍒拌皟鐢ㄨ€咃細" + e)); // ...鍘熸湁閫昏緫 }
涓婂懆鎺掓煡绾夸笂闂鏃讹紝杩欐浠g爜甯垜浠€埌涓€涓繃鏈熺殑瀹氭椂浠诲姟銆備笉杩囪娉ㄦ剰锛氣€?strong>鈥嬪埆鍦ㄧ敓浜х幆澧冩互鐢ㄢ€?/strong>鈥嬶紝鍚﹀垯鏃ュ織绯荤粺鍒嗗垎閽熺垎鐐哥粰浣犵湅銆?/p>
鈥?strong>鈥嬫柟妗圔锛氬姩鎬佷唬鐞嗙洃鍚€?/strong>鈥?br/> 鎼炰釜杩欐牱鐨勪唬鐞嗙被锛?/p>
java澶嶅埗public class MethodSpy implements InvocationHandler { private Object target; public static Object createProxy(Object target) { return Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), new MethodSpy(target)); } @Override public Object invoke(Object proxy, Method method, Object[] args) { System.out.println("馃攳鏈変汉璋冪敤浜嗭細" + method.getName()); return method.invoke(target, args); } }
鎶婅繖涓唬鐞嗗璞℃敞鍏ュ埌Spring瀹瑰櫒閲岋紝鎵€鏈夋帴鍙h皟鐢ㄩ兘閫冧笉杩囦綘鐨勬硶鐪笺€備笂鍥炴湁涓涓夋柟鎺ュ彛棰戠箒鎶ラ敊锛屽氨鏄敤杩欐嫑鍙戠幇鏄墠绔噸澶嶆彁浜ゅ鑷寸殑銆?/p>
涓夈€佹彃浠禫S浠g爜瀹炵幇鎿傚彴璧?馃
鍜变滑鐢ㄨ〃鏍兼瘮鍒掓瘮鍒掞細
缁村害 | IDEA鎻掍欢娴?/th> | 浠g爜瀹炵幇娴?/th> |
---|---|---|
鈥?strong>鈥嬩笂鎵嬮毦搴︹€?/strong>鈥?/td> | 鐐瑰嚑涓嬮紶鏍囧氨琛?馃懚 | 寰椾細鍐欎唬鐮?馃懆馃捇 |
鈥?strong>鈥嬮€傜敤鍦烘櫙鈥?/strong>鈥?/td> | 寮€鍙?娴嬭瘯鐜 馃枼锔?/td> | 鐢熶骇鐜/鏃營DE鐜 鈽侊笍 |
鈥?strong>鈥嬬簿纭害鈥?/strong>鈥?/td> | 闈欐€佸垎鏋愬彲鑳芥湁璇樊 鉂?/td> | 瀹炴椂鐩戞帶缁濆鍑嗙‘ 鉁?/td> |
鈥?strong>鈥嬫€ц兘褰卞搷鈥?/strong>鈥?/td> | 闆舵崯鑰?馃殌 | 杞诲井鎹熻€楋紙闇€璇勪及锛?鈿狅笍 |
鍘诲勾鍙屽崄涓€澶т績锛屾垜浠氨鏄袱杈规柟妗堝弻绠¢綈涓嬶細鐧藉ぉ鐢–all Graph鎻掍欢鍋氶潤鎬佸垎鏋愶紝鏅氫笂鐢ㄥ姩鎬佷唬鐞嗙洃鎺х敓浜х幆澧冿紝纭槸鎶婃帴鍙e搷搴旀椂闂村帇涓嬪幓浜?00ms銆?/p>
鍥涖€侀伩鍧戞寚鍗?馃毀
"鎴戠収鐫€鏁欑▼鍋氫簡涓哄暐杩樻槸涓嶇伒锛? 杩欓噷鏈夊嚑涓浼犵殑鍧戜綅鏍囪锛?/p>
- 鈥?strong>鈥婰ambda琛ㄨ揪寮忊€?/strong>鈥嬶細鐢ㄦ柟娉曞紩鐢ㄦ椂IDE鍙兘妫€娴嬩笉鍒拌皟鐢ㄩ摼锛岃繖鏃跺€欏緱鎶奓ambda鏀瑰啓鎴愬尶鍚嶅唴閮ㄧ被
- 鈥?strong>鈥嬪弽灏勮皟鐢ㄢ€?/strong>鈥嬶細涓嶇鏄彃浠惰繕鏄唬鐮侀兘杩借釜涓嶅埌锛岃繖鏃跺€欏緱绁嚭Arthas鐨則race鍛戒护锛堣繖涓挶鏀瑰ぉ鍗曞紑涓€绡囪锛?/li>
- 鈥?strong>鈥嬪绾跨▼鐜鈥?/strong>鈥嬶細鍫嗘爤璺熻釜鍙兘涓㈠け鐖剁嚎绋嬩俊鎭紝璁板緱鍦ㄥ垱寤虹嚎绋嬫椂浼犻€掕皟鐢ㄤ笂涓嬫枃
鏈変釜鐪熷疄妗堜緥锛氬悓浜嬭€佸紶鐢ㄦ彃浠舵娲绘壘涓嶅埌鏌愪釜鏂规硶鐨勮皟鐢ㄦ柟锛屾渶鍚庡彂鐜版槸Jackson鍙嶅簭鍒楀寲鏃堕€氳繃getter鏂规硶闂存帴璋冪敤銆傛墍浠ュ晩锛屸€?strong>鈥嬮亣鍒扮伒寮備簨浠跺厛鎯虫兂妗嗘灦鐨勯殣褰㈣皟鐢ㄢ€?/strong>鈥嬨€?/p>
璇寸偣鎺忓績绐濆瓙鐨勮瘽
骞蹭簡鍏勾Java寮€鍙戯紝鎴戝彂鐜拌繖琛屽綋鏈変釜鐪熺悊锛氣€?strong>鈥嬩細鐪嬭皟鐢ㄩ摼鐨勫紑鍙戣€咃紝鑱屼笟鐢熸动閮芥瘮鍒汉闀夸笁骞粹€?/strong>鈥嬨€傛牴鎹垜浠洟闃熷唴閮ㄧ粺璁★紝鎺屾彙璋冪敤閾捐拷韪妧宸х殑寮€鍙戜汉鍛橈細
- 骞冲潎BUG淇閫熷害鎻愬崌40%
- 浠g爜閲嶆瀯鎴愬姛鐜囨彁楂?5%
- 鑳岄攨姒傜巼鐩撮檷80%
鏈€鍚庣粰涓毚璁猴細鍒氬叆琛岀殑寤鸿鍏堢帺杞琁DE鎻掍欢锛岀瓑鎽告竻闂ㄩ亾浜嗗啀灏濊瘯浠g爜瀹炵幇銆傚氨鍍忓姝﹀姛锛屽厛鎶婂皯鏋楅暱鎷崇粌鐔熶簡锛屽啀鍘荤銆婃槗绛嬬粡銆嬩篃涓嶈繜锛屼綘璇存槸涓嶆槸杩欎釜鐞嗭紵
本文由嘻道妙招独家原创,未经允许,严禁转载