女人荫蒂被添全过程13种图片,亚洲+欧美+在线,欧洲精品无码一区二区三区 ,在厨房拨开内裤进入毛片

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

閱讀開源項目源碼的實用技巧(下)

jf_78858299 ? 來源:labuladong ? 作者:labuladong ? 2023-04-12 11:37 ? 次閱讀

技巧二、多猜,多搜索,可以在底層庫(標準庫、網絡框架等)打條件斷點過篩選出關鍵流程

這句話其實是高效 debug 的關鍵。初看源碼時「猜」是很重要且很有效的手段,結合 IDE 的搜索功能,能夠幫我們快速定位關鍵代碼。

為什么底層庫適合打斷點呢?因為出看大項目的代碼很難搞清楚其中的細節,加上各種異步、多線程的操作,很容易把代碼「跟丟」。如果把斷點打在底層庫的接口/方法上,就可以根據調用棧分析調用過程。

當然,底層庫被調用的次數比較多,可能出現很多無關的調用,所以要結合條件斷點來過濾掉無關的調用。

還是用 Pulsar 舉例,我現在想探究 producer 發送消息的流程,那么 producer 和 broker 之間的網絡通信過程就是一個重要的切入點。

首先發現 Pulsar 的網絡協議使用的是 protobuf,而且注意到PulsarApi.proto這個文件中有一個BaseCommand定義:

message BaseCommand {
    enum Type {
        CONNECT     = 2;
        SUBSCRIBE   = 4;

        PRODUCER    = 5;

        SEND        = 6;
        SEND_RECEIPT= 7;

        MESSAGE     = 9;
        ACK         = 10;

        PING = 18;
        PONG = 19;
        ...
    }
    
    required Type type = 1;

    
    optional CommandConnect connect          = 2;
    optional CommandConnected connected      = 3;
    ...
}

又發現 Pulsar 底層靠 netty 框架實現網絡通信,那么我們可以大膽猜測, 源碼里肯定有一個大 switch 語句 ,來根據 command 里面的 type 分類處理對應的 command。

所以我們可以全局搜索一下case SEND_RECEIPT ,就找到了PulsarDecoder這個文件:

圖片

這里會根據不同的 command type 調用不同的 handle 函數,所以可以認為這里是 Pulsar 關鍵功能的入口。

而且注意這是 common 包,也就是說 client 和 broker 都會依賴這個包, 所以斷點打在 switch 這里就可以看到 client 和 broker 的網絡交互 ,每次跳轉的 case 就是網絡命令的交互順序:

圖片

PS:因為 ping/pong 心跳消息在調試時很煩人,所以我們可以通過條件斷點跳過心跳消息。另外,我們需要把 client 里面的各種 timeout 都調大一些,避免調試時出現超時的錯誤。

這樣,啟動我們的測試用例,僅僅通過這一個斷點,就能搞明白 Pulsar 發消息的流程了:

當然,如果你想探究每一步具體做了什么,就跳進具體的 handle 函數里一步步調試即可。

技巧三、利用各種可視化工具 。

你比如,上面說的網絡通信過程,我們知道了 produce 一條消息的流程,但每條 protobuf 數據包里面到底存了什么信息呢?

關于這個問題,社區有大佬寫了一個 lua 腳本, 可以用 wireshark 解析 Pulsar 協議格式 ,具體說明在這里:

https://github.com/apache/pulsar/tree/master/wireshark

按照說明配置并啟動 wireshark 之后,可以使用如下過濾命令過濾掉無關的數據包:

tcp.port eq 6650 and pulsar and protobuf.field.name ne "ping" and protobuf.field.name ne "pong"

接下來啟動 standalone,通過 Java client 發送一條消息,就可以在 wireshark 抓到 10 個數據包,和剛才通過 debug 得到的流程是一樣的:

同時,我們還可以查看每個包的具體數據,比如PARTITITONED_METADATA命令就是在查詢 topic 對應的 partition 有多少,因為這里是個非分區的 topic,所以PARTITITONED_METADATA_RESPONSE返回了 0:

