1. 程式人生 > >GDB常用命令使用說明

GDB常用命令使用說明

GDB(GNU Debugger)是在Unix以及類Unix系統下的除錯工具。功能極其強大,幾乎涵蓋了你所需要的全部功能。 
GDB主要幫忙你完成下面四個方面的功能: 
1.啟動你的程式,可以按照你的定製要求隨心所欲的執行程式。 
2.可讓被除錯的程式在你所指定的調置的斷點處停住。 
3.當程式被停住時,可以檢查此時你的程式中所發生的事,以及記憶體狀態等。 
4.動態的改變你程式的執行環境。

gdb使用總旨:help指令很強大!多用help!help裡面總會有你需要的資訊。如果你不知道如何使用help,請在gdb裡面輸入:help all

 一、gdb使用前置條件:編譯時加入debug資訊。

    gcc/g++是在編譯時加入-g,其他語言請自行百度。值得注意的是,-g分4個等級:

  1. -g0等於不加-g。即不包含任何資訊
  2. -g1只包含最小資訊,一般來說只有你不需要debug,只需要backtrace資訊,並且真的很在意程式大小,或者有其他保密/特殊需求時才會使用-g1。
  3. –g2為gdb預設等級,包含絕大多數你需要的資訊。
  4. –g3包含一些額外資訊,例如包含巨集定義資訊。當你需要除錯巨集定義時,請使用-g3

二、gdb最常見的幾個用法:

     1. 除錯程式。有幾種方法可以在gdb下執行你的程式:

        1)    gdb ${你的程式} 進入gdb後,輸入run(簡寫r) ${arg1} ${arg2} … ${argN}

        2)    gdb --args ${你的程式} ${arg1} ${arg2} … ${argN} 進入gdb後,執行run。

        3)    gdb進入gdb後,輸入file ${你的程式}。然後使用set args  ${arg1} ${arg2} … ${argN} 設定好你的程式引數,再執行run。

     2. 除錯正在執行的程式:

        gdb ${你的程式} ${程式pid}

     3. 查core:

        gdb ${你的程式} ${core檔案}

