當前位置:首頁 » 網頁前端 » gdb啟動設置參數腳本
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

gdb啟動設置參數腳本

發布時間: 2022-10-23 16:26:24

⑴ 怎樣用gdb調試一個由腳本文件啟動的程序

我用makefile寫了個編譯程序,因為makefile自動搜索源文件路徑,所以在寫這個makefile文件時,我的每個源文件 只有文件名,而沒附帶路徑名,說白了,我編譯完成後,我的.h 文件在 /SE/include中,.cpp文件在 /SE/src中, .o文件和 可執行文件在/...

⑵ 如何寫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命令腳本

首先般命令其實都程序
裝系統路徑程序程序名都作命令直接調用
具體哪些路徑系統路徑Linux用$PATH$命令查看(通路徑用冒號隔)
gdb其實gcc/g++編譯器附帶調試器
雖現主流Linux發行版都自帶gcc編譯器附帶gdb調試器
畢竟算Linux系統內部組件所自能算做Linux自帶命令

⑷ 如何寫gdb命令腳本

首先般命令其實都程序
裝系統路徑程序程序名都作命令直接調用
具體哪些路徑系統路徑Linux用$PATH$命令查看(通路徑用冒號隔)
gdb其實gcc/g++編譯器附帶調試器
雖現主流Linux發行版都自帶gcc編譯器附帶gdb調試器
畢竟算Linux系統內部組件所自能算做Linux自帶命令

⑸ 如何用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

⑹ gdb調試命令是什麼

gdb調試命令如下:

1、啟動gdb

$gdb

這樣可以和gdb進行交互了。

2、啟動gdb,並且分屏顯示源代碼

$gdb -tui

這樣,使用了'-tui'選項,啟動可以直接將屏幕分成兩個部分,上面顯示源代碼,比用list方便多了。這時候使用上下方向鍵可以查看源代碼,想要命令行使用上下鍵就用[Ctrl]n和[Ctrl]p。

3、啟動gdb調試指定程序app

$gdb app

這樣就在啟動gdb之後直接載入了app可執行程序,需要注意的是,載入的app程序必須在編譯的時候有gdb調試選項,例如'gcc -g app app.c',注意,如果修改了程序的源代碼,但是沒有編譯,那麼在gdb中顯示的會是改動後的源代碼,但是運行的是改動前的程序,這樣會導致跟蹤錯亂的。

4、啟動程序之後,再用gdb調試

$gdb <program> <PID>

這里,<program>是程序的可執行文件名,<PID>是要調試程序的PID.如果你的程序是一個服務程序,那麼你可以指定這個服務程序運行時的進程ID。gdb會自動attach上去,並調試他。program應該在PATH環境變數中搜索得到。

5、啟動程序之後,再啟動gdb調試

$gdb <PID>

這里,程序是一個服務程序,那麼你可以指定這個服務程序運行時的進程ID,<PID>是要調試程序的PID.這樣gdb就附加到程序上了,但是現在還沒法查看源代碼,用file命令指明可執行文件就可以顯示源代碼了。

⑺ 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函數的入口處停住。

gdb:UNIX及UNIX-like下的調試工具。如果在 UNIX平台下做軟體,GDB調試工具相比於VC、z的優點是具有修復網路斷點以及恢復鏈接等功能,比BCB的圖形化調試器有更強大的功能。

2009年12月29日,程序調試工具 GDB 7.0.1 發布,新版本修正了7.0版本的一些嚴重的堆棧溢出bug,這些bug可能導致 GDB 調試進程中斷,修正了在 FreeBSD 和 IRⅨ 系統下無法編譯的問題,增加了對 Thumb2調試的支持,還有其他一些小bug的修復。

⑻ 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函數的入口處停住。

GDB主要幫助完成下面四個方面的功能:

1、啟動程序,可以按照你的自定義的要求隨心所欲的運行程序。

2、可讓被調試的程序在你所指定的調置的斷點處停住。(斷點可以是條件表達式)

3、當程序被停住時,可以檢查此時你的程序中所發生的事。

4、可以改變你的程序,將一個BUG產生的影響修正從而測試其他BUG。

⑼ 怎樣用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調試多進程

在2.5.60版Linux內核及以後,GDB對使用fork/vfork創建子進程的程序提供了follow-fork-mode選項來支持多進程調試。


