回覆列表
  • 1 # 使用者7289907719851

    1、 IDEA會即時反編譯,但反編譯出來的原始碼跟實際的行號往往對不上。不能直接用於斷點除錯。

    2、 如果第三方jar包在編譯時帶了行號資訊,有些反編譯工具在反編譯時會把行號作為註釋,但通常不會幫你把程式碼對齊行號。你可以透過手工加空行或者把幾行湊成一行對齊行號。

    3、如果你在異常棧裡能看到是那個類哪一行出錯。你可以在你的專案裡建立一個同樣包名同樣名字的假類。裡面隨便寫個包含至少一行可執行程式碼的假方法,要確保可以透過編譯。比如說

    然後你可以在前面打回車,把其中可執行(可以打斷點)的那一行(例如上面例子中System.out.println這行)調整到你要打斷點的行號上。然後你就可以在該行打斷點。JVM事實上只認類名和行號,並不管具體程式碼。你可以在命令列下用除錯引數啟動JVM執行已經編譯好的應用,然後在IDE用除錯遠端應用(remote application)的方式連上JVM,斷點就能斷住。當然你現在看不到實際的原始碼,但可以看執行期的變數和引數取值。注意儘量不要直接在IDE裡啟動,除非你能保證你建立的假類在類路徑裡在jar包後面(通常不是,因為專案中的類通常會在依賴包前面,那麼執行時就有可能跑到你這個假類裡而不是用jar包裡的類,這跟類載入策略有關,比較難控制)

    4、如果你能找到這個類的原始碼(如果不是閉源的包,在google上查“類全名 source”通常能找到),或者反編譯帶行號(自己手動對齊行號),可以把原始碼貼到你的臨時建立的那個類中,然後全部註釋掉(避免編譯錯誤,但需要保留用來打斷點的可執行程式碼)。這樣你可以單步前進,你能看到每步的程式碼(雖然被註釋了)。當然也可以不貼上進去,只要你自創的那個假類行數足夠(自己多打點回車),你就能單步前進,IDE會高亮當前行(即使這行是空的),你把原始碼放在旁邊對照著行號來看就行了(這時你就會發現寫程式碼時儘量多斷行的好處了)。

    5、IDEA能頂著編譯錯誤打斷點,所以如果你能找到原始碼,其實可以直接貼上到臨時類裡,不用建立第三步中的假方法(但是如果某行位於根本不能打斷點的位置,比如說方法外部,那就打不上斷點,所以要麼貼程式碼,要麼寫假方法,不能是空類)。Eclipse比較多事(至少我七年前還在用的時候是),不透過編譯就不讓你打斷點,所以必須用第三步中的假方法騙過去。

    6、按題主的描述,已經能用反編譯的程式碼斷住,如果反編譯後的程式碼行號是對齊的,你把反編譯後的程式碼複製出來,按包名的目錄結構儲存到硬碟上,用那個Edit Source Lookup Path按鈕,把你儲存檔案的頂層目錄指定為原始碼目錄就行了。IDEA我記得沒有這個問題,如果反編譯後行號對齊的話,斷點直接就會停在反編譯的程式碼上。但我印象中大部分情況下反編譯後的程式碼行號通常都不對齊,反編譯結果又不能直接編輯,所以我很少直接用來除錯。

  • 中秋節和大豐收的關聯?
  • 粉底、粉底液、粉餅、粉條、定妝粉、蜜粉和散粉有什麼區別?