啟動調試
gdb ./待調試的程序
#不帶參數
(gdb) run
#帶參數
gdb --args ./your_program arg1 arg2 arg3
(gdb) run arg1 arg2 arg3
#圖形化代碼界面
(gdb) layout src
基礎調試命令
命令 | 縮寫 | 作用 |
---|---|---|
run [args] | r | 運行程序(可帶命令行參數) |
break <location> | b | 在函數/行號處設置斷點(如 b crypto_aead_init_x ) |
next | n | 執行下一行(不進入函數) |
step | s | 執行下一行(進入函數) |
continue | c | 繼續運行直到下一個斷點 |
print <expr> | p | 打印變量/表達式(如 p key[0] ) |
backtrace | bt | 查看調用棧 |
quit | q | 退出 GDB |
調試加密函數的實戰示例
(1) 設置斷點
# 在關鍵函數和行號設斷點
(gdb) b crypto_aead_init_x
(gdb) b main:15 # 假設第15行調用加密函數
(2) 運行并檢查參數
(gdb) run
# 程序會在斷點處暫停# 查看傳入的 key 和 nonce
(gdb) p *key@32 # 打印key的32字節
(gdb) p *nonce@24 # 打印nonce的24字節# 檢查OpenSSL上下文是否創建成功
(gdb) p ctx->evp_ctx
(3) 單步跟蹤
(gdb) s # 進入EVP_EncryptInit_ex
(gdb) n # 跳過庫函數內部
(4) 捕獲錯誤
如果函數返回錯誤:
(gdb) p ERR_get_error() # 打印OpenSSL錯誤碼
(gdb) p (char*)ERR_reason_error_string(ERR_get_error()) # 錯誤描述
高級調試技巧
(1) 條件斷點
# 僅當key的第一個字節為0時觸發斷點
(gdb) b crypto_aead_init_x if key[0] == 0
(2) 觀察點(Watchpoint)
# 監控key是否被意外修改
(gdb) watch *(uint8_t(*)[32])key
(3) 內存檢查
# 檢查EVP_CIPHER_CTX內存
(gdb) x/32xb ctx->evp_ctx
(4) 調用棧分析
# 崩潰時查看調用棧
(gdb) bt full
加密場景專用命令
(1) 檢查密鑰隨機性
# 在生成key/nonce后暫停
(gdb) p /x *key@32 # 16進制格式輸出
(2) 跟蹤加密過程
# 在加密前檢查明文
(gdb) p *plain_text@text_size# 加密后檢查密文
(gdb) p *cipher_text@text_size
(3) 驗證MAC計算
# 比較生成的MAC
(gdb) p /x *mac@16
GDB 圖形化界面(可選)
啟用 TUI 模式:
gdb -tui ./aead_demo
# 或運行時按 Ctrl+X+A