linux GDB調試

原文位於:http://www.cnblogs.com/shipfi/archive/2008/08/04/1260293.html

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章