1. 程式人生 > >linux下如何使用gdb除錯

linux下如何使用gdb除錯

gdb是linux下非常好用的一個除錯工具,雖然它是命令列模式的除錯工具,但是它的功能強大到你無法想象,這裡簡單介紹下gdb下常用的命令。

首先編譯生成可執行檔案(這裡的test.c是一個簡單的求前n項和的程式)。

gcc -g test.c -o test(-g選項告訴gcc在編譯程式時加入除錯資訊)。
接下來可以這樣。

gdb test

然後你就會看到出現好多資訊在螢幕上,大致說的是gdb的一些版本資訊說明之類的,但是它對你除錯程式沒用呀,所以,你可以加上-q選項,不輸出它們。

gdb -q test

[email protected]:~$ gdb -q test
Reading symbols 
from test...done. (gdb)

有沒有覺得這個世界一下子清淨了許多。

也可以先進入gdb模式,然後再載入檔案。

[email protected]:~$ gdb -q
(gdb) file test
Reading symbols from test...done.
(gdb) 

好了,現在開始除錯了,但是我還想看看我的程式碼怎麼辦,gdb提供了一條命令,可以讓你的程式顯示出來。

複製程式碼
(gdb)                                       //list預設一次顯示10行
1    #include<stdio.h>
2    int func(int
n) 3 { 4 int i; 5 int sum=0; 6 for(i=0;i<n;i++) 7 { 8 sum+=i; 9 } 10 return sum; (gdb) //直接輸入回車重複上次命令,顯示接下來的10行 11 } 12 int main() 13 { 14 int n; 15 printf("請輸入n的值"); 16 scanf("
%d",&n); 17 printf("1+2+..+%d=%d",n,func(n)); 18 return 0; 19 } (gdb)
複製程式碼

list預設引數可以用show listsize來檢視,如果感覺10行太多或者太少,還可以用set listsize <count>來更改。

list 還可以加上其他引數,比如:
list 5,10   顯示第5行到第10行的程式碼;

list func   顯示func函數週圍的程式碼,顯示範圍和list引數有關;

list test.c:5,10  顯示原始檔test.c第5行到第10行的程式碼,一般用於除錯含多個原始檔的程式。

gdb 還支援字串查詢,search str,從當前行開始,向前查詢含str的字串;

reverse-search str,從當前行開始,向後查詢含str的字串。

現在你的螢幕應該被佔滿了吧?想清空螢幕,可是還在gdb裡面呀,怎麼辦?其實,gdb也支援執行linux命令的,可以在gdb的提示符中,輸入shell,然後在輸入你需要的命令就可以了

(gdb) shell clear

這樣也能達到清屏的效果。

看了程式的程式碼,感覺第6行程式碼可能有點問題,現在就需要我就需要設定一個斷點,讓程式停在第6行之前。

(gdb) break 6
Breakpoint 1 at 0x80484c8: file test.c, line 6.
(gdb) 

下面一行的 資訊,1說明我設定的這個斷點是第一個斷點,斷點所在記憶體地址為0x80484c8,它在檔案test.c的第6行。

gdb還可以以條件表示式設定斷點。

(gdb) break 7 if n==6
Breakpoint 2 at 0x80484d1: file test.c, line 7.
(gdb) 

這個斷點的含義是,如果n的值為6,則程式執行到第7行停止。

當然,還可以直接在某個函式處設定斷點;直接break 函式名就可以了,

然後我們想看下設定的斷點資訊,可以使用info breakpoints命令。

複製程式碼
(gdb) info breakpoints
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x080484c8 in func at test.c:6
2       breakpoint     keep y   0x080484d1 in func at test.c:7
    stop only if n==6
4       breakpoint     keep y   0x080484c1 in func at test.c:5
(gdb) 
複製程式碼

Num表示斷點的編號;Type表示斷點的斷點的型別,第二個斷點型別還加上了條件;Disp表示中斷點在執行一次之後是否失去作用,dis為是,keep為不是;Enb表示當前中斷點是否有效,y為是,n為否;Address表示中斷點所處的記憶體地址;What指出斷點所處的位置。

如果不需要程式在該斷點暫停時,有兩種方法,一種是使該斷點失效,一種是直接刪除該斷點。

複製程式碼
(gdb) disable 1
(gdb) info breakpoints
Num     Type           Disp Enb Address    What
1       breakpoint     keep n   0x080484c8 in func at test.c:6
2       breakpoint     keep y   0x080484d1 in func at test.c:7
    stop only if n==6
3       breakpoint     keep y   0x080484c1 in func at test.c:5
(gdb) 
複製程式碼

可以看到,第一個斷點的Enb變為n了,表示該斷點已經無效了,如果需要恢復,可以使用enable命令。這裡需要注意的是,disable後面的引數為斷點的編號。而不是行號。

直接刪除該斷點,可以使用clear命令和delete命令。

(gdb) clear 6
已刪除的斷點 1 
(gdb) 

clear命令後面的引數為設定斷點的行號,clear後面引數還可以加設定斷點的函式名。

delete命令後面的引數為斷點的編號;可以一次刪除多個斷點,斷點編號之間用空格隔開;如果delete後沒有引數,預設刪除所以斷點,會給出提示選擇是否操作。

(gdb) delete
刪除所有斷點嗎? (y or n) 

斷點設定好了,現在就可以除錯了,

複製程式碼
(gdb) run                                                //開始執行程式
Starting program: /home/wang/test 
請輸入n的值10

Breakpoint 1, func (n=10) at test.c:6     //設定的第一個斷點,程式在第6行暫停
6        for(i=0;i<n;i++)
(gdb) continue                                      //讓程式繼續執行,直到下個斷點或者結束
Continuing.

Breakpoint 2, func (n=10) at test.c:8    //第二個斷點設定的是i==6時停止
8                sum+=i;
(gdb) print i                                          //用print命令打印出i的值
$1 = 6
(gdb) print sum
$2 = 15
(gdb) next                                          //繼續執行下一條語句,只執行一條。
6        for(i=0;i<n;i++)
(gdb) next    
8                sum+=i;
(gdb) print i
$3 = 7
(gdb) continue    
Continuing.
1+2+..+10=45[Inferior 1 (process 23636) exited normally]    
(gdb) quit                                             //退出gdb除錯
                                            
複製程式碼

 上面出現了很多命令,下面就來說說都是怎麼用的。

run,開始執行程式;

continue,程式暫停時繼續執行程式的命令;

print 變數名或表示式,列印該變數或者該表示式的值。whatis 變數名或者表示式,可以顯示該變數或表示式的資料型別。

print  變數=值,這種形式還可以給對應的變數賦值;類似的還有set variable 變數=值。作用和用print賦值相同。

next,繼續執行下一條語句;還有一條命令step,與之類似,不同的是,當下一條語句遇到函式呼叫的時候,next不會跟蹤進入函式,而是繼續執行下面的語句,而step命令則會跟蹤進入函式內部。

複製程式碼
(gdb) run
Starting program: /home/wang/test 

Breakpoint 1, main () at test.c:16
16        scanf("%d",&n);
(gdb) next
請輸入n的值10  
17        printf("1+2+..+%d=%d",n,func(n));
(gdb) next                                             //next命令直接執行下一行,沒有進入func函式  
18        return 0;
(gdb)
複製程式碼複製程式碼複製程式碼
(gdb) run
Starting program: /home/wang/test 

Breakpoint 1, main () at test.c:16
16        scanf("%d",&n);
(gdb) n
請輸入n的值10
17        printf("1+2+..+%d=%d",n,func(n));
(gdb) step                  //step命令跟蹤進入了func函式  
func (n=10) at test.c:5
5        int sum=0;
(gdb) 
複製程式碼複製程式碼

 還有nexti和stepi命令,這兩個是單步執行一條機器指令,比如(i=0;i<n;i++)這條語句需要輸入多個nexti才能執行完;兩個的區別和上面相同。

quit,退出gdb除錯,如果除錯中想要退出,可以直接輸入該命令,會出現提示選擇是否退出。kill命令,結束當前程式的除錯,(不會退出gdb)。

(gdb) quit
A debugging session is active.

    Inferior 1 [process 32229] will be killed.

Quit anyway? (y or n) 

相關推薦

linuxgdb除錯檢視原始碼

 GDB是GNU開源組織釋出的一個強大的UNIX下的程式除錯工具。或許,各位比較喜歡那種圖形介面方式的,像VC、BCB等IDE的除錯,但如果你是在UNIX平臺下做軟體,你會發現GDB這個除錯工具有比VC、BCB的圖形化偵錯程式更強大的功能。所謂“寸有所長,尺有所短”就是這個道理。 &nb

LinuxGDB除錯簡介

Linux下C/C++除錯工具gdb簡介 GDB(GNU Debugger)是Linux下的一個除錯工具,具體的功能有: - 設定斷點,使得程式碼在制定行暫停執行; - 單步除錯程式; - 檢視

Linuxgdb除錯用法命令

一直在Fedora平臺下寫opencv的程式,需要對程式進行除錯,主要用的除錯工具是gdb. gdb提供瞭如下功能: 1.在程式中設定斷點,Debug時遇到斷點處暫停 2.可以監視某個變數,並利用print函式將該變數的值打印出來 3.程式可step-by-

Linuxgdb除錯多執行緒

gdb除錯多執行緒,目前我知道的就以下幾條指令,當然編譯的時候需要加-g選項。 info threads 顯示所有執行緒,系統會給每個執行緒都分配一個編號,編號前帶“*”的,是當前正在除錯的執行緒

LINUXGDB除錯

(gdb) b *main Breakpoint 4 at 0x804834c: file gdb-sample.c, line 17. (gdb) r The program being debugged has been started already. Start it from the beginni

linuxgdb除錯多執行緒死迴圈

1、我們首先要知道是哪個執行緒出了問題:     A、查程序  ps -ef | grep 程序名         B、查執行緒  top -H -p 程序ID 2、gdb檢視  gdb 程序名  程序號 :     A、檢視是哪個執行緒出了問題 (gdb) inf

linux gdb+coredump 除錯偶發crash的程式

1. 開啟 core dump 檢視是否開啟 ulimit -c  如果輸出0, 說明沒有開啟。 方法一:使用命令 ulimit -c unlimited  可以開啟,但是隻對當前終端有效, 方法二: 配置 /etc/profile 檔案 su

Linuxgdb除錯

一、Linux下的gdb除錯 要使用gdb除錯,必須在原始碼生成二進位制程式時,加上-g 選項 例如:gcc -o main main.c -g 二、如何除錯 首先,先把程式碼

linuxgdb的安裝與除錯

1 安裝gdb 在Debian GNU/Linux Desktop中,應用程式 >> 附件 >> Root Terminal。輸入密碼,在Root許可權下的終端下輸入: apt-get update …… apt-get install 

linux除錯工具gdb

在說這個問題之前,我們先弄清楚兩個概念: 1>什麼是Debug版本 2>什麼是Release版本 Debug和Release是兩種編譯方式,Debug通常稱為除錯版本,它包含除錯資訊,並且不做任何優化,便於程式設計師除錯程式 Release稱為釋出版本,它往往進

linuxgdb單步除錯

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

LINUXGDB反匯編和調試

出了 恢復 而是 約定 簡單的 難度 tar link 並且 Linux下的匯編與Windows匯編最大的不同就是第一個操作數是原操作數,第二個是目的操作數。而Windows下卻是相反。 1、 基本操作指令 簡單的操作數類型說明。一般有三種。 (1)馬

Linux程式設計——gdb除錯

    上一篇文章中,我們學習了gcc編譯器的使用。本文,我們就講解 gdb 偵錯程式(Debug)的使用,它可以幫助我們找出程式之中的錯誤和漏洞等等。     當程式編譯完成後,它可能無法正常執行;或許程式會徹底崩潰;或許只是不能

嵌入式ARM在Linux更改除錯串列埠

By Toradex秦海 1). 簡介 在基於嵌入式ARM開發產品的時候,有時候由於ARM處理器UART數量的限制,我們需要將系統預設的除錯串列埠列印資訊關閉或者轉移到其他串列埠上面去,本文即演示更改uboot和linux kernel 除錯串列埠的過程示例。   本文所演