再比如LOOKUP命令用來查詢 broker 的 URL,因為我們啟動的 standalone 只有一個 broker,所以LOOKUP_RESPONSE返回的只有一個 URL:

在真實的使用場景中肯定有多個 broker,所以這個LOOKUP_RESPONSE應該會返回多個 broker URL。

最后看一下真正發送消息的SEND命令里面具體有什么數據:

圖片

可以看到這里面有 producer_name, sequence_id 等數據,每條消息的 sequence_id 單調遞增,用來防止由于網絡重傳導致的消息重復,和 tcp 里面的 seq 差不多的原理。

另外可以看到真正的消息數據放在數據包的最后,通過一個字段記錄數據的長度。

具體的玩法可以有很多,我這里就不一一列舉了,其實除了 wireshark 分析 Pulsar 的網絡通信, 還可以使用 zookeeper 的可視化工具查看 Pulsar 的元數據 。

比如 prettyZoo 就是一款對 zookeeper 可視化的開源工具,那么我就可以在 Pulsar standalone 啟動之后(會自動啟動 zookeeper),讓 prettyZoo 連接到 zookeeper 的端口,很直觀地查看 zookeeper 里面的節點數據:

圖片

這里面很多數據可能不好理解,但我們手上有源碼, 這些路徑大概率是以字符串常量的形式表現的,那全局搜索就行了 。

比如這個producer-name的路徑,我們搜一下就定位出來了:

圖片

簡單瀏覽一下源碼,原來是借助 zookeeper 生成全局唯一的生產者名字。

最后

本文也夠長了,主要介紹了一些閱讀開源項目源碼的實用技巧,總結來說就是: 善于找資源,善于用工具 。

雖然本文是以 Pulsar 為例,但這些技巧都是通用的,可以運用到任何比較成熟的開源項目上去。