三、gdb常用命令:

     1. backtrace:顯示棧資訊。簡寫為bt。

     2. frame x 切換到第x幀。其中x會在bt命令中顯示,從0開始。0表示棧頂。簡寫為f。

     3. up/down x 往棧頂/棧底移動x幀。當不輸入x時,預設為1。

     4. print x列印x的資訊,x可以是變數,也可以是物件或者陣列。簡寫為p。

     5. print */&x 列印x的內容/地址。

     6. call 呼叫函式。注意此命令需要一個正在執行的程式。

     7. set substitute-path from_path  to_path,替換原始碼檔案路徑。當編譯機與執行程式的機器程式碼路徑不同時,需要使用該指令替換程式碼路徑,否則你無法在gdb中看到原始碼。

     8. break x.cpp:n 在x.cpp的第n行設定斷點,然後gdb會給出斷點編號m。命令可簡寫為b。後面會對break命令進行更詳細的解釋。

     9. command m 設定程式執行到斷點m時要看的內容,例如:

        command n

          >printf "x is %d\n",x

          >c

          >end

        如果command後面沒有引數n,則命令被賦給最後一個breakpoint,這其實是說break和command連在一起用,在腳本里用就非常方便了。gdb指令碼會在後面詳細介紹

     10. x /nfu ${addr} 列印addr的內容。addr可以是任何合法的地址表示式,例如0x562fb3d,一個當前有效的指標變數p,或者一個當前有效的變數var的地址&var。nfu是格式,n表示檢視的長度,F表示格式(例如16進位制或10進位制),U表示單位(例如單位元組b,雙字h,四字w等)。舉個栗子:

           (gdb) x /3xw 0x562fb3d //這個指令的意思為:以16進位制格式顯示地址0x562fb3d處3個單位,每個單位四位元組的內容。你將得到下列數值:

           0x562fb3d:    0x00282ff4    0x080484e0    0x00000000

     11. continue 繼續執行程式。進入除錯模式後,若你已經獲取了你需要的資訊或者需要程式繼續執行時使用。可簡寫為c

     12. until 執行到當前迴圈完成。可簡寫為u

     13. step 單步除錯,步入當前函式。可簡寫為s

     14. next 單步除錯,步過當前函式。可簡寫為n

     15. finish 執行到當前函式返回

     16. set var x=10 改變當前變數x的值。也可以這樣用:set {int}0x83040 = 10把記憶體地址0x83040的值強制轉換為int並賦值為10

     17. info locals 列印當前棧幀的本地變數

     18. jump使當前執行的程式跳轉到某一行,或者跳轉到某個地址。由於只會使程式跳轉而不會改變棧值,因此若跳出函式到另外的地方 會導致return出錯。另外,熟悉彙編的人都知道,程式執行時,有一個暫存器用於儲存當前程式碼所在的記憶體地址。所以,jump命令也就是改變了這個暫存器中的值。於是,你可以使用“set $pc”來更改跳轉執行的地址。如: set $pc = 0x485

     19. return: 強制函式返回。可以指定返回值

 四、程式中斷機制:監視點(watchpoint)、斷點(breakpoint)和捕捉點(catchpoint):

      1. 監視點。監視點是監視記憶體中某個地址,當該地址的資料被改變(或者被讀取)時,程式交出控制權進入偵錯程式。注意監視點分為軟體模式和硬體模式:GDB 使用軟體監視點的方式是在單步執行你的程式的同時測試變數的值,所以執行程式的速度會變慢。同時,軟體監視點僅在當前執行緒有效。幸運的是,32 位的 Intel x86 處理器提供了 4 個特殊的除錯暫存器用來方便除錯程式,GDB 可以使用這些暫存器建立硬體監視點。GDB 總是會優先使用硬體監視點,因為這樣不會減慢程式的執行速度。然而,可用的(enable的)硬體監視點的個數是有限的。如果你設定了過多的硬體監視點,當程式從中斷的狀態變為執行的狀態(例如continue,until或者finish)時,GDB 可能無法把它們全部啟用。另外,活動的硬體監視點的數量只有在試圖繼續執行程式時才能知道,也就是說,即使你設定了過多的硬體監視點,gdb在你執行程式之前也不會警告你。

        設定監視點的命令有3個,watch(寫監視),rwatch(讀監視)以及awatch(讀寫監視)。他們的使用方法一樣,皆為以下幾種:

        1) (r/a)watch x。x是一個變數名。當x的值改變/被讀取時,程式交出控制權進入偵錯程式。

        2) (r/a)watch 0xN。N為一個有效地址。當該地址的內容變化/被讀取時,程式交出控制權進入偵錯程式。

        3) (r/a)watch *(int *)0xN。N為一個有效地址。當該地址的中的int指標指向的內容變化/被讀取時,程式交出控制權進入偵錯程式。

        4) (r/a)watch -l *(int *)0xN。N為一個有效地址。當該地址的中的int指標指向的內容變化/被讀取,或者該地址的內容變化/被讀取時,程式交出控制權進入偵錯程式。

        注意3)和4)的區別在於,當加入-l選項後,會同時監視表示式本身以及表示式指向的內容。

     2. 斷點是指當執行到程式某一步時,程式交出控制權進入偵錯程式。值得注意的是,break會有一些變體:tbreak,hbreak,thbreak與rbreak。tbreak與break功能相同,只是所設定的斷點在觸發一次後自動刪除。hbreak是一個硬體斷點。thbreak則既是一個臨時的硬體斷點。注意硬體斷點需要硬體支援,某些硬體可能不支援這種型別的斷點。rbreak稍微特殊一些,它會在匹配正則表示式的全部位置加上斷點,後面會有詳細講解。除去rbreak,其他break家族的使用方法如下:

        1) (t/h)break x.cpp:y 。在程式碼x.cpp的第y行加入斷點。x.cpp若不指定,則會以當前執行的檔案作為斷點檔案。若程式未執行,則以包含main函式的原始碼檔案作為斷點檔案。若x.cpp和y都不指定,則以當前debugger的點作為斷點處。

        2) (t/h)break 0xN。在地址N處加入斷點。N必須為一個有效的程式碼段(code segment)地址。

        3) (t/h)break  x.cpp:func。在x.cpp的func函式入口處加入斷點。x.cpp可以不提供直接使用break func。注意由於過載(overload)的存在,因此gdb可能會詢問你希望在哪個函式加上斷點。你也可以通過指定引數型別來避免該問題,例如break func(int ,char *)

        4) (t/h)break  +/-N。在當前執行處的第N行後/前加入斷點。

        5) rbreak REGEXP。 在所有符合正則表示式REGEXP的函式入口加入斷點。例如rbeak EX_* 表示在所有符合以EX_開頭的函式入口處加入斷點。

        注意break後面還有2個可選引數,執行緒id和條件。執行緒id指在info threads中的執行緒序號,而非系統提供的tid。例如break x.cpp:y 2 if (a==24),表示在2號執行緒的x.cpp的第y行加入斷點,並且只有當a的值為24時,程式才會交出控制權進入偵錯程式。

        另外,breakpoints可以通過save命令儲存,以方便使用者下次再次進入程式除錯時不需要重設斷點。

     3. 捕捉點是當某些事件發生時,程式交出控制權進入偵錯程式。例如catch一個exception,assert,signal,fork甚至syscall。tcatch與catch功能一樣,只是所設定的捕捉點在觸發一次後自動刪除。以後會詳細介紹catchpoint。

