ok,我們今天學習gdb的安裝和使用
調試器-gdb/cgdb使用
VS、VScode編寫的代碼一般都是release格式的,gdb 的格式一般是debug
換成debug模式命令?:-g
gdb會記錄最新的一條命令,直接回車就是默認執行該命令
一個調試周期下,斷點編號遞增,刪除斷點,之后的斷點編號也是遞增
樣例代碼
// mycmd.c#include <stdio.h>int Sum(int s, int e){int result = 0;for(int i = s; i <= e; i++){result += i;}return result;}int main(){int start = 1;int end = 100;printf("I will begin\n");int n = Sum(start, end);printf("running done, result is: [%d-%d]=%d\n", start, end, n);return 0;}
預備
程序的發布?式有兩種,debug 模式和 release 模式, Linux gcc/g++ 出來的?進制程序,默認是
release 模式。
VS、VScode編寫的代碼一般都是release格式的,gdb 的格式一般是debug
換成debug模式命令?:-g
要使?gdb調試,必須在源代碼?成?進制程序的時候,加上 -g?選項,如果沒有添加,程序?法被編譯
$ gcc mycmd.c -o mycmd # 默認模式,不?持調試
$ file mycmdmycmd: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically
linked, interpreter /lib64/ld-linux-x86-64.so.2,
BuildID[sha1]=82f5cbaada10a9987d9f325384861a88d278b160, for GNU/Linux
3.2.0, not stripped$ gcc mycmd.c -o mycmd -g # debug模式
$ file mycmdmycmd: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically
linked, interpreter /lib64/ld-linux-x86-64.so.2,
BuildID[sha1]=3d5a2317809ef86c7827e9199cfefa622e3c187f, for GNU/Linux
3.2.0, with debug_info, not stripped
常見使用
- 開始: gdb binFile
- 退出: ctrl + d 或 命令 quit 調試命令
gdb會記錄最新的一條命令,直接回車就是默認執行該命令
一個調試周期下,斷點編號遞增,刪除斷點,之后的斷點編號也是遞增
命令 | 作用 | 樣例 |
list / l | 顯示源代碼,從上次位置開始,每次列出 10行 | list / l 10 |
list / l? 函數名 | 列出指定函數的源代碼 | list / l main |
list / l? ???文件名: 行號 | 列出指定文件的源代碼 | list / l mycmd. c : 1 |
r / run | 從程序開始連續執行 | run |
n / next | 單步執行,不進入函數內部 | next |
s / step | 單步執行,進入函數內部 | step |
break / b??[文件名:] 行號 | 在指定行號設置斷點 | break 10 break test. c:10 |
break / b 函數名 | 在函數開頭設置斷點 | break main |
info break / b | 查看當前所有斷點的信息 | info break |
finish | 執行到當前函數返回,然后停止 | finish |
print / p 表達式 | 打印表達式的值 | print start + end |
p 變量 | 打印指定變量的值 | p x |
set var?? 變量=值 | 修改變量的值 | set var i=10 |
continue / c | 從當前位置開始連續執行程序 | continue |
delete / d breakpoints | 刪除所有斷點 | delete breakpoints |
delete / d breakpoints n | 刪除序號為n的斷點 | delete breakpoints 1 |
disable breakpoints | 禁用所有斷點 | disable breakpoints |
enable breakpoints | 啟用所有斷點 | enable breakpoints |
info / i breakpoints | 查看當前設置的斷點列表 | info breakpoints |
display 變量名 | 跟蹤顯示指定變量的值 (每次停止時) | display x |
undisplay 編號 | 取消對指定編號的變量的跟蹤顯示 | undisplay 1 |
until X?行號 | 執行到指定行號 | until 20 |
backtrace / bt | 查看當前執行棧的各級函數調用及參數 | backtrace |
info / i locals | 查看當前棧幀的局部變量值 | info locals |
quit | 退出GDB調試器 | quit |
斷點 + finish + until + c:快速定位問題
如果想看到代碼調試,可以使用cgdb
下載代碼:
sudo yum install -y cgdb
watch
執?時監視?個表達式(如變量)的值。如果監視的表達式在程序運?期間的值發?變化,GDB會暫 停程序的執?,并通知使?者
watch result ,在之后的調試的過程中如果監視的內容發生改變,則會自動顯示出來
(gdb) watch result
set var確定問題原因
set var 可以改變想要改變的變量的值,根據結果判斷問題的原因
(gdb) set var flag=1
條件斷點
b n if x==y 設置條件斷點,當系統經過斷點停下時,就可以判斷現在的條件
(gdb) b 9 if i == 30 # 9是?號,表?新增斷點的位置
給已有斷點新增條件
(gdb) b 9 #我們在第9?新增?個斷點,?來開始測試(gdb) condition 2 i==30 #給2號斷點,新增條件i== 30
- 條件斷點添加常?兩種?式:1.新增2.給已有斷點追加?
- 注意兩者的語法有區別,不要寫錯了。?
- 新增:b?號/?件名:?號/函數名ifi==30(條件)
- 給已有斷點追加:condition2i==30,其中2是已有斷點編號,沒有 if
少年沒有烏托邦,心向遠方自明朗!
如果這個博客對你有幫助,給博主一個免費的點贊就是最大的幫助?
歡迎各位點贊,收藏和關注哦?
如果有疑問或有不同見解,歡迎在評論區留言?
后續會繼續更新大連理工大學相關課程和有關Linux的內容和示例
點贊加關注,學習不迷路,好,本次的學習就到這里啦!!!
ok,我們下次再見!