1. 程式人生 > >linux下gdb的安裝與除錯

linux下gdb的安裝與除錯

1 安裝gdb

在Debian GNU/Linux Desktop中,應用程式 >> 附件 >> Root Terminal。輸入密碼,在Root許可權下的終端下輸入:

apt-get update

……

apt-get install  gdb

……

安裝時選擇y安裝好gdb。

2 gdb基本使用

用一般許可權的Termianl用vi編輯器編寫一個C程式main.c:

1 #include <stdio.h>

2

3

4 int main(void)

5 {

6         int a = 1;

7         int b = a;

8

9         printf("a = %d\tb =%d\n", a, b);

10        return 0;

11 }

(1) 在可執行檔案中加入原始碼資訊

這個過程用gcc來完成:

gcc  –g   main.c  –o  main

-g選項的作用是在可執行檔案中加入原始碼資訊,比如可執行檔案中第幾條機器指令對應原始碼的第幾行,但並不是把整個原始檔嵌入到可執行檔案中,而是在除錯時必須保證gdb能找到原始檔。


(2) 進入gdb

[email protected]:~/LinuxC$ gcc -g main.c -o main

[email protected]

:~/LinuxC$ gdb  main

GNU gdb (GDB) 7.0.1-debian

Copyright (C) 2009 Free SoftwareFoundation, Inc.

License GPLv3+: GNU GPL version 3 or later<http://gnu.org/licenses/gpl.html>

This is free software: you are free tochange and redistribute it.

There is NO WARRANTY, to the extentpermitted by law.  Type "showcopying"

and "show warranty" for details.

This GDB was configured as"i486-linux-gnu".

For bug reporting instructions, please see:

<http://www.gnu.org/software/gdb/bugs/>...

Reading symbols from/home/lly7/LinuxC/main...done.

(gdb)

gdb提供一個類似Shell的命令列環境,上面的(gdb)就是提示符,在提示符後面輸入gdb輸入的命令就可以實現其對應的功能。


(3) gdb除錯常用命令

[1] start

用start命令開始執行程式:

(gdb)start

Temporary breakpoint 1 at 0x80483cd: file main.c, line 6.

Starting program: /home/lly7/LinuxC/main

Temporary breakpoint 1, main () at main.c:6

6                int a = 1;

(gdb)

gdb提示準備執行main.c程式的第六行程式碼。然後繼續用(gdb)提示需要輸入的命令。


[2] 單步執行(n)

(gdb)start

Temporary breakpoint 1 at 0x80483cd: file main.c, line 6.

Starting program: /home/lly7/LinuxC/main

Temporary breakpoint 1, main () at main.c:6

6               int a = 1;

(gdb) n

7               int b = a;

(gdb) n

9               printf("a = %d\tb =%d\n", a, b);

(gdb) n

a =1   b = 1

10              return 0;

(gdb) quit

Adebugging session is active.

         Inferior 1 [process 6268] will bekilled.

Quitanyway? (y or n) y

[email protected]:~/LinuxC$

在start命令後,每輸入一個n就能夠單步執行一條語句(輸入一個命令後,直接回車表示最近輸入命令的含義)。當程式執行完時,可以輸入quit命令來推出gdb模式。


[3] gdb斷點除錯

[ break,display和continue ]

[email protected]:~/LinuxC$ gdb main

……

(gdb) start

……

(gdb) b 9

Breakpoint 2 at 0x80483dd: file main.c,line 9.

(gdb) c

Continuing.

Breakpoint 2, main () at main.c:9

9                printf("a= %d\tb = %d\n", a, b);

(gdb) display b

1: b = 1

(gdb) n

a = 1        b= 1

10              return0;

1: b = 1

(gdb)

11     }

1: b = 1

(gdb)

0xb7ea5ca6 in __libc_start_main () from/lib/i686/cmov/libc.so.6

(gdb)

Single stepping until exit from function__libc_start_main,

which has no line number information.

Program exited normally.

(gdb) quit

[email protected]:~/LinuxC$

