『壹』 如何寫gdb命令腳本
GDB是一個強大的命令行調試工具。雖然X Window提供了GDB的圖形版DDD,但是我仍然更鍾愛在命令行模式下使用GDB。大家知道命令行的強大就是在於,其可以形成執行序列,形成腳本。UNIX下的軟體全是命令行的,這給程序開發提代供了極大的便利,命令行軟體的優勢在於,它們可以非常容易的集成在一起,使用幾個簡單的已有工具的命令,就可以做出一個非常強大的功能。
於是UNIX下的軟體比Windows下的軟體更能有機地結合,各自發揮各自的長處,組合成更為強勁的功能。而Windows下的圖形軟體基本上是各自為營,互相不能調用,很不利於各種軟體的相互集成。在這里並不是要和Windows做個什麼比較,所謂「寸有所長,尺有所短」,圖形化工具還是有不如命令行的地方。
1 GDB概述
GDB是GNU開源組織發布的一個強大的UNIX下的程序調試工具。或許,各位比較喜歡那種圖形界面方式的,像VC、BCB等IDE的調試,但如果你是在 UNIX平台下做軟體,你會發現GDB這個調試工具有比VC、BCB的圖形化調試器更強大的功能。所謂「寸有所長,尺有所短」就是這個道理。
一般來說,GDB主要幫忙你完成下面四個方面的功能:
1、啟動你的程序,可以按照你的自定義的要求隨心所欲的運行程序。
2、可讓被調試的程序在你所指定的調置的斷點處停住。(斷點可以是條件表達式)
3、當程序被停住時,可以檢查此時你的程序中所發生的事。
4、動態的改變你程序的執行環境。
『貳』 gdb中,監視點,斷點,跟蹤點,捕獲點的區別
當然可以print 就可以看到變數的值,你甚至可以寫個腳本程序讓gdb依次執行,但是gdb好像對標准容器不能支持,例如不能列印vector中元素的值。不過你可以在代碼中定義一個調試用的變數,讓他跟蹤vector中你希望了解的量的值
『叄』 .gdb是什麼格式用啥軟體可以打開
.gdb格式的文件是GPS定位儀器所採集是定位數據通過儀器自動保存的文件,可利用MapSourse及GoogleEarth等軟體打開此文件,顯示的是定位數據。
變化:
1、GDB可以理解線程的名字。
2、這個命令」線程名稱」(指定一個名稱)和「線程找到[REGEXP]」(匹配名稱、目標ID,或者額外的信息)被添加。
3、Python腳本支持大大增強。
4、在c++的支持,異常處理是提高,模板參數放在范圍在一個實例化時調試。
5、線程調試的核心轉儲在GNU / Linux成為可能。
(3)gdb腳本浮點擴展閱讀:
執行程序:
要想運行准備調試的程序,可使用run命令,在它後面可以跟隨發給該程序的任何參數,包括標准輸入和標准輸出說明符(<;和>;)和shell通配符(*、?、[、])在內。
如果使用不帶參數的run命令,gdb就再次使用你給予前一條run命令的參數,這是很有用的。利用set args 命令就可以修改發送給程序的參數,而使用show args 命令就可以查看其預設參數的列表。
(gdb) file a.out //載入被調試的可執行程序文件。
(gdb)set args –b –x
(gdb) show args
(gdb)r //執行程序
backtrace命令為堆棧提供向後跟蹤功能。Backtrace 命令產生一張列表,包含著從最近的過程開始的所有有效過程和調用這些過程的參數。
『肆』 gcc中怎麼使用gdb命令
在linux系統中,默認是沒有安裝gcc編譯器的,可以通過命令
rpm -q | grep gcc
來查看。安裝命令為:
yum -y install gcc
安裝後,編寫一個.c結尾的文件。
gcc test.c
就會默認輸出一個a.out的輸出文件,這個輸出文件就是可執行文件。
如果加上-o選項,則可以自定目標文件。
gcc -o test test.c
test就是它的可執行文件。
一般都默認加上-Wall 選項,可以自動提示一些出錯警告的信息。
gcc -Wall -o test test.c
gbd
以上就是常用的gcc相關知識了。下面就是它的調試,調試通常使用gdb。在編譯的時候需要加上選項-ggdb3選項
gcc -ggdb3 -Wall -o test test.c
這樣在沒有出錯的情況下
gdb test
就進入調試窗口
輸入下面命令可以進行如下的操作:
break 設置斷點
break 21 在第21行設置斷點
break main 在main函數處設置斷點
break test 在函數test處設置斷點
step / s 下一步,直接執行下一條程序
continue / cont 下一段,如果遇到函數,不會進入函數,逐過程,有點類似VS裡面的F10
run 運行
finish 結束調試
tbreak設置臨時斷點
print / p 顯示某個變數的值
p *array@len 輸出數組
p i 輸出i的值
enable 恢復失效的斷點
disable 使斷點失效
clear 清除斷點
backtrace / bt 查看堆棧信息
相關的輸出格式
x 十六進制格式
d 十進制格式
u 十六進制無符號
o 八進制顯示
t 二進制顯示
a 十六進制顯示
c 字元格式顯示
f 浮點數格式顯示
『伍』 怎樣用GDB調試一個由腳本文件啟動的程序
使用GDB
一般來說GDB主要調試的是C/C++的程序。要調試C/C++的程序,首先在編譯時,我們必須要把調試信息加到可執行文件中。使用編譯器(cc/gcc/g++)的 -g 參數可以做到這一點。如:
$gcc -g -Wall hello.c -o hello
$g++ -g -Wall hello.cpp -o hello
如果沒有-g,你將看不見程序的函數名、變數名,所代替的全是運行時的內存地址。當你用-g把調試信息加入之後,並成功編譯目標代碼以後,讓我們來看看如何用gdb來調試他。
啟動GDB的方法有以下幾種:
gdb <program>
program也就是你的執行文件,一般在當前目錄下。
gdb <program> core
用gdb同時調試一個運行程序和core文件,core是程序非法執行後core mp後產生的文件。
gdb <program> <PID>
如果你的程序是一個服務程序,那麼你可以指定這個服務程序運行時的進程ID。gdb會自動attach上去,並調試他。program應該在PATH環境變數中搜索得到。
以上三種都是進入gdb環境和載入被調試程序同時進行的。也可以先進入gdb環境,在載入被調試程序,方法如下:
*在終端輸入:gdb
*在gdb環境中:file <program>
這兩步等價於:gdb <program>
GDB啟動時,可以加上一些GDB的啟動開關,詳細的開關可以用gdb -help查看。我在下面只例舉一些比較常用的參數:
-symbols <file>
-s <file>
從指定文件中讀取符號表。
-se file
從指定文件中讀取符號表信息,並把他用在可執行文件中。
-core <file>
-c <file>
調試時core mp的core文件。
-directory <directory>
-d <directory>
加入一個源文件的搜索路徑。默認搜索路徑是環境變數中PATH所定義的路徑。
『陸』 如何用GDB進行調試
1: 對於在應用程序中加入參數進行調試的方法:
直接用 gdb app -p1 -p2 這樣進行調試是不行的。
需要像以下這樣使用:
#gdb app
(gdb) r -p1 -p2
或者在運行run命令前使用set args命令:
(gdb) set args p1 p2
可以用show args 命令來查看
2. 加入斷點:
break <linenumber>
break <funcName>
break +offset
break -offset
(在當前行號的前面或後面的offset行停住。)
break filename:linenum
在源文件filename的linenum行處停住。
break filename:function
在源文件filename的function函數的入口處停住。
break ... if
...可以是上述的參數,condition表示條件,在條件成立時停住。比如在循環境體中,可以設置 break if i=100,表示當i為100時停住程序。
3. 查看運行時的堆棧:
使用bt命令
4. 列印某個變數的值:
print val
5. 單步: n
繼續運行:c
step
單步跟蹤,如果有函數調用,他會進入該函數。
next
同樣單步跟蹤,如果有函數調用,他不會進入該函數。很像VC等工具中的step over。後面可以加count也可以不加,不加表示一條條地執行,加表示執行後面的count條指令,然後再停住。
set step-mode
set step-mode on
打開step-mode模式,於是,在進行單步跟蹤時,程序不會因為沒有debug信息而不停住。這個參數有很利於查看機器碼。
set step-mod off
關閉step-mode模式。
finish
運行程序,直到當前函數完成返回。並列印函數返回時的堆棧地址和返回值及參數值等信息。
until 或 u
當你厭倦了在一個循環體內單步跟蹤時,這個命令可以運行程序直到退出循環體。
6.在GDB中執行shell命令:
在gdb環境中,你可以執行UNIX的shell的命令,使用gdb的shell命令來完成:
eg. shell make
7. 運行環境
可設定程序的運行路徑。
show paths 查看程序的運行路徑。
set environment varname [=value] 設置環境變數。如:set env USER=hchen
show environment [varname] 查看環境變數。
8.觀察點(WatchPoint)
觀察點一般來觀察某個表達式(變數也是一種表達式)的值是否有變化了,如果有變化,馬上停住程 序。我們有下面的幾種方法來設置觀察點:
watch
為表達式(變數)expr設置一個觀察點。一量表達式值有變化時,馬上停住程序。
rwatch
當表達式(變數)expr被讀時,停住程序。
awatch
當表達式(變數)的值被讀或被寫時,停住程序。
info watchpoints
列出當前所設置了的所有觀察點。
9. 維護breakpoint
clear
清除所有的已定義的停止點。
clear func
清除所有設置在函數上的停止點。
delete [breakpoints] [range...]
刪除指定的斷點,breakpoints為斷點號。如果不指定斷點號,則表示刪除所有的斷點。range 表示斷點號的范圍(如:3-7)。其簡寫命令為d。
比刪除更好的一種方法是disable停止點,disable了的停止點,GDB不會刪除,當你還需要時,enable即可,就好像回收站一樣。
disable [breakpoints] [range...]
disable所指定的停止點,breakpoints為停止點號。如果什麼都不指定,表示disable所有的停止 點。簡寫命令是dis.
enable [breakpoints] [range...]
enable所指定的停止點,breakpoints為停止點號。
10、程序變數
查看文件中某變數的值:
file::variable
function::variable
可以通過這種形式指定你所想查看的變數,是哪個文件中的或是哪個函數中的。例如,查看文件f2.c中的全局變數x的值:
gdb) p 'f2.c'::x
查看數組的值
有時候,你需要查看一段連續的內存空間的值。比如數組的一段,或是動態分配的數據的大小。你可以使用GDB的「@」操作符,「@」的左邊是第一個內存的地址的值,「@」的右邊則你你想查看內存的長度。例如,你的程序中有這樣的語句:
int *array = (int *) malloc (len * sizeof (int));
於是,在GDB調試過程中,你可以以如下命令顯示出這個動態數組的取值:
p *array@len
如果是靜態數組的話,可以直接用print數組名,就可以顯示數組中所有數據的內容了。
11.輸出格式
一般來說,GDB會根據變數的類型輸出變數的值。但你也可以自定義GDB的輸出的格式。例如,你想輸出一個整數的十六進制,或是二進制來查看這個整型變數的中的位的情況。要做到這樣,你可以使用GDB的數據顯示格式:
x 按十六進制格式顯示變數。
d 按十進制格式顯示變數。
u 按十六進制格式顯示無符號整型。
o 按八進制格式顯示變數。
t 按二進制格式顯示變數。
a 按十六進制格式顯示變數。
c 按字元格式顯示變數。
f 按浮點數格式顯示變數。
(gdb) p i
$21 = 101
(gdb) p/a i
$22 = 0x65
(gdb) p/c i
$23 = 101 'e'
(gdb) p/f i
$24 = 1.41531145e-43
(gdb) p/x i
$25 = 0x65
(gdb) p/t i
$26 = 1100101
11.查看內存
使用examine命令(簡寫是x)來查看內存地址中的值。x命令的語法如下所示:
x/
n、f、u是可選的參數。
n 是一個正整數,表示顯示內存的長度,也就是說從當前地址向後顯示幾個地址的內容。
f 表示顯示的格式,參見上面。如果地址所指的是字元串,那麼格式可以是s,如果地十是指令地址,那麼格式可以是i。
u 表示從當前地址往後請求的位元組數,如果不指定的話,GDB默認是4個bytes。u參數可以用下面的字元來代替,b表示單位元組,h表示雙位元組,w表示四位元組,g表示八位元組。當我們指定了位元組長度後,GDB會從指內存定的內存地址開始,讀寫指定位元組,並把其當作一個值取出來。
n/f/u三個參數可以一起使用。例如:
命令:x/3uh 0x54320 表示,從內存地址0x54320讀取內容,h表示以雙位元組為一個單位,3表示三個單位,u表示按十六進制顯示。
12.自動顯示
你可以設置一些自動顯示的變數,當程序停住時,或是在你單步跟蹤時,這些變數會自動顯示。相關的GDB命令是display。
display
display/
display/ expr
expr是一個表達式,fmt表示顯示的格式,addr表示內存地址,當你用display設定好了一個或多個表達式後,只要你的程序被停下來,GDB會自動顯示你所設置的這些表達式的值。
格式i和s同樣被display支持,一個非常有用的命令是:
display/i $pc
undisplay
delete display
刪除自動顯示,dnums意為所設置好了的自動顯式的編號。
disable display
enable display
disable和enalbe不刪除自動顯示的設置,而只是讓其失效和恢復。
info display
查看display設置的自動顯示的信息。GDB會打出一張表格,向你報告當然調試中設置了多少個自動顯示設置,其中包括,設置的編號,表達式,是否enable。
13. 設置顯示選項
set print address
set print address on
打開地址輸出,當程序顯示函數信息時,GDB會顯出函數的參數地址。系統默認為打開的,
show print address
查看當前地址顯示選項是否打開。
set print array
set print array on
打開數組顯示,打開後當數組顯示時,每個元素佔一行,如果不打開的話,每個元素則以逗號分隔。這個選項默認是關閉的。與之相關的兩個命令如下,我就不再多說了。
set print array off
show print array
set print elements
這個選項主要是設置數組的,如果你的數組太大了,那麼就可以指定一個來指定數據顯示的最大長度,當到達這個長度時,GDB就不再往下顯示了。如果設置為0,則表示不限制。
show print elements
查看print elements的選項信息。
set print null-stop
如果打開了這個選項,那麼當顯示字元串時,遇到結束符則停止顯示。這個選項默認為off。
set print pretty on
如果打開printf pretty這個選項,那麼當GDB顯示結構體時會比較漂亮。
14.關於顯示源碼list
『柒』 如何使用linux下gdb來調試python程序
(1)假設要debug的進程號為1000,運行如下命令:
$ gdb -p 1000
使用此命令即可使gdb附加到進程。
(2)載入libpython腳本
如果你的gdb是redhat或fedora等廠商修改過的,會有--python選項,使用此選項即可指定gdb啟動時載入的Python擴展腳本(此腳本是擴展gdb的,不是我們需要debug的腳本)。
$ gdb --python /path/to/libpython .py -p 1000
如果安裝的是GNU的gdb,就需要打開gdb後手動載入libpython.py腳本
(gdb) python
> import sys
>sys.path.insert(0, '/path/to/libpython.py' )
> import libpython
>end
(gdb)
這時就可以使用py-bt命令列印當前線程的Python traceback了。libpython還提供很多命令,例如py-print列印變數,py-locals列印所有本地變數等等,詳細可打開libpython.py查看。
『捌』 gcc里怎麼用gdb
這位朋友我看是有點誤解了makefile的做用。makefile
是一個腳本,由他來控制編譯出的程序的版本。當你改寫了原文件後,通過makefile
來檢查依賴關系,來生成最終的文件。比如一個程序叫a
他的源碼叫a.c
a.c
又用到頭文件a.h
,a.h是1.h和2.h生成的如果你改寫了1.h,通過編寫makefile文件。make時會調用makefile來依此按依賴關系生成最後的a所以說編譯時程序並不知道生成a都用到什麼。怎麼可能自己生成呢。makefile是要你自己編寫的,來告訴make來如何編譯。make工具就相當於一個腳本。
gcc里怎麼用gdb?這里有視頻教程可以看下
http://www.alisoho.com
『玖』 深度linux V20如何安裝gdb,如何用gdb調試程序、用gdb設置斷點刪除斷點、gdb自動顯示變數值、看內存值
因本人通過幾個小時的時間才解決這個問題,希望我的答案能節省大部分初學者在gdb上的時間。我也是今天才接觸gdb,以下是有關深度linux V20的gdb調試問題的初步總結:
安裝gdb方式,sudo apt-get install gdb ,有ok點擊ok安裝,直到安裝結束。
gcc -g aa.c之後才能調試a.out文件。(aa.c表示你的源文件)
用法gdb a.out或者gdb進入後file a.out
l N是查看N行附近的代碼,直接l是顯示接下去的代碼。r運行過程中遇到斷點,按l則顯示斷點附近代碼。
l 函數名是查看函數名里邊的代碼
q退出調試。
p 變數,查看變數即時值。
r運行。
n單步執行。
s單步執行-進入函數。
c連續多步運行,直到下個斷點(循環的下一次斷點)暫停。
b N第N行設置斷點。
b 函數名,在函數名的入口處設置斷點。
b 文件名:行號,在指定文件名行號設置斷點。其中文件名是源文件的文件名。
(條件斷點)b 行號 if 變數==N,表示該行號的斷點必須滿足變數==N的條件下才停下來。
ignore 斷點編號 N,表示該斷點編號在接下來的運行過程中忽略N次,即第N+1次該斷點才會停下來。
info break顯示全部斷點。簡寫i b
delete 1-3刪除編號為1到3的斷點。簡寫 d 1-3。d 4隻刪除編號為4的斷點。
delete break刪除所有斷點。無法簡寫
clear 20刪除20行斷點。
運行中disable break n 禁用斷點號為n的斷點。enable break n 使能斷點為n的斷點號重新啟用。其中break可以簡寫為b
display {var1,var2,var3}自動顯示var1~3變數的值。要刪除display則用delete display N,N表示display的編號,如果不加N則表示刪除全部的display。如果要自動顯示數組內容,用display 數組名。注意:display需要r之後才能設置。
watch {var1,var2,var3}自動跟蹤改變的值,只要有改變才顯示watch。要刪除watch,用d N,N代表watch編號,用i b可以查看該編號。注意:watch需要r之後才能設置。
gdb死循環程序按鍵盤ctrl+c可結束程序
****************
要查看內存地址的內容用x /nfu 內存地址。以下是n、f、u的解釋
其中n表示要顯示多少個內存單元。
f表示顯示方式, 可取如下值
x 按十六進制格式顯示變數。
d 按十進制格式顯示變數。
u 按十進制格式顯示無符號整型。
o 按八進制格式顯示變數。
t 按二進制格式顯示變數。
a 按十六進制格式顯示變數。
i 指令地址格式
c 按字元格式顯示變數。
f 按浮點數格式顯示變數。
u表示一個地址單元的長度
b表示單位元組,
h表示雙位元組,
w表示四位元組,
g表示八位元組
*****************
『拾』 gdb斷點怎麼實現的
2009年12月29日,程序調試工具 GDB 7.0.1 發布,新版本修正了7.0版本的一些嚴重的堆棧溢出bug,這些bug可能導致 GDB 調試進程中斷,修正了在 FreeBSD 和 IRⅨ 系統下無法編譯的問題,增加了對 Thumb2調試的支持,還有其他一些小bug的修復。
2010年03月19日,GDB 7.1 發布,
詳細改進內容:多程序調試的支持;
位置獨立的可執行文件(派)調試的支持;
新的目標(包括一個模擬器):Xilinx MicroBlaze和瑞薩RX;
Python支持增強;
c++支持擴展;
新tracepoint功能;
過程記錄的改進;
遠程協議擴展。
2010年09月06日 ,GDB 7.2 發布,
該版本改進記錄:
⒈ 支持D語言
⒉ C++ 改進,支持參數依賴查找ADL,靜態常量類成員和改進了用戶自定義操作符的支持
⒊ Python 調試的改進,包括斷點、符號、符號表、程序空間、線程等可通過命令行進行操作
⒋ Furthermore,enhancements were made for tracepoints and for GDBserver.在跟蹤點和GDB程序上有了改善。
⒌ 支持 ARM Symbian 平台
⒍ 其他方面的改進和bug修復。
2011年08月26日,GDB 7.3a 發布,
變化:
1。GDB可以理解線程的名字。
2。這個命令」線程名稱」(指定一個名稱)和「線程找到[REGEXP]」(匹配名稱、目標ID,或者額外的信息)被添加。
3。Python腳本支持是大大增強。
4。在c++的支持,異常處理是提高,模板參數放在范圍在一個實例化時調試。
5。線程調試的核心轉儲在GNU / Linux成為可能。
6。最初支持C語言版本的OpenCL。
7。許多其他改進。