【C语言基础】gdb调试工具的使用
gdb調(diào)試教程
快速入門
要想快速入門gdb調(diào)試,可以直接翻閱基本案例:采內(nèi)存
介紹
GDB是一個(gè)由GNU開源組織發(fā)布的、UNIX/LINUX操作系統(tǒng)下的、基于命令行的、功能強(qiáng)大的程序調(diào)試工具。 對(duì)于一名Linux下工作的c/c++程序員,gdb是必不可少的工具
常用指令
- shell 指令
| gdb | gdb +${exe} | 對(duì)生成的可執(zhí)行文件進(jìn)行調(diào)試 |
| gdb -q | gdb -q +${exe} | 對(duì)生成的可執(zhí)行文件進(jìn)行調(diào)試 表示不打印gdb版本信息,界面較為干凈; |
- gdb指令
| 斷點(diǎn)設(shè)置 | ||
| break | break +Line<br>break+{Line}<br>break +Line<br>break+{func} | 可以對(duì)行號(hào)和函數(shù)進(jìn)行設(shè)置斷點(diǎn) |
| 程序運(yùn)行 | ||
| run | run / r | 首次運(yùn)行程序,運(yùn)行到第一個(gè)斷點(diǎn) |
| continue | continue / c | 繼續(xù)運(yùn)行程序,運(yùn)行到下一個(gè)斷點(diǎn) |
| next | next / n | 單步跳過(guò),(執(zhí)行一步程序,遇到函數(shù),直接完成函數(shù)操作,不會(huì)進(jìn)入函數(shù)) |
| step | step / s | 單步進(jìn)入,(執(zhí)行一步程序,遇到函數(shù)會(huì)進(jìn)入) |
| until | until / u + ${Line} | 跳出循環(huán)體,并跳到循環(huán)體外部的某一行 |
| 變量查看 | ||
| print +變量 | 打印變量的值 | |
| whatis | whatis +變量 | 打印變量的類型 |
| quit | quit / q | 退出 |
| 可視化 | ||
| layout src | 調(diào)試的時(shí)候同時(shí)顯示源代碼窗口,但是必須run之后才會(huì)顯示 | |
基本案例:采內(nèi)存
0. 源碼
本案例以下文段錯(cuò)誤(采內(nèi)存)源碼進(jìn)行介紹如何進(jìn)行g(shù)db調(diào)試。
通常在復(fù)雜程序調(diào)用中,指針的操作容易導(dǎo)致編程人員對(duì)內(nèi)存空間的使用造成困擾和混亂,因此指針操作是導(dǎo)致內(nèi)存異常問(wèn)題最為常見的因素也是最難定位的因素。
源代碼如下:
在本案例中,main函數(shù)里的my_user指針在addUser函數(shù)里進(jìn)行資源申請(qǐng)。雖然成功申請(qǐng)到了堆中的空間。但是因?yàn)閙y_user是作為參數(shù)傳入,因此在函數(shù)返回時(shí),my_user又重新指向了NULL,而非堆上的空間地址導(dǎo)致運(yùn)行發(fā)生段錯(cuò)誤。
#include <stdio.h> #include <stdlib.h>typedef struct User {int id;int age; } User;void addUser(User *user, int id, int age) {user = (User *)malloc(sizeof(User));user->id = id;user->age = age;printf("id = %d, age = %d\n", user->id, user->age); }int main() {printf("gdb demo\n");User *my_user = NULL;addUser(my_user, 10, 20);printf("id = %d, age = %d\n", my_user->id, my_user->age);return 0; }1. 編譯
要想使用gdb調(diào)試功能,需要在gcc編譯器添加-g參數(shù),或者在cmake里編譯成debug模式。
>> gcc -g -o main main.c2. 打開gdb調(diào)試
>> gdb main >> gdb -q main # 表示不打印gdb版本信息,界面較為干凈;3. gdb 設(shè)置斷點(diǎn)
- break
- info breakpoints
4. 運(yùn)行
- run
- continue
- next
- step
從上文可以看出是23行打印發(fā)生了報(bào)錯(cuò),那么如何確定23行的打印發(fā)生了什么具體錯(cuò)誤,可以使用print和whatis進(jìn)行打印顯示。
5. 打印和顯示變量信息
- print 打印變量的值
- whatis 打印變量的類型
總結(jié)
以上是生活随笔為你收集整理的【C语言基础】gdb调试工具的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 有人不会使用计算机的反义,现代汉语练习题
- 下一篇: 删除一个无头单链表的非尾节点(C语言)