gdb  main會進入main可執行程式的gdb模式,start命令就使程式準備執行程式中的第一條語句。b 9是break  9的簡寫(break的引數也可以以是某個函式名,表示在此函式處設定一個斷點),表示在程式第九行設定一個斷點。c是continue的縮寫,表示執行程式,程式會在設定斷點處停下來。displayb表示將b的值顯示出來(undisplay取消對變數的跟蹤),然後再輸入單步除錯命令n(next)就可以使程式繼續執行。

可見斷點有助於快速跳過沒有問題的程式碼,然後在有問題的程式碼上慢慢走慢慢分析,“斷點加單步”是使用偵錯程式的基本方法。至於應該在哪裡設定斷點,怎麼知道哪些程式碼可以跳過而哪些程式碼要慢慢走,也要通過對錯誤現象的分析和假設來確定,以前我們用printf列印中間結 果時也要分析應該在哪裡插入printf,列印哪些中間結果,除錯的基本思路是一樣的。

[ info ]

一次除錯可以設定多個斷點,用info命令可以檢視已經設定的斷點:

(gdb) b 8

Breakpoint 2 at 0x80483dd: file main.c, line 8.

(gdb) b 9

Note: breakpoint 2 also set at pc 0x80483dd.

Breakpoint 3 at 0x80483dd: file main.c, line 9.

(gdb) i breakpoints

Num    Type           Disp EnbAddress    What

2      breakpoint     keep y   0x080483dd in main at main.c:8

3      breakpoint     keep y   0x080483dd in main at main.c:9

(gdb)

[delete]

每個斷點都有一個編號(有的斷點行數不一樣,但地址卻一樣,有的地方不能夠設定斷點或者說與上一個設定的斷點等效),可以用編號指定刪除某個斷點:

(gdb) delete 3

(gdb) i breakpoints

Num     Type           Disp Enb Address    What

2       breakpoint     keep y  0x080483dd in main at main.c:8
有時候一個斷點暫時不用可以禁用掉而不必刪除,這樣以後想用的時候可以直接啟用,而不必重新從程式碼裡找應該在哪一行設斷點,這個過程用disable和enable來完成。

[條件斷點 break 和run]

gdb的斷點功能非常靈活,還可以設定斷點在滿足某個條件時才啟用,例如:

(gdb) b 9 if a == 2

Breakpoint 6 at0x80483dd: file main.c, line 9.

(gdb) i breakpoints

Num     Type           Disp Enb Address    What

6       breakpoint     keep y  0x080483dd in main at main.c:9

         stop only if a == 2

(gdb) r

The program beingdebugged has been started already.

Start it from thebeginning? (y or n) y

Starting program:/home/lly7/LinuxC/main

a = 1          b = 1

Program exitednormally.

(gdb)

r表示從頭開始執行程式,在a==2的條件下中斷才有效。a不等於2,所以中斷無效。


[4] gdb的觀察點(watch 和c)

斷點是當程式執行到某一程式碼行時中斷,而觀察點是當程式訪問某個儲存單元時中斷,如果我們不知道某個儲存單元是在哪裡被改動的,這時候觀察點尤其有用。

(gdb) start

……

(gdb) watch  b

Hardware  watch point 8: b

(gdb) c

Continuing.

Hardwarewatchpoint 8: b

Old value =-1208147980

Newvalue = 1

程式執行到b儲存單元,將此執行單元執行前後的值都顯示出來。


[5] 段錯誤

如果程式執行時出現段錯誤,用gdb可以很容易定位到究竟是哪一行引發的段錯誤。在gdb中執行,遇到段錯誤會自動停下來,這時可以用命令檢視當前執行到哪一行程式碼了。gdb顯示段錯誤出現在_IO_vfscanf函式中,用bt命令可以看到是哪一個函式呼叫了它。

[6] gdb基本命令

gdb有許多有用的命令如list(顯示原始碼),這樣就可以結合原始碼與除錯資訊更好的進行除錯。將gdb常用命令摘抄如下表:

命令

描述

