在linux上debug過的朋友應該都知道,這部份除了需要一些額外的工具以外,你的source code和Library裡面都應該需要symbol,通常就是在編譯時加入『-g1,-g2或-g3』等參數,在buildroot裡面這部份就需要用到它的變數來宣告相對應的開關:

  • 『BR2_ENABLE_DEBUG』
    這個參數預設為disalbe,但是如果你enable的話,當然系統就會幫你建制symbol進去。

  • 『BR2_STRIP_none和 BR2_STRIP_strip』
    這兩個參數決定是否要將target的多餘資訊刪除。

當然要debug的話,一定要enable 『BR2_ENABLE_DEBUG』,但是至於『Strip』是否需要,可以參考底下的兩種搭配:

  • BR2_ENABLE_DEBUG=y 且 BR2_STRIP_strip=y
    在『$(STAGING_DIR)』裡只有binary都會有debug symbol,而在資料夾『build』底下全部的東西都會有debug symbol,但是在『$(TARGET_DIR)』 裡面的所有東西都會被strip,因為target那邊沒有任何的symbol,而host這邊有,所以這種組合適合『remote debugging』。

  • BR2_ENABLE_DEBUG=y 且 BR2_STRIP_none=y
    『$(STAGING_DIR)』和『$(TARGET_DIR)』都有『debugging symbols』,這種組合適合『on-target debugging』。

remote debugging

因為使用gdb除錯不是本篇的重點,而且小魯也不精,所以這邊不打算專注在這邊,這邊只講一下如果需要remote debugging的話,在buildroot的注意事項。主要就是在建制toolchain時,針對你選擇的是『internal』或是『external』來開啟不同的選項:

Internal

在internal的部份比較簡單,只要把三個開關打開
BR2_PACKAGE_HOST_GDB=y BR2_PACKAGE_GDB=y BR2_PACKAGE_GDB_SERVER=y

External

在External的部份,gdb可以用外部的,也可以用buildroot的,只要你啟動『BR2_PACKAGE_HOST_GDB=y』。至於gdbserver的部份,如果是要用外部的gdb,則需要啟動變數『BR2_TOOLCHAIN_EXTERNAL_GDB_SERVER_COPY=y』。

setup

  • target
    在目標板上啟動gdbserver,並且確保你網路已經有連接並且有IP,然後使用底下指令啟動gdbserver:
    $ gdbserver --multi localhost:2345

  • host
    目標板上的gdbserver啟動後,在回到主機這邊啟動cross-compiling出來的gdb(<program>代表的是已經包含symbol的程式):
    $ ./output/host/usr/bin/<tuple>-gdb <program>

然後你就會進入gdb的介面裡,然後下一件事就是要連接你的gdb server:
(gdb) target remote-extended <ip>:2345

接下來記得將你的path設定到sysroot上,這樣gdb才可以找到library的symbol:
(gdb) set sysroot ./output/staging/

最後一步就是直接開啟啟動程式:
(gdb) run

debugging tools

除了gdb以外,buildroot裡面也有許多其他可以幫助debug的工具,主要在menuconfig的路徑『Target packages →
Debugging, profiling and benchmark』底下可以選擇:

  • strace
  • ltrace
  • LTTng
  • perf
  • sysdig
  • sysprof
  • OProfile
  • valgrind

results matching ""

    No results matching ""