1. 程式人生 > >GDB 7.0 中文手冊 —— 2. 進入和退出GDB

GDB 7.0 中文手冊 —— 2. 進入和退出GDB

GDB最新的手冊,每天翻譯一些。

雖水平有限,望造福大家

轉貼請註明出處:

http://blog.csdn.net/benson_linux/archive/2009/11/14/4811577.aspx


英文原文:
http://sourceware.org/gdb/current/onlinedocs/gdb_toc.html

2 進入和退出GDB

本節討論如何啟動和退出GDB。主要包括:

  • 輸入’gdb’進入GDB偵錯程式
  • 輸入quit或者按下Ctrl-d退出
  • 呼叫GDB:如何啟動GDB
  • 退出GDB:如何退出GDB
  • Shell指令碼命令:如何在GDB中使用Shell命令
  • 儲存輸出:如何儲存GDB的輸出到一個檔案

2.1 呼叫GDB

通過執行gdb啟動GDB偵錯程式。一旦執行,GDB將從終端中讀入命令直到GDB退出。

GDB支援多種選項和引數來定製GDB的除錯環境。我們這裡討論的命令列選項覆蓋多種情況,在有的平臺上,可能不支援有些選項。

GDB最長見的啟動方式是加一個引數,指出將要除錯的可執行程式:

[c-sharp] view plain copy print?
  1. gdb program  
gdb program

也可以指定可執行程式和核心轉儲檔案作為其引數:

[c-sharp] view plain copy print?
  1. gdb program core  
gdb program core

如果我們想除錯一個正在執行的程式,也可將上邊命令中的第二個引數用程序ID號代替:

[c-sharp] view plain copy print?
  1. gdb program 1234  
gdb program 1234

這樣,GDB將附著在程序號為1234的程序上(除非你恰巧有個檔案叫1234;那麼GDB會首先認為這是個核心轉儲檔案,然後嘗試載入)。上邊的命令中,第二個引數是高階功能,需要完整的作業系統平臺支援;當你使用GDB連線到一塊裸板上作為遠端偵錯程式時,板子上可能沒有程序的概念,並且不能獲取核心轉儲檔案。此時,GDB將警告你不能附著程序或者不能讀取核心轉儲檔案。

想讓GDB停止引數解析,並將引數傳入將要除錯的程式中?”–args”引數可以做到,它會阻止GDB解析命令列引數:

[c-sharp] view plain copy print?
  1. gdb –args gcc -O2 -c foo.c  
gdb –args gcc -O2 -c foo.c

上邊的命令執行GDB除錯gcc,並且將引數`-O2 -c foo.c’傳入gcc程式(詳見被除錯程式引數 )。

如果你不想讓GDB啟動時列印授權資訊,可以使用-silent引數:

[c-sharp] view plain copy print?
  1. gdb -silent  
gdb -silent

更多的GDB啟動資訊,輸入“gdb –help”或者“gdb -h“檢視。所有的GDB引數都是順序處理的,通過使用’-x’引數可以改變處理順序。

  • 檔案選項:選擇檔案
  • 模式選項:選擇模式
  • 啟動過程:GDB啟動時都做了什麼

2.1.1 檔案引數選擇

GDB啟動時,除了選項外,命令列中的任何引數都會被認為是除錯程式和核心轉儲檔案引數(或者程序ID號)。這跟用’-se‘和’-c’(或’-p’)選項分別指定效果一樣。(實際上,GDB會把它讀入的第一個沒有跟任何選項關聯的引數關聯到’-se’選項上;同時第二個沒有跟任何選項關聯的引數關聯到‘-c’/‘-p’選項上。)如果第二個沒有跟任何選項關聯的引數以’.’開頭,GDB會認為這個引數是個程序號,然後嘗試附著,如果失敗,才會嘗試將它作為一個轉儲檔案開啟。如果你碰巧有個以’.’開頭的核心轉儲檔案的話,加入’./’字首可以避免GDB將它作為一個進場號對待。如:./12345。

如果GDB配置時,沒有支援核心轉儲檔案的讀入,例如在一些嵌入式平臺上。那麼它會抱怨有兩個引數,並且忽略第二個引數。

很多選項有長參形式和短參形式,以下列表描述了他們的關係。只要能夠區別選項,GDB也允許在長參形式下,你輸入一部分選項名,如–help,我們只輸入-hel。(如果你喜歡,也可以用’-‘代替’–‘,所以我們這裡只列出一些常用的情況)

-symbols file

-s file

file 中讀入符號表。

-exec file

-e file

指定檔案file 為待除錯檔案,也可以和核心轉儲檔案結合使用來檢查資料。GDB不會從它裡邊讀符號表。

-se file

指定檔案file 為待除錯的檔案,並從中讀入符號表。

-core file

-c file

指定檔案file 為核心轉儲檔案。

-pid number

-p number

掛接程序號為number 的程序,就像attach命令一樣。

-command file

-x file

執行檔案file 中的GDB命令。參考命令檔案

-eval-command command

-ex command

執行一個GDB命令。

這個選項常用於多次執行多個命令,並且允許插入’-command‘。

[c-sharp] view plain copy print?
  1. gdb -ex ‘target sim’ -ex ‘load’ /  
  2.    -x setbreakpoints -ex ’run’ a.out
gdb -ex ‘target sim’ -ex ‘load’ / -x setbreakpoints -ex ‘run’ a.out

-directory directory

-d directory

新增原始檔和指令碼的搜尋路徑。

-r

-readnow

預設情況下,GDB啟動時只讀入少數必須的入口符號資訊,然後根據需要不斷讀入符號。本選項迫使GDB啟動時立即讀入各個符號檔案的全部符號,這樣做雖然啟動速度慢了,但後繼的操作會比較快。

2.1.2 選擇模式

GDB有多種可選的工作模式——如,批處理模式或者靜音模式。

-nx

-n

不執行任何初始化檔案中的命令。一般情況下,GDB處理完命令列選項和引數後,會執行初始化檔案中的命令。參考命令檔案

-quiet

-silent

-q

“Quiet”。不列印引言和版權資訊,這些資訊在批處理模式中也會被遮蔽掉。

-batch

執行批處理模式。執行’-x’選項指定的命令檔案(如果沒有’-n’選項遮蔽的話,也包括初始化檔案)中的命令,成功後GDB退出值為0。如果在執行過程中產生錯誤,退出值非零。

在把GDB當作一個過濾器時,批處理模式可能是有用的。例如在另一個計算機上下載和執行一個程式。為了使這個方式更有用,這條訊息

Program exited normally.

(無論執行在GDB控制下的程式什麼時候結束,這條訊息一般會顯示出來)在執行批處理模式時並不會被顯示出來。

-batch-silent

執行在批處理模式下,很像`-batch’模式,但是它是完全安靜的。所有GDB輸出到stdout 的都會被禁止(stderr則不受影響)。這比`-silent’更安靜一些,在互動式的會話中 它沒有什麼用處。
例如,當使用的目標機系統平臺給出`Loading section’相關資訊時,這個選項就是特別有用的。(沒見過,估計相關段資訊比較多)

