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 嗎?
交叉比對了下述三種情況:
結果只有第三種會中獎, 所以現在改回用第二種方法了。