怎麼閱讀原始碼【除錯觀察原始碼】

一樂樂發表於2022-02-15

✿ 需要掌握的編譯器知識

★ 編譯器為eclipse為例子

  • 除錯準備工作(步驟:Window -> Show View -》...):

    □ 開啟除錯斷點Breakpoint:
    image

    □ 開啟變數監視:
    image

  • 要看一個方法的內部細節,按f5,進入
    image

  • 要快速跳到某個位置【在目標位置上打個斷點】,然後按f8
    image

  • 觀察方法的細節(執行流程),一步一步走,按f6
    image

  • 去除掉所有斷點(編譯器是eclipse)
    image

    □ 注意看開始標記的執行位置對不對
    image

  • f5除錯的方式進入【若進入的是不相干的,按f7返回,再按f5進入一次
    舉例:

User user = mapper.get(1L); //在這裡打一個斷點進入,會先進入Long類,因為執行順序是(1L)先執行呀,所以先進入它之後,再執行get方法
  • 按ctr 和 按除錯的f5的區別:
    □ ctr:是進入“被選中的程式碼(類、介面、方法)”的定義的位置【強調點是程式碼的定義
    □ f5:是對於當前程式碼按執行的先後順序進行執行,進入、執行它的內部【強調點是程式碼的執行

  • 按ctr 結合滑鼠, 可以知道程式碼下一步的去向(按ctr要注意的細節:ctr預設進入的是被選中的程式碼的定義,不是實現過程,進入之後發現沒看到什麼有幫助理解的程式碼,返回返回按住ctr,選擇實現(若是有多個實現,不知道選哪個,可以通過除錯f5進入),再按滑鼠進入。
    image
    image

  • 重新開始除錯細節:
    (1)關閉上一次除錯
    (2)點選 開始除錯之前,保留開始位置的斷點前面的√,其他斷點前面的√先去掉(開始除錯之後才√回來)
    image

  • 進入一個方法後瞭解到方法的細節,想返回接著往下執行,按f7 返回 【返回按f7
    一般在深入瞭解某個模組之後,可以按返回,返回。。。然後接著瞭解下一個模組
    image




✿ 讀原始碼的思路

1、重點理解執行邏輯(執行過程可以按control進入方法或類,理解下一步去向後,游標回到當前位置【快捷鍵是alt+←】)

2、看原始碼過程理清思路,異常相關的(error、exception、throw),讓程式碼更加健碩的細節可以忽略;棧相關的stack,底層的可以忽略

3、在程式碼中,看到選擇分支的話,可以觀察變數的值(判斷條件)知道要進入哪個分支

4、在程式碼中,看到不理解的程式碼,可以先往下執行,然後通過觀察變數的值進行理解【還可結合官網進行理解】

5、讀取流、載入資源、繫結名稱空間、引數轉化不是重點

6、構造構造器不是重點,重點是看 構造器的構造過程

7、構造解析器不是重點,重點是看 解析器的解析過程

8、建立了子類要注意:什麼型別的子類?當子類有封裝的父類或兄弟類時候,注意封裝的父類或兄弟類是什麼型別的?




✿ 讀原始碼如何抓重點的思路(以mybatis的原始碼為例)

■ 1、 閱讀原始碼的過程,應該閱讀哪一個,哪一個是閱讀重點呢?

  • 閱讀原始碼構建會話工廠物件的原始碼,我們瞭解到:建立了一個SqlSessoinFactory會話工廠物件是通過預設的SqlSessoinFactory建立的,在建立的時候需要傳入一個配置物件【即建立會話工廠物件的時候還建立了一個配置物件】,至此,研究一下配置物件的建立過程。
    image

  • 閱讀原始碼構建會話工廠物件的原始碼,我們瞭解到:建立一個sqlSession會話物件是通過預設的sqlSession,在建立的時候需要傳入三個引數,重點是觀察哪個呢?

□ configuration 配置物件(在閱讀會話工廠物件構建的原始碼的時候我們就瞭解過它了,不是重點)
□ executor 執行器(重點,因為在return 會話物件之前構建了executor執行器
□ autoCommit (是否提交,布林值,不是重點)
image

  • 結合理解邏輯,還有return的提示作用,知道閱讀重點是list的過程
    image





✿ 閱讀原始碼需要掌握的單詞

  • map 對映       mapper 對映器
  • factory 工廠
  • build 構建
  • config 配置
  • parse 解析     parser 解析器      parsed 已解析的      parseConfiguration 解析配置
  • interceptor 攔截器
  • plugin “安裝[增強]”、外掛
  • proxy 代理
  • prepared 預編譯的 callable 儲存的
  • statment 語句物件      preparedStatement 預編譯語句物件     callableStatement 儲存的語句物件
  • cursor 游標
  • instantiate 例項化      instantiateStatement 例項化語句物件
  • handler 處理器      typeHandler 型別處理器
  • row 行

相關文章