P4 bmv2 debugger 使用方式

在開發 P4 時,可以使用 bmv2 來模擬 P4 所寫出來的規則

但是有時候執行的結果會不如同預期

這時候就需要 Debugger 來進行除錯

在 bmv2 資料夾下有一個 tools 的資料夾,裡面有一個 p4dbg.py 的程式,使用方法如下:

  1. 執行 bmv2 模擬程式(例如用 mininet)
  2. 執行 p4dbg.py 程式:
    sudo ./p4dbg.py --thrift-ip 127.0.0.1 --thrift-port 9090
    

thrift-ip 預設是 127.0.0.1,若是在本機執行則可以不用輸入,而 thrift-port 則是開啟 bmv2 時所設定的 thrift api port,預設是 9090

在執行 p4dbg 後會進入 debug 的命令列,其功能如下:

 

名稱(括弧為簡稱) 用途
backtrace(bt)  針對一個封包的內容,顯示他目前執行的堆疊狀態

backtrace <packet id>

example:

P4DBG: backtrace 1528.0
pipeline ‘ingress’ -> table ‘path_lookup’

break(b)  針對 parser, parse_state, pipeline, table, condition, action 或 deparser 設定斷點

break <type> <name>

break_packet_in  封包進入 switch 時暫停
continue(c)  繼續至下個中斷點
delete(d)  刪除中斷點,參數同 break

delete <type> <name>

filter_notifications  只會顯示特定 id 的封包

filter_notifications <packet id>

help(?)  顯示說明,在後方加上指令則可顯示指令說明
next(n)  下一步
print(p)  印出特定資料,像是 register, metadata, header 等

print <packet id> <field name>

remove_packet_in  將 break_packet_in 下的斷點移除掉
reset  將所有的狀態重新設定
resume_packet_in 復原 stop_packet_in 所造成的情況,也就是讓 switch 繼續接受新的封包
set_wp(w)  設定 watch point,監看特定 field

set_wp <field name>

show_bps  顯示有哪些 brack point
show_wps  顯示有哪些 watch point
skip  跳過所有在這個封包的訊息,接下來都看不到他
skip_all   跳過所有在這個封包跟這個封包衍生出的封包的訊息,接下來都看不到他們
stop_packet_in 禁止封包進入 switch
unset_wp  移除 watch point

unset_wp <field name>

備註:所有的命令都可以透過按下 tab 按鍵來補齊。

備註2:當 debugger 開啟後,除非讓他跑 continue,否則他不會繼續處理下一個封包或是繼續下一個步驟,所有的動作都是 single thread 的,所以如果一個不動,基本上全部都不會動。

在〈P4 bmv2 debugger 使用方式〉中有 5 則留言

  1. 您好:
    我在安裝p4 bmv2時,make check時 一直產生錯誤訊息:

    FAIL: test_switch
    ….
    make[4]: *** [test-suite.log] Error 1
    make[4]: Leaving directory `/home/kiki/behavioral-model/tests’
    make[3]: *** [check-TESTS] Error 2
    make[3]: Leaving directory `/home/kiki/behavioral-model/tests’
    make[2]: *** [check-am] Error 2
    make[2]: Leaving directory `/home/kiki/behavioral-model/tests’
    make[1]: *** [check-recursive] Error 1
    make[1]: Leaving directory `/home/kiki/behavioral-model/tests’
    make: *** [check-recursive] Error 1

    進 tests/test-suite.log 檔看到:
    FAIL: test_switch
    =================

    [==========] Running 6 tests from 1 test case.
    [———-] Global test environment set-up.
    [———-] 6 tests from Switch
    [ RUN ] Switch.GetConfig
    [ OK ] Switch.GetConfig (0 ms)
    [ RUN ] Switch.SerializeState1
    [ OK ] Switch.SerializeState1 (4 ms)
    [ RUN ] Switch.SerializeState2
    Traceback (most recent call last):
    File “../tools/runtime_CLI.py”, line 30, in
    import bmpy_utils as utils
    File “/home/kiki/behavioral-model/tools/bmpy_utils.py”, line 26, in
    from thrift import Thrift
    ImportError: No module named thrift
    lt-test_switch: utils.cpp:56: CLIWrapperImp::~CLIWrapperImp(): Assertion `pclose(CLI_f) == 0′ failed.
    Thrift server was started

    不知道是哪個安裝步驟出現問題
    1. ./install_deps.sh
    2. ./autogen.sh
    3. ./configure
    4. make
    5. make check

    不好意思我是p4的新手,有些東西還不太了解,麻煩您幫我看一下哪裡出錯了,謝謝!

  2. 您好
    最近在試著學習使用p4
    不過在運行debugger的部分遇到困難
    在使用bmv2內的simple_switch時若附上–debugger的參數,會無法成功啟動switch
    也因此在嘗試跑2016 NCTU workshop裡的範例時無法成功
    我從p4_mininet.py內消除這項參數就能成功運行switch

    目前想到的可能性只有bmv2的安裝問題
    我在安裝時有依照github上的指示使用./configure –enable-debugger
    configure也顯示會安裝debugger
    make check也全數通過
    但仍無法在simple_switch上啟用debugger
    請問是否有我所遺漏掉的部分?

    1. Hi,
      剛剛測試了一下最新版的 bmv2,–debugger 參數似乎還在
      你可以透過 simple_switch –help 確認

      1. 原先的simple_switch –help內找不到–debugger的參數
        更新完bmv2之後的確有找到
        也可以啟動帶有–debugger的switch
        感謝協助

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料