[TOC]
# 簡介
GNU工具集中的調試器是GDB(GNU Debugger),該程序是一個交互式工具,工作在字符模式。
除gdb外,linux下比較有名的調試器還有xxgdb, ddd, kgdb, ups。
GDB主要幫忙你完成下面四個方面的功能:
1. 啟動程序,可以按照你的自定義的要求隨心所欲的運行程序。
2. 可讓被調試的程序在你所指定的調置的斷點處停住。(斷點可以是條件表達式)
3. 當程序被停住時,可以檢查此時你的程序中所發生的事。
4. 動態的改變你程序的執行環境。
**yum install -y gcc-c++ gdb**
# 生成調試信息
一般來說GDB主要調試的是C/C++的程序。要調試C/C++的程序,首先在編譯時,我們必須要把調試信息加到可執行文件中。使用編譯器(cc/gcc/g++)的 -g 參數可以做到這一點。如:
> gcc -g hello.c -o hello
>
> g++ -g hello.cpp -o hello
如果沒有-g,你將看不見程序的函數名、變量名,所代替的全是運行時的內存地址。
# 啟動GDB
* 啟動gdb:`gdb program`
~~~
program 也就是你的執行文件,一般在當前目錄下。
~~~
* 設置運行參數
~~~
set args 可指定運行時參數。(如:set args 10 20 30 40 50 )
show args 命令可以查看設置好的運行參數。
~~~
* 啟動程序
~~~
run: 程序開始執行,如果有斷點,停在第一個斷點處
start: 程序向下執行一行。
~~~
# 顯示源代碼
用list命令來打印程序的源代碼。默認打印10行。
~~~
? list linenum: 打印第linenm行的上下文內容.
? list function: 顯示函數名為function的函數的源程序。
? list: 顯示當前行后面的源程序。
? list -: 顯示當前行前面的源程序。
~~~
一般是打印當前行的上5行和下5行,如果顯示函數是是上2行下8行,默認是10行,當然,你也可以定制顯示的范圍,使用下面命令可以設置一次顯示源程序的行數。
~~~
? set listsize count:設置一次顯示源代碼的行數。
? show listsize: 查看當前listsize的設置。
~~~
# 斷點操作
**1)簡單斷點**
~~~
break 設置斷點,可以簡寫為b
? b 10 設置斷點,在源程序第10行
? b func 設置斷點,在func函數入口處
~~~
**2)多文件設置斷點**
C++中可以使用class::function或function(type,type)格式來指定函數名。
如果有名稱空間,可以使用namespace::class::function或者function(type,type)格式來指定函數名。
~~~
? break filename:linenum -- 在源文件filename的linenum行處停住
? break filename:function -- 在源文件filename的function函數的入口處停住
? break class::function或function(type,type) -- 在類class的function函數的入口處停住
? break namespace::class::function -- 在名稱空間為namespace的類class的function函數的入口處停住
~~~
**3)查詢所有斷點**
* info b
* info break
* i break
* i b
# 條件斷點
一般來說,為斷點設置一個條件,我們使用if關鍵詞,后面跟其斷點條件。
設置一個條件斷點:
> b test.c:8 if Value == 5
# 維護斷點
1)delete \[range...\] 刪除指定的斷點,其簡寫命令為d。
* 如果不指定斷點號,則表示刪除所有的斷點。range表示斷點號的范圍(如:3-7)。
* 比刪除更好的一種方法是disable停止點,disable了的停止點,GDB不會刪除,當你還需要時,enable即可,就好像回收站一樣。
2) disable \[range...\] 使指定斷點無效,簡寫命令是dis。
如果什么都不指定,表示disable所有的停止點。
3) enable \[range...\] 使無效斷點生效,簡寫命令是ena。
如果什么都不指定,表示enable所有的停止點。
# 調試代碼
* run 運行程序,可簡寫為r
* next 單步跟蹤,函數調用當作一條簡單語句執行,可簡寫為n
* step 單步跟蹤,函數調進入被調用函數體內,可簡寫為s
* finish 退出進入的函數
* until 在一個循環體內單步跟蹤時,這個命令可以運行程序直到退出循環體,可簡寫為u。
* continue 繼續運行程序,停在下一個斷點的位置,可簡寫為c
* quit 退出gdb,可簡寫為q
# 數據查看
1)查看運行時數據
print 打印變量、字符串、表達式等的值,可簡寫為p
~~~
p count 打印count的值
~~~
# 自動顯示
你可以**設置一些自動顯示的變量**,當程序停住時,或是在你單步跟蹤時,這些變量會自動顯示。相關的GDB命令是display。
* display 變量名
* info display -- 查看display設置的自動顯示的信息。
* undisplay num(info display時顯示的編號)
* delete display dnums… -- 刪除自動顯示,dnums意為所設置好了的自動顯式的編號。如果要同時刪除幾個,編號可以用空格分隔,如果要刪除一個范圍內的編號,可以用減號表示(如:2-5)
* disable display dnums…
* enable display dnums…
* disable和enalbe不刪除自動顯示的設置,而只是讓其失效和恢復。
# 查看修改變量的值
1)`ptype width` -- 查看變量width的類型
~~~
type = double
~~~
2)`p width `-- 打印變量width 的值
~~~
$4 = 13
~~~
你可以使用set var命令來告訴GDB,width不是你GDB的參數,而是程序的變量名,如:
~~~
set var width=47 // 將變量var值設置為47
~~~
**在你改變程序變量取值時,最好都使用set var格式的GDB命令**
- c語言
- 基礎知識
- 變量和常量
- 宏定義和預處理
- 隨機數
- register變量
- errno全局變量
- 靜態變量
- 類型
- 數組
- 類型轉換
- vs中c4996錯誤
- 數據類型和長度
- 二進制數,八進制數和十六進制數
- 位域
- typedef定義類型
- 函數和編譯
- 函數調用慣例
- 函數進棧和出棧
- 函數
- 編譯
- sizeof
- main函數接收參數
- 宏函數
- 目標文件和可執行文件有什么
- 強符號和弱符號
- 什么是鏈接
- 符號
- 強引用和弱引用
- 字符串處理函數
- sscanf
- 查找子字符串
- 字符串指針
- qt
- MFC
- 指針
- 簡介
- 指針詳解
- 案例
- 指針數組
- 偏移量
- 間接賦值
- 易錯點
- 二級指針
- 結構體指針
- 字節對齊
- 函數指針
- 指針例子
- main接收用戶輸入
- 內存布局
- 內存分區
- 空間開辟和釋放
- 堆空間操作字符串
- 內存處理函數
- 內存分頁
- 內存模型
- 棧
- 棧溢出攻擊
- 內存泄露
- 大小端存儲法
- 寄存器
- 結構體
- 共用體
- 枚舉
- 文件操作
- 文件到底是什么
- 文件打開和關閉
- 文件的順序讀寫
- 文件的隨機讀寫
- 文件復制
- FILE和緩沖區
- 文件大小
- 插入,刪除,更改文件內容
- typeid
- 內部鏈接和外部鏈接
- 動態庫
- 調試器
- 調試的概念
- vs調試
- 多文件編程
- extern關鍵字
- 頭文件規范
- 標準庫以及標準頭文件
- 頭文件只包含一次
- static
- 多線程
- 簡介
- 創建線程threads.h
- 創建線程pthread
- gdb
- 簡介
- mac使用gdb
- setjump和longjump
- 零拷貝
- gc
- 調試器原理
- c++
- c++簡介
- c++對c的擴展
- ::作用域運算符
- 名字控制
- cpp對c的增強
- const
- 變量定義數組
- 盡量以const替換#define
- 引用
- 內聯函數
- 函數默認參數
- 函數占位參數
- 函數重載
- extern "C"
- 類和對象
- 類封裝
- 構造和析構
- 深淺拷貝
- explicit關鍵字
- 動態對象創建
- 靜態成員
- 對象模型
- this
- 友元
- 單例
- 繼承
- 多態
- 運算符重載
- 賦值重載
- 指針運算符(*,->)重載
- 前置和后置++
- 左移<<運算符重載
- 函數調用符重載
- 總結
- bool重載
- 模板
- 簡介
- 普通函數和模板函數調用
- 模板的局限性
- 類模板
- 復數的模板類
- 類模板作為參數
- 類模板繼承
- 類模板類內和類外實現
- 類模板和友元函數
- 類模板實現數組
- 類型轉換
- 異常
- 異常基本語法
- 異常的接口聲明
- 異常的棧解旋
- 異常的多態
- 標準異常庫
- 自定義異常
- io
- 流的概念和類庫結構
- 標準io流
- 標準輸入流
- 標準輸出流
- 文件讀寫
- STL
- 簡介
- string容器
- vector容器
- deque容器
- stack容器
- queue容器
- list容器
- set/multiset容器
- map/multimap容器
- pair對組
- 深淺拷貝問題
- 使用時機
- 常用算法
- 函數對象
- 謂詞
- 內建函數對象
- 函數對象適配器
- 空間適配器
- 常用遍歷算法
- 查找算法
- 排序算法
- 拷貝和替換算法
- 算術生成算法
- 集合算法
- gcc
- GDB
- makefile
- visualstudio
- VisualAssistX
- 各種插件
- utf8編碼
- 制作安裝項目
- 編譯模式
- 內存對齊
- 快捷鍵
- 自動補全
- 查看c++類內存布局
- FFmpeg
- ffmpeg架構
- 命令的基本格式
- 分解與復用
- 處理原始數據
- 錄屏和音
- 濾鏡
- 水印
- 音視頻的拼接與裁剪
- 視頻圖片轉換
- 直播
- ffplay
- 常見問題
- 多媒體文件處理
- ffmpeg代碼結構
- 日志系統
- 處理流數據
- linux
- 系統調用
- 常用IO函數
- 文件操作函數
- 文件描述符復制
- 目錄相關操作
- 時間相關函數
- 進程
- valgrind
- 進程通信
- 信號
- 信號產生函數
- 信號集
- 信號捕捉
- SIGCHLD信號
- 不可重入函數和可重入函數
- 進程組
- 會話
- 守護進程
- 線程
- 線程屬性
- 互斥鎖
- 讀寫鎖
- 條件變量
- 信號量
- 網絡
- 分層模型
- 協議格式
- TCP協議
- socket
- socket概念
- 網絡字節序
- ip地址轉換函數
- sockaddr數據結構
- 網絡套接字函數
- socket模型創建流程圖
- socket函數
- bind函數
- listen函數
- accept函數
- connect函數
- C/S模型-TCP
- 出錯處理封裝函數
- 多進程并發服務器
- 多線程并發服務器
- 多路I/O復用服務器
- select
- poll
- epoll
- epoll事件
- epoll例子
- epoll反應堆思想
- udp
- socket IPC(本地套接字domain)
- 其他常用函數
- libevent
- libevent簡介