follow-fork-mode的用法為:


set follow-fork-mode [parent|child]


parent: fork之後繼續調試父進程,子進程不受影響。

child: fork之後調試子進程,父進程不受影響。

因此如果需要調試子進程,在啟動gdb後:


(gdb) set follow-fork-mode child並在子進程代碼設置斷點。


此外還有detach-on-fork參數,指示GDB在fork之後是否斷開(detach)某個進程的調試,或者都交由GDB控制:


set detach-on-fork [on|off]


on: 斷開調試follow-fork-mode指定的進程。

off: gdb將控制父進程和子進程。follow-fork-mode指定的進程將被調試,另一個進程置於暫停(suspended)狀態。

注意,最好使用GDB 6.6或以上版本,如果你使用的是GDB6.4,就只有follow-fork-mode模式。


follow-fork-mode/detach-on-fork的使用還是比較簡單的,但由於其系統內核/gdb版本限制,我們只能在符合要求的系統上才能使用。而且,由於follow-fork-mode的調試必然是從父進程開始的,對於fork多次,以至於出現孫進程或曾孫進程的系統,例如上圖3進程系統,調試起來並不方便。


Attach子進程

眾所周知,GDB有附著(attach)到正在運行的進程的功能,即attach <pid>命令。因此我們可以利用該命令attach到子進程然後進行調試。


例如我們要調試某個進程RIM_Oracle_Agent.9i,首先得到該進程的pid


[root@tivf09 tianq]# ps -ef|grep RIM_Oracle_Agent.9i

nobody 6722 6721 0 05:57 ? 00:00:00 RIM_Oracle_Agent.9i

root 7541 27816 0 06:10 pts/3 00:00:00 grep -i rim_oracle_agent.9i通過pstree可以看到,這是一個三進程系統,oserv是RIM_Oracle_prog的父進程,RIM_Oracle_prog又是RIM_Oracle_Agent.9i的父進程。


[root@tivf09 root]# pstree -H 6722通過 pstree 察看進程

現在就可以調試了。一個新的問題是,子進程一直在運行,attach上去後都不知道運行到哪裡了。有沒有辦法解決呢?


一個辦法是,在要調試的子進程初始代碼中,比如main函數開始處,加入一段特殊代碼,使子進程在某個條件成立時便循環睡眠等待,attach到進程後在該代碼段後設上斷點,再把成立的條件取消,使代碼可以繼續執行下去。


至於這段代碼所採用的條件,看你的偏好了。比如我們可以檢查一個指定的環境變數的值,或者檢查一個特定的文件存不存在。以文件為例,其形式可以如下:


void debug_wait(char *tag_file)

{

while(1)

{

if (tag_file存在)

睡眠一段時間;

else

break;

}

}當attach到進程後,在該段代碼之後設上斷點,再把該文件刪除就OK了。當然你也可以採用其他的條件或形式,只要這個條件可以設置/檢測即可。


Attach進程方法還是很方便的,它能夠應付各種各樣復雜的進程系統,比如孫子/曾孫進程,比如守護進程(daemon process),唯一需要的就是加入一小段代碼。


GDB wrapper

很多時候,父進程 fork 出子進程,子進程會緊接著調用 exec族函數來執行新的代碼。對於這種情況,我們也可以使用gdb wrapper 方法。它的優點是不用添加額外代碼。


其基本原理是以gdb調用待執行代碼作為一個新的整體來被exec函數執行,使得待執行代碼始終處於gdb的控制中,這樣我們自然能夠調試該子進程代碼。


還是上面那個例子,RIM_Oracle_prog fork出子進程後將緊接著執行RIM_Oracle_Agent.9i的二進制代碼文件。我們將該文件重命名為RIM_Oracle_Agent.9i.binary,並新建一個名為RIM_Oracle_Agent.9i的shell腳本文件,其內容如下:


[root@tivf09 bin]# mv RIM_Oracle_Agent.9i RIM_Oracle_Agent.9i.binary

[root@tivf09 bin]# cat RIM_Oracle_Agent.9i

#!/bin/sh

gdb RIM_Oracle_Agent.binary當fork的子進程執行名為RIM_Oracle_Agent.9i的文件時,gdb會被首先啟動,使得要調試的代碼處於gdb控制之下。