2013年7月18日 星期四

加速 gdb 載入 symbol 時間

gdb 7.4 以後支援 index, 可以加速載入 gdb symbol 的時間, 參考 Index Files - Debugging with GDB 的說明, 寫了個 script 接受一個 binary 檔, 會作以下的事:

  1. 用 gdb 載入 binary 的 symbol, 並存下 symbol index 到暫存檔
  2. 加入 symbol index 到原 binary

symbol 太多時, 用 gdb index 可大幅減少載入時間, 不過每次重編又要重新產生 index 檔, 不知有沒有更好的方法, 可以在 linking 時直接在 binary 內加入 symbol index, 並且不會增加太多 linking 時間。

2013-07-19 更新

Viller Hsiao 留言裡的建議, 試了 gold 的 --gdb-index。這功能還滿新的, Ubuntu 12.04 的 gold 沒這選項, 不過 12.10 的 gold 有。可以用 objdump -h BINARY | grep index 確認 link 時加上 --gdb-index 確實有效。

2013-07-23 更新

用 gold 編譯加上 --gdb-index 後踩到雷, 在目前的專案裡 100% 會在執行 backtrace 後卡住不動, 接著一直狂吃記憶體, 漲到 4G 以後顯示gdb virtual memory exhausted can't allocate 4064 bytes, 然後和使用者說 gdb 掛了, 你願意結束這個 debug session 嗎?

交叉比對了下述三種情況:

  • 用 gold link (不含 --gdb-index)
  • 用 gold link (不含 --gdb-index), 事後補 gdb index
  • 用 gold link + --gdb-index
結果只有第三種會中獎, 所以現在改回用第二種方法了。

3 則留言:

  1. 這不知道有沒有用, 找不到gcc 4.7可以試
    http://gcc.gnu.org/wiki/DebugFission

    "Use the gold linker's --gdb-index option (-Wl,--gdb-index when linking with gcc or g++) at link time to create the .gdb_index section that allows GDB to locate and read the .dwo files as it needs them."

    如果不行的話應該可在.gitinit 加入 "shell ./add-gdb-idx.sh" 讓他自動檢查

    回覆刪除
    回覆
    1. 不好意思打錯字, 在 .gdbinit 加入 "shell ./add_gdb_index.sh"

      刪除
  2. 謝啦, gold 的 --gdb-index 應該會有用, 之後來試看看。

    事後用 add_gdb_index.sh 會多花一些時間, 因為它還是要用 gdb 掃一次 binary 內的 symbol。若是編一次、執行兩次以上, 先加入 gdb index 再執行會比較划算。可是若編一次只執行一次, 就沒省到時間了。

    回覆刪除

在 Fedora 下裝 id-utils

Fedora 似乎因為執行檔撞名,而沒有提供 id-utils 的套件 ,但這是使用 gj 的必要套件,只好自己編。從官網抓好 tarball ,解開來編譯 (./configure && make)就是了。 但編譯後會遇到錯誤: ./stdio.h:10...