backtrace(bt)

檢視各級函式呼叫及引數

finish

連續執行到當前函式返回為止,然後停下來等待命令

frame(f)  幀編號

選擇棧幀

info(i)  locals

檢視當前棧幀區域性變數的值

list(l)

列出原始碼,接著上次的位置往下列,每次列十行

list  行號

列出第幾行開始的原始碼

list  函式名

列出某個函式的原始碼

next(n)

執行下一行語句

print(p)

打印表達式的值,通過表示式的值可以修改變數的值或者呼叫函式

quit(q)

退出gdb除錯環境

set  var

修改變數的值

start

開始執行程式,停在main函式第一行語句前面等待命令

step(s)

執行下一行語句,如果有函式則進入到函式中

break(b)  行號

在某一行設定斷點

break   函式名

在某個函式開頭設定斷點

break… if…

設定條件斷點

continue(c)

從當前位置開始連續執行程式

delete breakpoints 斷點號

刪掉此號的斷點

display  變數名

跟蹤檢視某個變數,每次停下來都顯示它的值

disable  breakpoints 斷點號

禁用此斷點

enable  斷點號

啟用此斷點

info(i)  breakpoints

檢視當前設定了哪些斷點

run(r)

從頭開始連續執行程式

undisplay  跟蹤顯示行號

取消跟蹤顯示

watch

設定觀察點

info(i)   watchpoints

檢視當前設定了哪些觀察點

x

從某個位置開始列印儲存單元的內容,全部當成位元組來看,而不區分哪個位元組屬於哪個變數

disassemble

反彙編當前函式或者指定的函式,單獨用disassemble命令是反彙編當前函式,如果disassemble命令後面跟函式名或地址則反彙編指定的函式。

si

可以一條指令一條指令地單步除錯。

info  registers

可以顯示所有暫存器的當前值。在gdb中表示暫存器名時前面要加個$,例如p $esp可以列印esp暫存器的值。

set follow-fork-mode child/parent 設定gdb在fork之後跟蹤子程序/父程序
set  args  'command-line' 給執行的程式傳命令列引數
s(stepin) 進入子函式

相關推薦

Linux MySQL 安裝卸載

word stat client int etc dpkg init net 是否 參考博客:http://www.cnblogs.com/steven_oyj/archive/2010/05/24/1742808.html http://www.linuxidc.com/

linuxLAMP安裝配置

函數 rri osi ase live ins php expose share 安裝 一. Apache 安裝 yum install -y httpd啟動 /etc/init.d/httpd start備註:Apache啟動之後會提示錯誤: 正在啟動http

Redis在Linux安裝配置

conf eas etc 下載 127.0.0.1 基於內存 最新 ansi lin Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。 Redis是 NoSQL技術陣營中的一員。 說到

linuxFTP安裝配置

linux ftp pure-ftpdcd /usr/local/src/wget http://download.pureftpd.org/pub/pure-ftpd/releases/pure-ftpd-1.0.42.tar.bz2 (下載pureftp源碼包)tar jxvf pure-f

linuxrsync安裝配置

linux rsync rsync (同步數據,支持增量備份)使用方法:rsync -av 192.168.31.182:/tmp/1.txt /tmp/ (將服務器192.168.31.182中tmp文件夾下的1.txt文件拷貝到本機的tmp目錄下)rsync -av /tmp/1.tx

linux安裝redis Linuxredis安裝使用

Linux下redis安裝與使用        redis官網地址:http://www.redis.io/      最新版本:2.8.3主要看這塊  &nb

LinuxGDB安裝方法

前言 gdb是Linux環境下的程式碼除錯工具,為了能在linux環境下更有好的程式設計體驗。其安裝可謂是勢在必行。 安裝過程 安裝gdb的過程很簡單,具體步驟如下: step1:首先檢查系統中有沒有安裝過,有的話用一下命令解除安裝gdb舊版本 step2:安裝

Linuxredis安裝配置

