當前位置:首頁 » 編程軟體 » gdb自動執行腳本

gdb自動執行腳本

發布時間: 2022-08-15 19:50:52

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

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

㈡ 如何使用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查看。

㈢ 怎樣用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所定義的路徑。

㈣ linux入門基礎(四)Gdb調試程序

Gdb調試
注意:在Gcc編譯選項中一定要加入
–g
退出GDB:quit

Ctrl+d
調試過程:
1.
查看文件
命令:
(gdb)
l
命令:(gdb)
b
行號
註:到第17行停止,並沒有執行17行
3.
查看斷點情況
info
b
4.
運行代碼
r
命令:
(gdb)
r
(也可以指定行開始運行,在r後面加上行號)
5.
查看變數值
p
命令:(gdb)
p
變數名
6.
設置監視點:
watch
z
(變數名)
也可以是復雜的表達式
7.
單步運行
命令:(gdb)
n
(逐過程)
8.逐步,會進入函數
命令:(gdb)
s
9.條件斷點
將正常斷點轉變為條件斷點:condition
如:condition
1
i
==
10
只有當滿足條件i
==
1時,才會在斷點1處暫停
10.
恢復程序運行
c
命令:
(gdb)
c
(程序就會運行,如果沒有斷點,就運行剩下部分,如果有斷點,就會運行到下一個斷點)
11.
去除斷點
clear
line_number
clear
filename:line_number
12.
help
12.1
help找出類別
12.2help從列表中

㈤ 深度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調試多進程

在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


[[email protected] 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的父進程。


[[email protected] 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腳本文件,其內容如下:


[[email protected] bin]# mv RIM_Oracle_Agent.9i RIM_Oracle_Agent.9i.binary

[[email protected] bin]# cat RIM_Oracle_Agent.9i

#!/bin/sh

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

㈦ 如何使用gdb調試可執行程序與源程序

簡單來說,有兩種方式,一種是源碼debug,即分析源碼來找出bug位置,一般使用printf()列印出程序執行每一步的信息,一種是可執行文件debug

㈧ 如何寫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、動態的改變你程序的執行環境。

熱點內容
s7edge存儲卡 發布:2022-09-26 02:31:58 瀏覽:52
編程教育課 發布:2022-09-26 02:31:55 瀏覽:614
劍俠情緣手游掛機腳本 發布:2022-09-26 02:30:16 瀏覽:365
we飛車安卓賬號怎麼轉到蘋果 發布:2022-09-26 02:30:08 瀏覽:887
python調用文件 發布:2022-09-26 02:28:52 瀏覽:904
沒有配置的車有哪些 發布:2022-09-26 02:27:07 瀏覽:454
javasql插入 發布:2022-09-26 02:23:35 瀏覽:853
安卓微信在哪裡設置視頻 發布:2022-09-26 02:22:05 瀏覽:829
血壓計廣告腳本 發布:2022-09-26 02:20:10 瀏覽:899
shell腳本字元串 發布:2022-09-26 02:20:05 瀏覽:176