注意,對於那些通過GDB(而不是直接向標準輸出)列印輸出資訊的系統平臺,本選項也會遮蔽這些資訊。

-return-child-ersult

GDB的返回碼將是子程序的返回碼(子程序指被除錯程序)。以下情況例外:

  • GDB非正常退出。例如由於一個不正確的引數或一個內部錯誤。在這種情況下,退出碼和沒有`-return-child-result’時是一樣的。
  • 使用者使用一個顯式的值退出。例如`quit 1’。
  • 子程序從沒執行,或者沒有終止。在這種情況下,退出碼是-1。

當GDB被作為一個遠端程式裝載器或者模擬器介面時,這個選項當和`-batch’或`-batch-silent’一起使用非常有用。

-nowindows

-nw

“沒有視窗”。如果GDB編譯時內建有影象使用者介面(GUI),這個選項告訴GDB只使用命令列介面。如果沒有GUI可用,這個選項不起作用。

-windows

-w

如果GDB包括一個GUI,這個選項要求GDB儘可能使用它。

-cd directory

代替當前的目錄,在GDB執行時使用directory作為它的工作目錄。

-fullname

-f

在GNU Emacs編輯器中呼叫GDB時,Emacs會設定這個選項,使GDB以一種標準的、可識別的格式顯示棧幀資訊(該資訊會在每次GDB觸發斷點時顯示)。這個格式看起來像是以2個’/032’字元開頭,後邊跟著以冒號分隔的檔名、行號和字元位置字串,然後以換行結尾。Emacs-to-GDB程式介面以兩個’/032’作為棧幀列印原始碼的標誌。

-epoch

在Epoch Emacs-GDB中呼叫GDB時,會設定本選項。它告訴GDB修改它的列印功能,以使Epoch在一個單獨的視窗中顯示錶達式的值。

-annotate level

該選項設定GDB內部的註釋level ,它和’set annotate level ‘(參考註釋 )的效果一樣。註釋級別控制著GDB列印提示符、表示式值、原始碼和其他輸出資訊時,附加註釋資訊的多/少。級別0是常規級別,級別1用於GNU Emacs呼叫GDB時,級別3表示輸出最多的註釋資訊,可用於適應任何想控制GDB輸出的程式。級別2已經不再使用。

這種註釋機制很大程度上已經被GDB/MI代替(參見GDB/MI介面 )。

–args

改變GDB對命令列的解析過程,使跟在可執行檔案後的引數被處理為命令列引數傳遞給可執行檔案。 這個選項阻止了選項處理。

-baud bps

設定被GDB用來遠端除錯的任何串列埠的行速率(波特率或者每秒的位數)。

-l timeout

設定被GDB用來遠端除錯的任何通訊的超時時間(以秒為單位)。

-t device

使用device作為你程式的標準輸入和輸出。

-tui

啟動時啟用文字使用者操作介面(the Text User Interface)。該介面操作介面管理終端上的多個文字介面視窗,顯示程式碼的、顯示彙編程式碼的、暫存器值的和GDB命令輸出視窗(參考GDB 文字使用者介面 )。

