【C语言基础】gdb调试工具的使用
生活随笔
收集整理的這篇文章主要介紹了
【C语言基础】gdb调试工具的使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
gdb調試教程
快速入門
要想快速入門gdb調試,可以直接翻閱基本案例:采內存
介紹
GDB是一個由GNU開源組織發布的、UNIX/LINUX操作系統下的、基于命令行的、功能強大的程序調試工具。 對于一名Linux下工作的c/c++程序員,gdb是必不可少的工具
常用指令
- shell 指令
| gdb | gdb +${exe} | 對生成的可執行文件進行調試 |
| gdb -q | gdb -q +${exe} | 對生成的可執行文件進行調試 表示不打印gdb版本信息,界面較為干凈; |
- gdb指令
| 斷點設置 | ||
| break | break +Line<br>break+{Line}<br>break +Line<br>break+{func} | 可以對行號和函數進行設置斷點 |
| 程序運行 | ||
| run | run / r | 首次運行程序,運行到第一個斷點 |
| continue | continue / c | 繼續運行程序,運行到下一個斷點 |
| next | next / n | 單步跳過,(執行一步程序,遇到函數,直接完成函數操作,不會進入函數) |
| step | step / s | 單步進入,(執行一步程序,遇到函數會進入) |
| until | until / u + ${Line} | 跳出循環體,并跳到循環體外部的某一行 |
| 變量查看 | ||
| print +變量 | 打印變量的值 | |
| whatis | whatis +變量 | 打印變量的類型 |
| quit | quit / q | 退出 |
| 可視化 | ||
| layout src | 調試的時候同時顯示源代碼窗口,但是必須run之后才會顯示 | |
基本案例:采內存
0. 源碼
本案例以下文段錯誤(采內存)源碼進行介紹如何進行gdb調試。
通常在復雜程序調用中,指針的操作容易導致編程人員對內存空間的使用造成困擾和混亂,因此指針操作是導致內存異常問題最為常見的因素也是最難定位的因素。
源代碼如下:
在本案例中,main函數里的my_user指針在addUser函數里進行資源申請。雖然成功申請到了堆中的空間。但是因為my_user是作為參數傳入,因此在函數返回時,my_user又重新指向了NULL,而非堆上的空間地址導致運行發生段錯誤。
#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調試功能,需要在gcc編譯器添加-g參數,或者在cmake里編譯成debug模式。
>> gcc -g -o main main.c2. 打開gdb調試
>> gdb main >> gdb -q main # 表示不打印gdb版本信息,界面較為干凈;3. gdb 設置斷點
- break
- info breakpoints
4. 運行
- run
- continue
- next
- step
從上文可以看出是23行打印發生了報錯,那么如何確定23行的打印發生了什么具體錯誤,可以使用print和whatis進行打印顯示。
5. 打印和顯示變量信息
- print 打印變量的值
- whatis 打印變量的類型
總結
以上是生活随笔為你收集整理的【C语言基础】gdb调试工具的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有人不会使用计算机的反义,现代汉语练习题
- 下一篇: linux环境下安装多个任意版本的pyt