一.下載路徑 我下載的是5.0版本 二.安裝 1.將redis-5.0.0.tar.gz檔案用ftp上傳到伺服器 2解壓  tar xzvf  redis-5.0.0.tar.gz  3.進入 /root/Redis/redis-5.0.0 路徑, 執行ma

linuxredis安裝PHP redis拓展安裝

安裝環境:1. 伺服器環境:linux / centos6.2檢視命令:cat /etc/redhat-release2. redis版本(http://download.redis.io/releases/redis-2.8.13.tar.gz)3. 預裝軟體(gcc ,

基礎教程:5、圖解LinuxJDK安裝環境變數配置

5.1 下載JDK8 (1)百度搜索“jdk8”第一條結果就是JDK下載地址 (2)接受協議,單擊下載 (3)JDK的上傳到Linux伺服器 首先,通過XShell連線遠端伺服器; 然後,單擊工具欄中的xftp圖示,如下圖所示; 最後,將已經下載的Linux版的JDK8軟體包檔案

Linuxlibevent安裝示例

1.先用:ls -al /usr/lib | grep libevent  檢視是否已安裝,如果已安裝且版本比較低,則先通過:rpm -e libevent —nodeps 進行解除安裝。 3.切換到解壓後的 libevent 主目錄:cd libevent-2

weblogic在Linux安裝配置

一、環境linux版本:RedHat 6.7  二、安裝JDK 將JDK包上傳至根目錄即可,[[email protected] /]# tar -xvf  jdk-8u161-linux-x64.tar.gz [[email protected] /]#

linuxJDK安裝主機名設定

刪除自帶openJDK rpm -qa | grep java rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.50.1.11.5.el6_3.x86_64 rpm -e --nodeps java-1.7.0-openjdk-1.

Linux環境Nginx安裝除錯以及PHP安裝

linux版本:64位CentOS 6.4 Nginx版本:nginx1.10.2 php版本:php5.5.28 1.編譯安裝Nginx # wget http://nginx.org/download/nginx-1.10.2.tar.gz # tar -zv

Nginx在Linux安裝配置,以及遇到問題的解決整理

2、將下載的資源上傳到/usr/local目錄下,注意:如果遇到檔案無法移動或報沒有許可權,應該是賬號不是root使用者,可以使用su root命令切換。 3、安裝nginx,在/usr/local下解壓nginx-1.10.0.tar.gz,並進入nginx-1.10.

LinuxKeepalived安裝配置

一、簡介         負載平衡是一種在真實伺服器叢集中分配IP流量的方法,可提供一個或多個高度可用的虛擬服務。在設計負載均衡拓撲時,重要的是要考慮負載均衡器本身的可用性以及它背後的真實伺服器。用C編寫的類似於layer3, 4 & 7交換機制軟體,具備我們平時說

linuxnginx安裝設定開機啟動

http://www.myhack58.com/Article/sort099/sort0102/2015/66341.htm 環境準備yum -y install gcc gcc-c++ autoconf automake make yum -y install zli

Nginx在Linux安裝配置

這是本人在安裝與配置nginx時所做的一些記錄,可能有些地方寫得不夠詳細。 nginx依賴以下一些軟體庫,在安裝之前請確保安裝了這些軟體庫,它們包括:gcc,openssl,zlib,pcre(可通過rpm -q命令查詢是否已安裝),其中前三個庫可通過系統盤進行安裝,這裡僅

Zookeeper在Linux安裝配置

一共三個節點 (zookeeper伺服器叢集規模不小於3個節點),要求伺服器之間系統時間保持一致。 2. 解壓zookeeper-3.4.5.tar.gz到/usr/local 下  比如安裝包在根目錄/install下 cd /install tar -zxvf  

linuxgdb單步除錯

用 GDB 除錯程式 GDB 概述 ———— GDB 是 GNU開源組織釋出的一個強大的 UNIX下的程式除錯工具。或許,各位比較喜歡那種圖形介面方式的,像 VC、 BCB等 IDE的除錯,但如果你是在 UNIX平臺下做軟體,你會發現 GDB這個除錯工具有比