gdb

雖然咱們很是不肯意認可,但軟件中仍是有錯誤存在。
調試是程序員必修的課程,若是不懂調試,那麼往後寫程序的時候修正代碼bug會付出大量的時間和精力。
gdb即GNU debugger。
 
 
gcc中提到的,gcc編譯選項-g,這樣生成的目標代碼中就添加了調試信息。
gcc -g –o hello hello.c
gdb完成的大部分工做均可以用不多的命令集合完成。
 
查看是否安裝了GDB
 rpm -qa | grep gdb
 
redhat6.3默認是不安裝gdb的,若是安裝從系統安裝盤中找到gdb-7.2-56.el6.i686.rpm這個文件
執行如下命令

rpm -ivh gdb-7.2-56.el6.i686.rpm程序員

 

啓動gdb
  –gdb 程序名 [corefile]
corefile是可選的,但能加強gdb的調試能力。
Linux默認是不生成corefile的,因此須要在.bashrc文件中添加

ulimit -c unlimitedbash

 

一個有錯的程序
#include <stdio.h>
void test(void)
{
    int *I = NULL;
    *i = 2;
}

int main(void)
{
    printf(「hello world\n」);
    test();
    return 0;
}
編譯這個程序

gcc –g –o hello hello.c函數

運行hello

Segmentation fault (core dumped)spa

程序崩潰

ls翻譯

core.3563  hello  hello.cdebug

咱們看到除了hello文件和hello.c文件以外多了core文件
 
啓動gdb

gdb hello core.3563指針

若是你不喜歡一大堆的軟件信息,能夠經過-q參數關閉軟件信息

gdb -q hello core.3563調試

#0  0x08048394 in test () at hello.c:5code

5               *i = 2;blog

能夠看到gdb經過core告訴你,程序哪條語句出現問題
 
 
咱們作的第一件事就是在gdb環境中運行這個程序

gdb hello

urun命令。

Starting program: /home/test/1/hello

hello world

 

Program received signal SIGSEGV, Segmentation fault.

0x08048394 in test () at hello.c:5

5               *i = 2;

gdb不但能顯示出錯行號,還能說明出錯出現時的內存地址,這個也是潛在的有用信息。
 
 
test函數到底出了什麼問題?
where命令,顯示致使段錯誤的執行函數樹

#0  0x08048394 in test () at hello.c:5

#1  0x080483be in main () at hello.c:11

問題出在hello.c文件的第5行。
 
 
知道函數出錯行的上下文對調試程序是頗有幫助的。
list [m,n],m,n是要顯示包含錯誤首次出現位置的起始行和結尾行。不帶參數的list將顯示附近的10行代碼

1       #include <stdio.h>

2       void test(void)

3       {

4               int *i = NULL;

5               *i = 2;

6       }

7

8       int main(void)

9       {

10              printf("hello world\n");

#0  0x08048394 in test () at hello.c:5

#1  0x080483be in main () at hello.c:11

 

gdb最有用的功能之一就是它能夠顯示被調試程序中任何表達式、變量的值。
print 變量,表達式。
print ‘file’::變量,表達式,‘’是必須的,以便讓gdb知道指的是一個文件名。
print funcname::變量,表達式

(gdb) print i

$1 = (int *) 0x0

顯示指針變量i的值爲0。
whatis 命令能夠告訴你變量的類型, ptype 告訴你結構的定義。

(gdb) whatis i

type = int *

 
break命令設置斷點
  –break linenum
  –break funcname
  –break filename:linenum
  –break filename:funcname
 
退出gdb,從新進入調試模式
gdb -q hello

(gdb) break 4

Breakpoint 1 at 0x804838a: file hello.c, line 4.

(gdb) run

Starting program: /home/test/1/hello

hello world

 

Breakpoint 1, test () at hello.c:4

4               int *i = NULL;

ugdb在第4行中止。
 
 
continue命令從斷點之後繼續執行。
delete刪除一個斷點。
若是設置了不少斷點,忘記了哪些斷點已經觸發,可使用info break。

(gdb) info break

Num     Type           Disp Enb Address    What

1       breakpoint     keep y   0x0804838a in test at hello.c:4

        breakpoint already hit 1 time

 
改變一個變量的值。

set variable varname = value

varname是變量名稱,value是變量的新值。
 
 
單步調試
step命令
  –當遇到一個函數的時候,step將進入函數,每次執行一條語句,至關於step into
next命令
  –當遇到一個函數的時候,next將執行整個函數,至關於step over
return [value]命令
  –中止執行當前函數,將value返回給調用者,至關於step return
若是須要重複執行一條命令,不須要每次都鍵入命令,gdb記住了最後一個被執行的命令,只要簡單的按enter鍵就能夠重複執行最後的命令
 
相關文章
相關標籤/搜索