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。