Ubuntu1804下安裝gdb與使用
1. Ubuntu1804下安裝gdb
sudo apt-get install gdb
查看安裝版本:
gdb --version
GNU gdb (Ubuntu 9.2-0ubuntu1~20.04) 9.2
Copyright (C) 2020 Free Software Foundation, Inc.
2.Ubuntu1804下gdb使用
1. GDB調試實例
- 首先創建一個C語言文件test.c
vim test.c
#include <stdio.h>
void ShowRevertNum(int iNum)
{
while (iNum > 10)
{
printf("%d", iNum % 10);
iNum = iNum / 10;
}
printf("%d\n", iNum);
}
int main(void)
{
int iNum;
printf("Please input a number :");
scanf("%d", &iNum);
printf("After revert : ");
ShowRevertNum(iNum);
}
上面的代碼可以逆序輸出一個整型數,比如輸入123,則輸出321。
- 使用gcc生成可執行文件並編譯運行
gcc -o test1 test.c
./test1
運行結果:

可以看到,在輸入100的時候輸出結果是錯誤的
- 下面開始用GDB進行調試, 進入gdb
gcc -o test1 -g test.c
gdb test1
-
輸入l查看代碼, 運行結果:

-
下斷點

-
發現問題

經過一步一步查看值的變化,發現iNum變成10了之后就不會再進入循環了,所以循環條件應該是大於等於10,我們要對錯誤進行修改,需要先退出gdb再進行對代碼的修改。
- 修改程序,解決問題

程序編譯運行后,輸入100,得到正確的結果
2. 內存出錯的GDB調試
Linux中,程序崩潰時,一般會產生core文件,記錄進程退出前的狀態,調試段錯誤問題,借助於該文件,可快速定位問題。
- 首先讓Linux系統產生core文件
新建一個C語言文件,輸入以下代碼:
#include<stdio.h>
int main(void)
{
int *p=0;
*p=1;
return 0;
}
然后輸入命令:
ulimit –c 100
讓系統產生core文件,運行程序,讓程序崩潰,產生core文件,使用gdb配合core文件,定位問題
3.gdb的常用命令
| 命令 | 結果 |
|---|---|
| file | 裝入想要調試的可執行文件 |
| kill | 終止正在調試的程序 |
| list | 列出產生執行文件的源代碼的一部分 |
| next | 執行一行源代碼但不進入函數內部 |
| step | 執行一行源代碼而且進入函數內部 |
| run | 執行當前被調試的程序 |
| c | 繼續運行程序 |
| quit | 終止gdb |
| watch | 使你能監視一個變量的值而不管它何時被改變 |
| backtrace | 棧跟蹤,查出代碼被誰調用 |
| 查看變量的值 | |
| make | 使你能不退出gdb就可以重新產生可執行文件 |
| shell | 使你能不離開gdb就執行UNIX shell命令 |
| whatis | 顯示變量或函數類型 |
| break | 在代碼里設斷點,這將使程序執行到這里時被掛起 |
| info break | 顯示當前斷點清單,包括到達斷點處的次數等 |
| info files | 顯示被調試文件的詳細信息 |
| info func | 顯示所有的函數名稱 |
| info local | 顯示當函數中的局部變量信息 |
| info prog | 顯示被調試程序的執行狀態 |
| delete [n] | 刪除第n個斷點 |
| disable[n] | 關閉第n個斷點 |
| enable[n] | 開啟第n個斷點 |
| ptype | 顯示結構定義 |
| set variable | 設置變量的值 |
| call name(args) | 調用並執行名為name,參數為args的函數 |
| Finish | 終止當前函數並輸出返回值 |
| return value | 停止當前函數並返回value給調用者 |
參考:
https://www.i4k.xyz/article/Linux7985/52399439
https://wizardforcel.gitbooks.io/100-gdb-tips/content/set-pagination-off.html