五、跟蹤點(tracepoint):

     跟蹤點與上面三個斷點不同之處在於,它只是跟蹤記錄資訊而不會中斷程式的執行。當你的程式是realtime程式,或者與其他的程式有互動時,你可能會希望使用跟蹤點達到監視程式而又不破壞程式自身行為的目的。與斷點相同的是,跟蹤點會儲存下在跟蹤點時的一些記憶體資訊供使用者查閱,例如陣列或者物件。

     另外,tracepoints可以通過save命令儲存,以方便使用者下次再次進入程式除錯時不需要重設這些跟蹤點。

六、檢查點(checkpoint):

     gdb可以儲存某一個時間點的程式狀態或者說是程式映像,並且稍後又可以返回到這個狀態。這個稱之為checkpoint。

     每個檢查點是程序的一個拷貝。這樣當一個bug很難重現,而又擔心除錯過頭了又要從頭開始重現時,可以在估計要重現這個bug之前,做一個checkpoint,這樣即使debug過頭了,也可以從這個checkpoint開始,而不用重啟整個程式並且期待它重現這個bug(也許需要很久!!)。

     但是每個checkpoint有一個唯一的程序id,這個pid與原始程式的pid不同,因此如果程式需要使用pid的資訊時,需要慎重考慮。

相關推薦

GDB常用命令簡介

進入 常用 機器 fse 參數 代碼 next 匯編 不同 1、啟動調試程序   gdb 調試對象,例如gdb app 2、運行程序   run 或這簡寫為r 3、設置斷點   有幾種不同的方式   1)break line   2) break file:line

GDB常用命令使用

sig end 機制 機器 方式 行程 nbsp 運行時 step GDB(GNU Debugger)是在Unix以及類Unix系統下的調試工具。功能極其強大,幾乎涵蓋了你所需要的全部功能。 GDB主要幫忙你完成下面四個方面的功能: 1.啟動你的程序,可以按照你的定制要求隨

GDB常用命令

產生 add list 調試 align 想要 table 設置斷點 height 命 令 描 述 file 裝入想要調試的可執行文件. kill 終止正在調試的程序. list 列出產生執行文件的源代碼的一部分

GDB常用命令與Visual Studio對比

兩種偵錯程式的字檢查功能一覽表 命令名稱 GDB Visual Studio 執行程式 runs [args] F5:Start Debugging (開始除錯)

gdb常用命令記錄

gdb常用命令 常用命令 啟動專案並斷點 start 打臨時斷點 tb 打斷點 b 列出程式碼 l 單步執行 n 進入函式除錯 step 跳出函式 finish 繼續執行 c 檢視斷點資訊 info b 去掉某個斷點 delete fork的時候進入子程序 set follow-fork-mode

Linux GDB常用命令

Linux GDB 常用命令如下: 1.啟動和退出gdb (1)啟動:gdb ***:顯示一段版權說明; (*** 表示可執行程式名)(2)退出:quit。有的時候輸入quit後會出現相關提示:類似於“(y/n)”,輸入y 2.顯示和查詢程式原始碼 (1)list :顯示

第04課:GDB常用命令詳解(上)

本課的核心內容如下:   run命令   continue命令   break命令   backtrace與frame命令   info break、enable、disable和delete命令   list命令   print和ptype命令 為了結合實踐,這裡以除錯Redis原始碼為例來

