首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

GDB 調試實戰指南:從入門到常見疑難雜症排查

     編輯:關於C語言

GDB 調試實戰指南:從入門到常見疑難雜症排查

核心工作流

  1. 編譯帶調試信息:gcc -g -O0 -Wall prog.c -o prog
  2. 啟動 GDB:gdb ./prog
  3. 設置斷點:break main、break file.c:42、break func if x>10
  4. 運行與控制:run [args]、next(單步過)、step(單步入)、continue、finish(跳出當前函數)
  5. 數據檢查:print var、display expr、watch var、x/10xw addr(檢查內存)
  6. 堆疊回溯:bt、frame N、info locals、info args

高頻實用技巧

  • 條件斷點:break 100 if i == 500 避免循環中手動單步。
  • 斷點命令列表:自動執行腳本
    break foo
    commands
      silent
      print x
      continue
    end
  • 反向調試(需硬件/記錄支持):record、reverse-next、reverse-continue 回溯歷史狀態。
  • 多線程調試:info threads、thread 2、thread apply all bt。
  • 核心轉儲分析:ulimit -c unlimited、gdb ./prog core.1234 事後分析崩潰現場。

常見問題與解決方案

1. CGDB 中文亂碼

原因:終端編碼與 libncurses 版本不匹配。
解決:

# 找到寬字符庫並重建符號鏈接
find / -name "libncursesw.so*"
rm -f /usr/lib/libncurses.so.5
ln -s /lib64/libncursesw.so.5.7 /usr/lib/libncurses.so.5

或設置環境變量:export LC_ALL=zh_TW.UTF-8(根據系統調整)。

2. 「No symbol table」無法打印變量

  • 確認編譯加了 -g 且未 strip。
  • 優化級別 -O0;高優化會消除/重排變量。
  • 內聯函數需 -fno-inline 或查看反彙編。

3. 斷點不生效

  • 代碼行無機器指令(如純聲明、注釋),移至可執行語句。
  • 共享庫未加載:set breakpoint pending on 允許延遲綁定。

4. 優化導致變量「被優化掉」

臨時方案:set variable var = new_value 強制修改內存;根治:重編譯 -O0 -g。

推薦工具鏈

  • CGDB:類 Vim 界面的 GDB 前端,鍵盤友好。
  • GDB Dashboard:.gdbinit 配置,儀表盤式顯示寄存器/彙編/堆疊。
  • VS Code / CLion:圖形化 GDB 封裝,適合日常開發。

熟練 GDB 能將調試效率提升數量級,是 C/C++ 開發者的必修內功。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved