Linux下進行GDB調試 GDB是GNU開源組織發布的一個強大的UNIX下的程式調試工具一般來說,GDB主要協助自己完成下面四個方面的功能;1:啟動你的程式,可以按照你的自訂的要求隨心所欲的運行程式2:可以讓被調試的程式在你所指定的調製的斷點處停住(斷點可以是條件運算式)3:當程式被停住時,可以檢查你的程式中發生的事4:動態改變你程式的執行環境 www.2cto.com 利用print命令可以檢查各個變數的值。 (gdb)print p (p為變數名) print是gdb的一個功能很強的命令,利用它可以顯示被調試的語言中任何有效運算式。運算式除了包含你程式中的變數外,還可以包含以下內容: 對程式中函數的調用 (gdb)print find_entry(1,0) 資料結構和其他複雜物件 (gdb)print *table_start ={e=reference=’\000’,location=0x0,next=0x0} 值的曆史成分 (gdb)print(為記錄變數,在以後可以直接引用的值) 因此,要想顯示在h後面的10個元素,可以使用h@10: (gdb)printh@10 =(-1,345,23,-234,0,0,0,98,345,10) whatis命令可以顯示某個變數的類型 (gdb)whatis p type= int * www.2cto.com break命令(可以簡寫為b)可以用來在調試的程式中設定斷點,該命令有如下四種形式: breakline-number 使程式恰好在執行給定行之前停止。 breakfunction-name 使程式恰好在進入指定的函數之前停止。 breakline-or-function if condition 如果condition(條件)是真,程式到達指定行或函數時停止。 breakroutine-name 在指定常式的入口處設定斷點 如果該程式是由很多原檔案構成的,你可以在各個原檔案中設定斷點,而不是在當前的原檔案中設定斷點,其方法如下: (gdb)break filename:line-number (gdb)break filename:function-name 要想設定一個條件斷點,可以利用breakif命令,如下所示: (gdb)break line-or-function if expr finish結束執行的當前函數,顯示其傳回值 一個程式例子 來源程式:tst.c 1#include <stdio.h> 2 3int func(int n) 4{ 5int sum=0,i; 6for(i=0; i<=n; i++) 7{ 8sum+=i; 9} 10return sum; 11} 12 13 14main() 15{ 16int i; 17long result = 0; 18for(i=1; i<=100; i++) 19{ 20result += i; 21} 22 23printf("result[1-100] = %d \n", result ); 24printf("result[1-250] = %d \n", func(250) ); 25} 編譯產生執行檔案:(Linux下) hchen/test>gcc -g tst.c -o tst 使用GDB調試: hchen/test>gdb tst <---------- 啟動GDB GNUgdb 5.1.1 Copyright2002 Free Software Foundation, Inc. GDBis free software, covered by the GNU General Public License, and youare welcometo change it and/or distribute copies of it under certain conditions. Type"show copying" to see the conditions. Thereis absolutely no warranty for GDB. Type "show warranty" fordetails. ThisGDB was configured as "i386-suse-linux"... (gdb)l <-------------------- l命令相當於list,從第一行開始例出原碼。 1#include <stdio.h> 2 3int func(int n) 4{ 5int sum=0,i; 6for(i=0; i<=n; i++) 7{ 8sum+=i; 9} 10return sum; 整個過程:首先寫出原始碼檔案 寫出之後進行編譯產生不帶.c的可執行檔命令 gcc -g tst.c -o tst再進行啟用GDB來調試 gdbtst www.2cto.com (gdb)l l命令相當於list,從第一行開始例出原碼。 (gdb)break 16 設定斷點,在來源程式16行處 breakfunc <-------------------- 設定斷點,在函數func()入口處。 (gdb)infobreak 察看斷點資訊(r)運行程式 ,run命令簡寫 (gdb)n <--------------------- 單條語句執行,next命令簡寫。 gdb)c <--------------------- 繼續運行程式,continue命令簡寫。 (gdb)p sum gdb)bt <--------------------- 查看函數堆棧。 (gdb)finish <--------------------- 退出函數。 (gdb)c <--------------------- 繼續運行。 gdb)q <--------------------- 退出gdb。