gdb 7.4 以後支援 index, 可以加速載入 gdb symbol 的時間, 參考 Index Files - Debugging with GDB 的說明, 寫了個 script 接受一個 binary 檔, 會作以下的事:
- 用 gdb 載入 binary 的 symbol, 並存下 symbol index 到暫存檔
- 加入 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
這不知道有沒有用, 找不到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" 讓他自動檢查
不好意思打錯字, 在 .gdbinit 加入 "shell ./add_gdb_index.sh"
刪除謝啦, gold 的 --gdb-index 應該會有用, 之後來試看看。
回覆刪除事後用 add_gdb_index.sh 會多花一些時間, 因為它還是要用 gdb 掃一次 binary 內的 symbol。若是編一次、執行兩次以上, 先加入 gdb index 再執行會比較划算。可是若編一次只執行一次, 就沒省到時間了。