UbuntuGDB除錯C語言程式

轉自:http://zhgeaits.me/other/2013/03/17/gdb-study-notes.html,感謝博主。 1.GDB是什麼 GDB是GNU開源組織釋出的一個UNIX下的程式除錯工具,專門用來除錯C,C++這些程式的了,而且都是命令列模式的。 2.準備工作 平

LinuxGDB安裝方法

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

嵌入式Linux--配置gdb除錯環境

gdb交叉除錯類似於網路瀏覽器,本地PC為客戶端,arm開發板為伺服器端,雙方都要統一編譯工具鏈,版本最好保持一致。 (百度百科)一般來說,GDB主要幫助你完成下面四個方面的功能: 1、啟動你的程式,可以按照你的自定義的要求隨心所欲的執行程式。 2、可讓被除錯的程式在你所指定的調置的

linux gdb+coredump 調試偶發crash的程序

etc 以及 如果 ech nbsp inux core文件 amp 修改 1. 打開 core dump 查看是否打開 ulimit -c 如果輸出0, 說明沒有打開。 方法一:使用命令 ulimit -c unlimited 可以打開,但是只對當前終端有

Linux除錯工具

隨著XP的流行,人們越來越注重軟體的前期設計、後期的實現,以及貫穿於其中的測試工作,經過這個過程出來的自然是高質量的軟體。甚至有人聲稱XP會淘汰偵錯程式!這當然是有一定道理的,然而就目前的現實來看,這還是一種理想。在日常工作中,除錯工具還是必不可少的。在Linux下,除錯工具並非只有gdb,還有很多其它除錯工

Linux列印除錯管理

#ifndef _DEBUG_MANAGE_H_ #define _DEBUG_MANAGE_H_ /* 資訊的除錯級別,數值起小級別越高 */ #define APP_EMERG "<0>" /* system is unusable */ #def