GDB 進行調試 使用心得

來源:互聯網
上載者:User
1: 對於在應用程式中加入參數進行調試的方法:
   直接用 gdb app -p1 -p2 這樣進行調試是不行的。
   需要像以下這樣使用:
    #gdb app
    (gdb) r -p1 -p2
    或者在運行run命令前使用set args命令:
    (gdb) set args p1 p2
    可以用show args 命令來查看

2. 加入斷點:
   break <linenumber>
   break <funcName>
   break +offset
   break -offset
   (在當前行號的前面或後面的offset行停住。)

   break filename:linenum
   在源檔案filename的linenum行處停住。

   break filename:function
   在源檔案filename的function函數的入口處停住。

  break ... if
  ...可以是上述的參數,condition表示條件,在條件成立時停住。比如在迴圈境體中,可以設定     break if i=100,表示當i為100時停住程式。

3. 查看運行時的堆棧:
   使用bt命令

4. 列印某個變數的值:
   print val

5. 單步: n
   繼續運行: c
  step
  單步跟蹤,如果有函數調用,他會進入該函數。
  next
  同樣單步跟蹤,如果有函數調用,他不會進入該函數。很像VC等工具中的step over。後面可以加count也可以不加,不加表示一條條地執行,加表示執行後面的count條指令,然後再停住。
  set step-mode
  set step-mode on
  開啟step-mode模式,於是,在進行單步跟蹤時,程式不會因為沒有debug資訊而不停住。這個參數有很利於查看機器碼。
  set step-mod off
  關閉step-mode模式。
  finish
  運行程式,直到當前函數完成返回。並列印函數返回時的堆棧地址和傳回值及參數值等資訊。
  until 或 u
  當你厭倦了在一個迴圈體內單步跟蹤時,這個命令可以運行程式直到退出迴圈體。
 
6.在GDB中執行shell命令:
 在gdb環境中,你可以執行UNIX的shell的命令,使用gdb的shell命令來完成:
 eg. shell make
 
7. 運行環境
 可設定程式的運行路徑。
  show paths 查看程式的運行路徑。
  set environment varname [=value] 設定環境變數。如:set env USER=hchen
  show environment [varname] 查看環境變數。

8.觀察點(WatchPoint)
  觀察點一般來觀察某個運算式(變數也是一種運算式)的值是否有變化了,如果有變化,馬上停住程 序。我們有下面的幾種方法來設定觀察點:
  watch
   為運算式(變數)expr設定一個觀察點。一量運算式值有變化時,馬上停住程式。
  rwatch
   當運算式(變數)expr被讀時,停住程式。
  awatch
   當運算式(變數)的值被讀或被寫時,停住程式。
  info watchpoints
   列出當前所設定了的所有觀察點。

9. 維護breakpoint
   clear
    清除所有的已定義的停止點。
   clear func
    清除所有設定在函數上的停止點。
  delete [breakpoints] [range...]
  刪除指定的斷點,breakpoints為斷點號。如果不指定斷點號,則表示刪除所有的斷點。range 表示斷點號的範圍(如:3-7)。其簡寫命令為d。
  比刪除更好的一種方法是disable停止點,disable了的停止點,GDB不會刪除,當你還需要時,enable即可,就好像資源回收筒一樣。
  disable [breakpoints] [range...]
   disable所指定的停止點,breakpoints為停止點號。如果什麼都不指定,表示disable所有的停止 點。簡寫命令是dis.
  enable [breakpoints] [range...]
   enable所指定的停止點,breakpoints為停止點號。

10、程式變數
查看檔案中某變數的值:
file::variable
function::variable
可以通過這種形式指定你所想查看的變數,是哪個檔案中的或是哪個函數中的。例如,查看檔案f2.c中的全域變數x的值:
gdb) p 'f2.c'::x

查看數組的值
有時候,你需要查看一段連續的記憶體空間的值。比如數組的一段,或是動態分配的資料的大小。你可以使用GDB的“@”操作符,“@”的左邊是第一個記憶體的地址的值,“@”的右邊則你你想查看記憶體的長度。例如,你的程式中有這樣的語句:
int *array = (int *) malloc (len * sizeof (int));
於是,在GDB調試過程中,你可以以如下命令顯示出這個動態數組的取值:
p *array@len
如果是靜態數組的話,可以直接用print數組名,就可以顯示數組中所有資料的內容了。

11.輸出格式
一般來說,GDB會根據變數的類型輸出變數的值。但你也可以自訂GDB的輸出的格式。例如,你想輸出一個整數的十六進位,或是二進位來查看這個整型變數的中的位的情況。要做到這樣,你可以使用GDB的資料顯示格式:

x 按十六進位格式顯示變數。
d 按十進位格式顯示變數。
u 按十六進位格式顯示無符號整型。
o 按八進位格式顯示變數。
t 按二進位格式顯示變數。
a 按十六進位格式顯示變數。
c 按字元格式設定顯示變數。
f 按浮點數格式顯示變數。
(gdb) p i
$21 = 101
(gdb) p/a i
$22 = 0x65
(gdb) p/c i
$23 = 101 'e'
(gdb) p/f i
$24 = 1.41531145e-43
(gdb) p/x i
$25 = 0x65
(gdb) p/t i
$26 = 1100101

