1. 準備工作
-
安裝 GDB
在大多數 Linux 發行版上,執行:sudo apt-get update sudo apt-get install gdb
-
確保有足夠磁盤空間
Core dump 文件可能較大,請提前檢查磁盤剩余空間:df -h .
-
可選:使用 tmux 或 screen
為避免 SSH 斷開導致 GDB 會話中斷,推薦先啟動會話管理工具:tmux new -s redis-debug
或
screen -S redis-debug
2. Redis 編譯(無優化模式)
默認 Redis 會使用 -O2
優化編譯,這會影響 GDB 對源代碼和變量的精準解析。建議在調試時使用無優化版本:
cd redis-source-directory
make distclean # 清理舊編譯產物
make noopt # 使用 noopt 模式編譯
說明:若生產環境中無法重啟或重新編譯,也可直接對已在運行的優化版二進制附加 GDB,調試仍然有效,只是符號信息較少。
3. 獲取 Redis 進程 PID
使用 redis-cli
快速查詢當前運行實例的進程號(PID):
redis-cli info | grep process_id
# 輸出示例:process_id:58414
4. 附加 GDB 到 Redis 進程
在命令行中執行:
gdb /usr/local/bin/redis-server 58414
啟動后,GDB 會自動附加并阻塞進程,您只需在 (gdb)
提示符下輸入:
continue
讓 Redis 繼續運行。此時,Redis 性能幾乎不受影響,您可以安全地等待下次崩潰觸發。
5. 觸發崩潰并收集調試信息
當 Redis 崩潰時(例如在 GDB 會話中執行 DEBUG SEGFAULT
測試),GDB 會中斷并給出崩潰位置:
Program received signal SIGSEGV, Segmentation fault.
0x000000010d26cfd4 in debugCommand (c=0x7ffc32005000) at debug.c:220
220 *((char*)-1) = 'x';
5.1 打印堆棧回溯
(gdb) bt
#0 debugCommand (c=0x7ffc32005000) at debug.c:220
#1 0x000000010d246d63 in call (c=0x7ffc32005000) at redis.c:1163
#2 0x000000010d247290 in processCommand (c=0x7ffc32005000) at redis.c:1305
#3 ...
5.2 打印寄存器狀態
(gdb) info registers
rax 0x0 0
rbx 0x7ffc32005000 140721147367424
rcx 0x10d2b0a60 4515891808
...
rip 0x10d26cfd4 <debugCommand+68>
eflags 0x10246 66118
請務必在報告中同時包含完整的堆棧回溯(
bt
輸出)和寄存器信息(info registers
輸出)。
6. 導出 Core 文件
Core 文件能夠重現崩潰時的內存快照,便于開發者在本地深入分析:
(gdb) gcore
Saved corefile core.58414
(gdb) quit
生成的 core.58414
文件即為崩潰時的內存鏡像。
7. 準備并提交給 Redis 核心團隊
在向 Redis 在 GitHub Issues 提交問題或郵件報告時,請附上以下內容:
-
Redis 可執行文件
您所用的redis-server
二進制,編譯選項需一致。 -
堆棧回溯 & 寄存器輸出
bt
與info registers
的完整文本。 -
Core dump
core.58414
文件。 -
環境信息
- 操作系統版本(例如
uname -a
輸出) - GCC 版本(例如
gcc --version
) - Redis 版本(
redis-server --version
)
- 操作系統版本(例如
隱私提醒:Core 文件中包含運行時所有數據,請僅與受信任的開發者分享,并在問題解決后及時銷毀。
8. 總結
通過本文步驟,您可以:
- 高效附加 GDB 到生產環境中的 Redis 進程,無需停機重啟。
- 準確捕獲 崩潰時的堆棧信息和寄存器狀態,遠勝于僅憑 crash report。
- 安全導出 Core dump,便于本地線下分析,保障生產環境正常運行。
感謝您為開源項目貢獻寶貴的調試信息,讓 Redis 越來越穩定可靠!如果您在調試過程中遇到任何問題,歡迎在 Redis 官方社區或 GitHub Issues 中交流。