加速 gdb 載入 symbol 時間

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

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

#!/bin/bash
# Ref. http://sourceware.org/gdb/onlinedocs/gdb/Index-Files.html

if [ $# -ne 1 ]; then
  echo -e "$0 <binary>\n"
  echo -e "Add gdb index to <binary>\n"
  exit 1
fi

binary="$1"
dir="${binary%/*}"

echo "> Getting gdb index from $binary ..."
time gdb -nx --batch-silent -ex "file $binary" -ex "save gdb-index $dir"

echo -e "\n> Insert gdb index into $binary ..."
if [ -f "${binary}.gdb-index" ]; then
  time objcopy --add-section .gdb_index="${binary}.gdb-index" --set-section-flags .gdb_index=readonly "$binary" "$binary"
  rm -f "${binary}.gdb-index"
fi
echo -e "\n> Done."

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

結果只有第三種會中獎, 所以現在改回用第二種方法了。