linux下gdb常用命令簡介

    file <檔名>   載入被除錯的可執行程式檔案。因為一般都在被除錯程式所在目錄下執行GDB,因而文字名不需要帶路徑。示例:(gdb) file gdb-sample     rRun的簡寫,執行被除錯的程式。如果此前沒有下過斷點,則執行完整個程式;如果有斷點,則程式暫停在第一個可用斷點

GDB常用命令與技巧(超好用的圖形化gdbgui)

目錄 一、常用命令 二、除錯指令碼 三、影象介面 一、常用命令 命令 命令縮寫 命令說明 list l 顯示多行原始碼 break b

Linux除錯工具strace和gdb常用命令小結-轉

最近在Linux環境下做C語言專案,由於是在一個原有專案基礎之上進行二次開發,而且專案工程龐大複雜,出現了不少問題,其中遇到最多、花費時間最長的問題就是著名的“段錯誤”(Segmentation Fault)。藉此機會系統學習了一下,這裡對Linux環境下的段錯誤做個小結,方便以後同類問題的排查與解決。 1

GDB常用命令使用說明(一)

本文由霸氣的菠蘿原創,轉載請註明出處:http://www.cnblogs.com/xsln/p/gdb_instructions1.html GDB(GNU Debugger)是在Unix以及類Unix系統下的除錯工具。功能極其強大,幾乎涵蓋了你所需要的全部功能。 

GDB常用命令使用說明

GDB(GNU Debugger)是在Unix以及類Unix系統下的除錯工具。功能極其強大,幾乎涵蓋了你所需要的全部功能。 GDB主要幫忙你完成下面四個方面的功能: 1.啟動你的程式,可以按照你的定製要求隨心所欲的執行程式。 2.可讓被除錯的程式在你所指定的調置的斷點處停住。

Linux GDB常用命令整理

設定斷點:break *0x7c00break mainbreak main.c:19列出所有斷點info br 刪除斷點delete 5delete 1-10檢視暫存器i rp $pcp $eip檢視區域性變數info locals檢視結構體display (struct

gdb 常用命令整理

除錯程式 編譯時帶上除錯資訊: g++ -g test.cpp -o test 啟動程式: gdb test 檢視core 檔案: gdb test corefile gdb 程序: gdb

GDB常用命令

att 一個 全部 poi bsp shel bre 設置 tac 1.直接按回車鍵表示,重復上一次命令 2.p i=1.改變i的變量值 3.finish 退出函數 4.gdb -c core文件 可執行文件 5.gdb 進程名 PID 6.-d 加入一個源文件的搜索路徑

GDB常用調試命令以及多進程多線程調試

star 調用 次循環 rgs 靈活 機器碼 cor trac 讓我 轉載自:http://blog.csdn.net/freeelinux/article/details/53700266 一:普通命令 1.list命令 list linenum 顯示程序第

GDB常用除錯命令(二)

GDB訊號處理       在GDB中使用handle命令定義一個訊號處理。訊號可以以SIG開頭或不以 SIG開頭,可以用定義一個要處理訊號的範圍(如:SIGIO-SIGKILL,表示處理從SIGIO訊號到SIGKILL的訊號,其中包括SIGIO, SIGIOT,S

linux常用命令以及gcc、gdb、vim的安裝和配置

1.       linux是一個類unix作業系統       vmware--虛擬出一個硬體環境用於安裝一個作業系統       虛擬機器--在vmware中的這個虛擬的這個硬體環境/安裝的這個作業系統       xshell功能:遠端連線到虛擬機器/伺服器上堆虛擬機器

gdb除錯工具常用命令

編譯程式時需要加上-g,之後才能用gdb進行除錯:gcc -g main.c -o main gdb中命令: 回車鍵:重複上一命令 (gdb)help:檢視命令幫助,具體命令查詢在gdb中輸入help + 命令,簡寫h (gdb)run:重新開始執行檔案(run-text:載入文字檔

第03課:GDB常用的調試命令概覽

disable 函數 名稱 read 輸入 文章 int 如果 assemble 先給出一個常用命令的列表,後面結合具體的例子詳細介紹每個命令的用法。 命令名稱      命令縮寫      命令說明 run          r         運行一個程序 co