強烈推薦一個大神的人工智能的教程:http://www.captainbed.net/zhanghan
【前言】
有時候經常會遇到一些詭異的問題:明明在本地運行代碼沒有問題,服務器代碼和本地一樣,請求的參數和所連接的數據源
都一樣爲啥服務器上不行那?
如果在測試環境我們可以進行遠程調試(參考《idea遠程調試》),但是線上應該如何排查?
博主遇到很多次這種情況,最後確定都是由於服務器上代碼並沒有更新導致的,沒有更新原因有很多種比如:運維的部署腳
本有問題,執行錯誤腳本等等;那麼如何確定線上運行的代碼和本地運行有差異那?
【反編譯神器】
一、兩種反編譯方法:
1、通過jd-gui查看class文件
2、通過阿里雲的在線分析診斷工具Arthas的jad在線反編譯;
二、兩種方法使用的詳細步驟
1、準備工作:
(1)以SpringBoot工程爲例,代碼地址:https://github.com/dangnianchuntian/springboot
(2)以代碼中的LombokController 爲示例
(3)在Linux上對項目進行部署
(4)通過swagger對項目進行訪問
2、通過jd-gui查看class文件,方法:
(1)登錄服務器,找到項目啓動jar包,並創建臨時目錄t
(2)將啓動jar包拷貝到臨時目錄t中,並進入臨時目錄t中
(3)使用unzip命令對jar包進行解壓
(4)進入到相關目錄中找到LombokController.class
(5)將LombokController.class導出到本地
(6)在本地用jd-gui打開文件(jd-gui綠色免安裝版地址:鏈接https://pan.baidu.com/s/1tj3iPQX5UW2yHffM6nicNQ
提取碼:x8up)注:如果出現文件損壞或打開亂碼,請用方法二進行查看。
3、通過阿里雲的在線分析診斷工具Arthas的jad在線反編譯,方法:
(1)官網下載Arthas https://alibaba.github.io/arthas/download.html
(2)在服務器中通過 java -jar arthas-boot.jar 啓動Arthas
(3)按序號(此處爲1)進入到項目中,並執行jad com.zhanghan.zhboot.controller.LombokController 查看內容
【總結】
1、有了這兩種查看源碼方法,可以使我們快速定位到問題;
2、遇到問題後不要鑽牛角尖,要從多個維度去思考問題。