如果你也有什么經驗分享,可以留言告訴我,掌握技巧只是漫漫長路的第一步,讓我們共同在開源社區里成長進步。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • IDE
    IDE
    +關注

    關注

    0

    文章

    348

    瀏覽量

    47600
  • 開源
    +關注

    關注

    3

    文章

    3635

    瀏覽量

    43625
  • DEBUG
    +關注

    關注

    3

    文章

    94

    瀏覽量

    20436
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    Matepad pro12.2 已上市半個月,但是還沒有在開源網站看到該項目開源信息,違背開源精神

    Matepad pro12.2 已上市半個月,本人自己也購買了同款12+256的pad,想要同步學習這款pad的一些體驗還不錯的功能點,但是目前為止還沒有在開源網站看到該項目開源
    發表于 08-27 17:25

    關于Linux的源代碼閱讀問題

    ,linux開源,應該所有庫函數都可以進去的了。2.在Linux項目,沒有像MDK那樣做一個項目,然后規范文件分類嗎?否則,項目一大,文
    發表于 11-21 11:04

    機友分享 | 導入機智云Android開源項目的正確姿勢

    以下文章來源于小雨編程 ,作者小雨tt“使用機智云AIoT平臺支持項目自生成APP源碼,即可輕松解決Android開源項目啦,”開發者下載源碼
    發表于 09-28 10:58

    【HiSpark系列】潤和 HiHope 社區 開源項目集合

    Demo App的源碼https://gitee.com/hihopeorg/GOpenSource_AppKit目前相關的開源代碼都放在了這里,感興趣的可以看一
    發表于 10-22 09:52

    C語言開源項目

    值得學習的C語言開源項目- 1. WebbenchWebbench是一個在linux使用的非常簡單的網站壓測工具。它使用fork()模擬多個客戶端同時訪問我們設定的URL,測試網站在壓力下工
    發表于 08-20 06:15

    下載編譯源碼的要點和搭建源碼閱讀環境的方法

    下載編譯源碼的要點和搭建源碼閱讀環境的方法。下載編譯源碼,一方面是為了搭建源碼閱讀環境,另一方面
    發表于 01-10 06:49

    STM32項目開發中超級實用技巧分享

    STM32項目開發中超級實用技巧一. 利用軟啟動打補丁二. 優化等級盡量選擇不優化三. 合理利用開關總中斷所有的熱愛都要不遺余力,真正喜歡它便給它更高的優先級,和更多的時間吧!關于STM32其它
    發表于 01-21 06:22

    分享一個超級實用的源碼閱讀小技巧

    工欲善其事必先利其器; 我發現函數調用圖可以讓我們更加直觀地了解到源碼函數直接的調用和層次關系,提高閱讀源碼的效率 。 1 前言 看源碼的時候,心血來潮想弄一
    的頭像 發表于 05-29 11:50 ?2262次閱讀
    分享一個超級實用的<b class='flag-5'>源碼</b><b class='flag-5'>閱讀</b>小技巧

    優秀的 Verilog/FPGA開源項目介紹(一)

    的參考價值。 這里再介紹一開源協議的區別,方便大家在閱讀使用這些開源項目時尊重規則。 詳情查看:https://suisuisi.blog
    的頭像 發表于 10-11 15:31 ?1w次閱讀
    優秀的 Verilog/FPGA<b class='flag-5'>開源</b><b class='flag-5'>項目</b>介紹(一)

    模擬閱讀開源分享

    電子發燒友網站提供《模擬閱讀開源分享.zip》資料免費下載
    發表于 11-14 11:21 ?0次下載
    模擬<b class='flag-5'>閱讀</b>器<b class='flag-5'>開源</b>分享

    矩陣顯示器上的新聞閱讀開源項目

    電子發燒友網站提供《矩陣顯示器上的新聞閱讀開源項目.zip》資料免費下載
    發表于 02-08 10:46 ?0次下載
    矩陣顯示器上的新聞<b class='flag-5'>閱讀</b>器<b class='flag-5'>開源</b><b class='flag-5'>項目</b>

    閱讀開源項目源碼實用技巧(上)

    本文分享一在使用或者學習開源項目源碼的過程中的一些經驗技巧。 因為我最近在研究 Apache Pulsar 這款消息隊列,所以就以這個項目
    的頭像 發表于 04-12 11:34 ?1438次閱讀
    <b class='flag-5'>閱讀</b><b class='flag-5'>開源</b><b class='flag-5'>項目</b><b class='flag-5'>源碼</b>的<b class='flag-5'>實用技巧</b>(上)

    Java算法大全源碼開源源碼

    Java算法大全源碼開源源碼
    發表于 06-07 14:58 ?1次下載

    如何去閱讀源碼,我總結了18條心法

    在一個優秀的開源項目中,設計模式處處存在,所以在你開始閱讀源碼之前最好先了解一常見的一些設計模式。當你了解了一些設計模式以后,在
    的頭像 發表于 07-17 16:00 ?1030次閱讀
    如何去<b class='flag-5'>閱讀</b><b class='flag-5'>源碼</b>,我總結了18條心法

    浙大博導開源飛控planner源碼

    浙大博導開源飛控planner源碼
    發表于 06-12 11:43 ?5次下載
    主站蜘蛛池模板: 疏附县| 宝坻区| 桐柏县| 济宁市| 江油市| 宜章县| 正镶白旗| 河间市| 丹江口市| 宣武区| 梅河口市| 子长县| 淳安县| 松潘县| 沭阳县| 都江堰市| 榆树市| 浦城县| 红桥区| 大埔区| 海伦市| 资兴市| 那坡县| 静宁县| 体育| 托克托县| 丹阳市| 新野县| 龙岩市| 涞水县| 宝坻区| 剑川县| 高雄市| 霍城县| 河北省| 盐源县| 贡嘎县| 惠水县| 廉江市| 长沙县| 手游|