11.查看記憶體
使用examine命令(簡寫是x)來查看記憶體位址中的值。x命令的文法如下所示:
x/
n、f、u是可選的參數。
n 是一個正整數,表示顯示記憶體的長度,也就是說從當前地址向後顯示幾個地址的內容。
f 表示顯示的格式,參見上面。如果地址所指的是字串,那麼格式可以是s,如果地十是指令地址,那麼格式可以是i。
u 表示從當前地址往後請求的位元組數,如果不指定的話,GDB預設是4個bytes。u參數可以用下面的字元來代替,b表示單位元組,h表示雙位元組,w表示四位元組,g表示八位元組。當我們指定了位元組長度後,GDB會從指記憶體定的記憶體位址開始,讀寫指定位元組,並把其當作一個值取出來。

n/f/u三個參數可以一起使用。例如:
命令:x/3uh 0x54320 表示,從記憶體位址0x54320讀取內容,h表示以雙位元組為一個單位,3表示三個單位,u表示按十六進位顯示。

12.自動顯示

你可以設定一些自動顯示的變數,當程式停住時,或是在你單步跟蹤時,這些變數會自動顯示。相關的GDB命令是display。
display
display/
display/ expr
expr是一個運算式,fmt表示顯示的格式,addr表示記憶體位址,當你用display設定好了一個或多個運算式後,只要你的程式被停下來,GDB會自動顯示你所設定的這些運算式的值。

格式i和s同樣被display支援,一個非常有用的命令是:
display/i $pc

undisplay
delete display
刪除自動顯示,dnums意為所設定好了的自動顯式的編號。

disable display
enable display
disable和enalbe不刪除自動顯示的設定,而只是讓其失效和恢複。

info display
查看display設定的自動顯示的資訊。GDB會打出一張表格,向你報告當然調試中設定了多少個自動顯示設定,其中包括,設定的編號,運算式,是否enable。

13. 設定顯示選項
set print address
set print address on
開啟地址輸出,當程式顯示函數資訊時,GDB會顯出函數的參數地址。系統預設為開啟的,
show print address
查看當前地址顯示選項是否開啟。

set print array
set print array on
開啟數組顯示,開啟後當數組顯示時,每個元素佔一行,如果不開啟的話,每個元素則以逗號分隔。這個選項預設是關閉的。與之相關的兩個命令如下,我就不再多說了。

set print array off
show print array

set print elements
這個選項主要是設定數組的,如果你的數組太大了,那麼就可以指定一個來指定資料顯示的最大長度,當到達這個長度時,GDB就不再往下顯示了。如果設定為0,則表示不限制。

show print elements
查看print elements的選項資訊。

set print null-stop
如果開啟了這個選項,那麼當顯示字串時,遇到結束符則停止顯示。這個選項預設為off。

set print pretty on
如果開啟printf pretty這個選項,那麼當GDB顯示結構體時會比較漂亮。

14.關於顯示源碼list

以下是list命令的說明。

參數 說明
list filename:number 列出某檔案的第幾行,檔案是可省略的。
list [function] 列出某函數的程式碼
list 繼續印出程式碼
list - 印出上一次list的程式碼的前一段程式碼(類似向上翻動)
show listsize 顯示現在一次印出幾行
set listsize 設定一次印出幾行

備常用命令:
  1.常看源碼:list(l) 
  list <linenumber> 行號
  list <+offset> 當前行號的正位移
  list <-offset> 當前行號的負位移
  list <filename:linenumber> 哪個檔案的哪一行
  list <function> 函數名
  list <filename:function> 檔案的哪個函數
  list <*address> 程式運行時語句在記憶體中的地址

 2.設定斷點:break(b)
  break <function> 指定函數斷點
  break <linenumber> 指定行號斷點
  break <+offset/-offset> 當前行號的正/負位移
  break <filename:linenumber> 哪個檔案的哪一行
  break <*address> 運行中的記憶體位址
  break 不帶參數,下一條指令停止處
  break ... if <condition> 在運行中,當condition條件滿足時停止。
    eg. break if i=100 //當i=100時,立即停止
                 break foo if i=100   //斷點設定在foo中,斷點條件是i-100, 一點在函數foo中,i的值等於100,被停止。
 
                

 3.查看資訊:info
  info break 查看斷點資訊
    info locals 列印出當前函數中所有局部變數及其值
  info stack 查看棧中資訊
    info frame 更詳細的棧層地址資訊
  info args 查看參數資訊
  info registers/info all-registers 查看(所有)寄存器資訊
  info sources 查看項目的原始碼資訊

4.維護breakpoint:disable/enable/clear/delete
     disable(dis) 【breakpoints】 【range...】
       如果沒有參數,則停止所有的斷點,
     enable 【breakpoints】【range】
     clear <function>/<filename:function>/<linenum>/<filename:linenum>
        清楚已定義的停止點
      delete [breakpoints] [ranga...]
         刪除指定的斷點

5.恢複程式運行:continue(c)
  
  
6.until和finish
  until 跳出迴圈比較有用
    help finish
     Execute until selected stack frame returns.
     Upon return, the value returned is printed and put in the value history.
  finish 用來跳出函數比較有用。
    help until
     Execute until the program reaches a source line greater than the current
     or a specified location (same args as break command) within the current frame

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.