在使用 gdb 除錯程式時,我們會經常需要展示程式中的**,但是列印出的**可能和原始檔中的不同,為什麼這麼說呢?我們在《gdb準備除錯階段》章節中講到過 gcc 編譯器允許-g和-o選項同時使用,也就是說 gdb 可以除錯優化後的程式。優化的程式中會在原始檔中的某些地方改變,所以和編寫的檔案和程式執行的檔案不一致是常見的。
在 gdb 中展示出**行有很多的好處,其中最主要的好處就是方便除錯。例如,我們需要在程式中的某一處設定斷點,如果沒有**展示,會很難實現斷點的準確定位。
list命令
展示程式中的**行要使用 list 命令,命令的格式有很多,下面就是對這個命令的詳細介紹。
1.不帶引數的 list 命令的使用表示從當前行向下列印,預設顯示 10 行**。
2.標記中心行位置列印**,命令格式展示如下:
list [location]
(gdb) list 2 //以第二行為中心行開始列印。
(gdb) list func //以func函式所在行為中心行列印。
(gdb) list *0x1234 //以標記位址所在行為中心行列印。
3.指明 list 列印的開始位置和結束位置,命令格式展示如下:
list [first] , [last]
first 為列印的起始位置,last 表示列印的結束位置。如果不指明 first 的值表示從當前行開始列印。例項:
(gdb) list 1 , 5 //列印從第一行開始,到第五行結束。
(gdb) list , 5 //列印從當前行開始,到第五行結束。
4.list 命令從當前行開始偏移,偏移量可以自己指定。命令格式展示如下:
list (+/-)[num]
num 表示當前行的偏移量,+ 表示向下偏移,- 表示向上偏移。例項:
(gdb) list +2 //從當前行向下偏移 2 行
(gdb) list -2 //從當前行向上偏移 2 行
注意:如果程式執行到斷點處使用 list 命令,gdb 會將斷點處所在行設定為中心行列印**。
設定 list 列印行數
在 gdb 中使用 list 命令預設列印的**行數為 10 行,其實**列印的行數是可以更改的,我們可以通過設定 gdb 中的 listsize 實現,命令格式如下:
set listsize [num]
num 表示設定的**列印的行數。例項:
set listsize 5 //設定列印的行數為 5 行。
set listsize 6 //設定列印的行數為 6 行。
顯示 listsize 的值可以使用命令:
show listsize
綜合除錯例項
檔案**展示:
#include
#include
int add(int a,int b)
return a + b;
int main(void)
int a = 10;
int b = 20;
int c;
c = add(a,b);
printf("%d",c);
return 0;
gdb除錯:
(gdb) l
1#include
2#include
4int add(int a,int b)
59int main(void)
10(gdb) list -2
14c = add(a,b);
15printf("%d",c);
16return 0;
17}
cgdb 一起邊看原始碼邊除錯gdb吧
cgdb是一款輕量級的基於gdb的命令列視覺化工具,關係大致如下 儘管gdb本身可以通過layout src的命令顯示原始碼布局,但是其功能還是過於簡陋。使用cgdb並不需要你重新去學習過多額外的命令,你依然可以像原來使用gdb一樣去使用它。直接系統安裝 可能非最新版本 sudo apt get i...
cgdb原始碼安裝及錯誤
linux版本 linux version 2.6.32 431.el6.x86 64 gcc version 4.4.7 20120313 red hat 4.4.7 4 gcc 1 smp fri nov 22 03 15 09 utc 2013 wget 安裝步驟 1 tar zvxf cgd...
使用gdb除錯nginx原始碼
葉劍峰 包含鏈結 這裡就不說了,谷歌一搜一堆,這裡推薦一篇文章 gdb 命令詳細解釋 請重點看一下step,run,break,list,info,continue命令 這裡使用nginx 1.0.14 src是源 auto資料夾是configure執行時候的各種命令集合 由於gdb需要gcc的時候...