啟動’gdbtui‘程式時,也會啟用文字使用者介面。但不要在GNU Emacs中啟動GDB時使用本引數(參考在GNU Emacs中使用GDB )。

-interpreter interp

使用直譯器interp作為控制程式或裝置的介面。這個選項被使用GDB作為一個後端 並和它通訊的程式設定。參見命令解釋一節

`–interpreter=mi’(or `–interpreter=mi2’)使GDB使用GDB6.0版本中包含的GDB/MI介面(參見GDB/MI介面一節 );5.3版本和之前的版本中包含GDB/MI介面和`–interpreter=mi1 ‘已被廢棄。

-write

開啟可執行檔案和core檔案,使它們可讀可寫。這和GDB裡的`set write on’命令一樣( 參見修改程式一節 )。

-statistics

這個選項使GDB每次完成一條命令返回到提示符時,列印有關時間和記憶體利用率的統計資訊 。

-version

這個選項使GDB列印它的版本號和免責宣告,並退出。

2.1.3 GDB啟動過程

這裡描述了GDB在會話啟動期間做了哪些事情:

  1. 設定命令列選項指定的命令列直譯器。(參考直譯器
  2. 從你的gdb通用初始化檔案(如果GDB編譯時制定了–with-system-gdbinit選項;參考System-wide configuration and settings )並且執行檔案中的所有命令。 
  3. 從你的主目錄-1 讀取初始化檔案(如果有的話)並且執行檔案中的所有命令。 
  4. 處理命令列選項和運算元。
  5. 在當前的工作目錄讀取初始化檔案(如果有的話)並執行其中的命令。這隻有在當前 的目錄和你的主目錄不同的情況下才會被做。因此,你可以有多於一個初始化檔案,一個是在你主目錄下的通用初始化檔案,另一個是在你呼叫GDB的目錄下特定於你除錯的程式的初始化檔案。 
  6. 讀取用`-x’選項指定的命令檔案。參見命令檔案一節 ,來獲取關於GDB命令 檔案更詳細的內容。
  7. 讀取在history 檔案中記錄的命令歷史。參見命令歷史一節 ,來獲取關於 命令歷史和GDB記錄它的檔案更詳細的內容。

初始化檔案使用和command files 同樣的語法(參見命令檔案一節 ),它也被GDB用同樣的方式處理。在你主目錄中的初始化檔案可以設定選項(諸如`set complaints’ ),這些選項影響後面的命令列選項和操作書的處理。如果你使用`-nx’選項,則初始化檔案不會被執行(參見選擇檔案一節)。

我們可以使用gdb –help來檢視,GDB啟動時都載入了哪些檔案。

GDB初始化檔案一般被稱為`.gdbinit’。由於DOS系統對檔名的限制,DJGPP(一個早期的GNU C系統開發工具,和DOS一個時代)上移植的GDBgdb.ini。Windows系統上移植的GDB使用一種標準的檔名,不過當他們檢測到gdb.ini時,也會警告你,並建議你把這個檔名改為標準的名字。

腳註

[1] 在DOS/Windows系統上,主目錄有環境變數HOME指定。

2.2 退出GDB

quit [expression ]

q

使用quit命令(縮寫為q)退出GDB,或者鍵入一個檔案結束符字元(一般是C-d)。如果你 不提供一個expression,GDB將正常退出,否則它將會把expression的結果當作錯誤碼退出 。

一箇中斷(通常是C-c)並不從GDB中退出,而是結束正在執行的任何GDB命令然後返回到GDB命令級別。在任何時候鍵入中斷字元都是安全的,這是因為當GDB處於安全的狀態下它才會 讓中斷字元起作用。

如果你已經讓GDB繫結在一個程序或裝置上,並控制它的行為,可以使用detach命令釋放它(參看除錯一個執行的程序一節 )。

2.3 Shell命令

如果在你除錯會話期間,你需要執行臨時的shell命令,這不需要離開或掛起GDB,你只需使用shell命令即可。

shell command string

呼叫一個標準的shell來執行command string。如果環境變數SHELL存在,它會決定 哪一個shell會允許。否則GDB會使用一個預設的shell(在Unix系統上是`/bin/sh’,在 MS-DOS等系統上是`COMMAND.COM’)。

在開發環境中經常需要make工具。在GDB中你不需要為了這個目的而使用shell命令:

make make-args

用指定的引數執行make程式。這等同於`shell make make-args’。

2.4 儲存輸出資訊

你可能想儲存GDB命令的輸出到一個檔案中去。這裡有幾個命令來控制GDB的記錄功能。

set logging on

開啟記錄功能。

set logging off

關閉記錄功能。

set logging file file

改變當前日誌檔案的名稱。預設的日誌檔案是`gdb.txt’。

set logging overwrite [on|off]

預設情況下,GDB會新增到日誌檔案中。如果你set logging on想覆蓋掉日誌檔案, 就設定overwrite。

set logging redirect [on|off]

預設情況下,GDB會輸出到終端和日誌檔案。如果你想僅僅輸出到日誌檔案,設定redirect。

show logging

顯示日誌設定的當前值。