Linux使用GDB調試總結

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 設定一次打印幾行

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