1. 程式人生 > >GDB 的進入和退出

GDB 的進入和退出

進入和退出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最長見的啟動方式是加一個引數,指出將要除錯的可執行程式:

  1. gdb program  

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

  1. gdb program core  

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

  1. gdb program 1234  

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

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

  1. gdb --args gcc -O2 -c foo.c  

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

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

  1. 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‘。

  1. gdb -ex 'target sim' -ex 'load' /  
  2.    -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

顯示日誌設定的當前值。

相關推薦

GDB進入退出

進入和退出GDB本節討論如何啟動和退出GDB。主要包括: 輸入'gdb’進入GDB偵錯程式輸入quit或者按下Ctrl-d退出呼叫GDB:如何啟動GDB退出GDB:如何退出GDBShell指令碼命令:如何在GDB中使用Shell命令儲存輸出:如何儲存GDB的輸出到一個檔案

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

GDB最新的手冊,每天翻譯一些。 雖水平有限,望造福大家 轉貼請註明出處: http://blog.csdn.net/benson_linux/archive/2009/11/14/4811577.aspx 英文原文: http://sourceware.org/gdb/current/onl

HTML5實現全屏API【進入退出全屏】

現在主流瀏覽器基本上實現了全屏效果,但是不同瀏覽器實現不一樣: 【進入和退出全屏】 // Webkit (works in Safari5.1 and Chrome 15) element.webkitRequestFullScreen(); document.webki

定義Window進入退出效果

    設定Dialog首先通過getWindow()方法獲取它的視窗,然後通過getAttributes()方法獲得window的WindowManager.LayoutParams lp, lp有個公共屬性windowAnimations, 只要把要實現的animatio

Vim進入退出命令

本來不想寫任何關於vim的文章的,無奈我今天又忘記怎麼退出vim了,常用命令是ESC,然後:wq(儲存並退出),:q!(不儲存並強制退出),i進入vim模式。另外還有其它的,我可能都不會用到。。。 按ESC鍵 跳到命令模式,然後: :w 儲存檔案但不

在CMD命令行進入退出Python程序

span python quit size python程序 mil cmd命令 ctr style 進入:   直接輸入python即可 退出:   方法一:輸入exit(),回車   方法二:輸入quit(),回車   方法三:CTRL + Z,回車在CMD命令行進入和

vim-1 vim的模式vim的進入退出

1、vim的模式 基本模式(6) 普通模式、插入模式、可視模式、選擇模式、命令列模式、Ex模式。 派生模式(5) 操作符等待模式、插入普通模式、插入可視模式、插入選擇模式、替換模式。 2、進入插入模式

android中的popupwindow進入退出的動畫

<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/re

【Android】Activity進入退出動畫

方法一:自定義styles.xml檔案,在AndroidManifest.xml清單檔案中註冊android:theme以實現動畫,然後正常啟動頁面即可(application中設定應所有頁面,activity中設定應用單個頁面)注意事項: 1、activityOpenEnterAnimation、activ

Android 正確進入全屏退出全屏的姿勢

進入全屏 private void hideSystemUI() { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI

mac 終端裡進入mysql退出

先在偏好設定裡啟動mysql服務獲取超級許可權在終端輸入程式碼sudo su輸入完後獲取超級許可權 終端顯示 sh-3.2#輸入本機密碼(Apple ID密碼)接著通過絕對路徑登陸 程式碼/usr/local/mysql/bin/mysql -u root -p再輸入mysql密碼(我的密碼設定為root)登

通過CLI命令使ESXi主機進入退出維護模式

vmware esxi 維護模式 1、進入維護模式:方法一:# vim-cmd /hostsvc/maintenance_mode_enter方法二:# esxcli system maintenanceMode set --enable yes方法三:# vimsh -n -e /hostsvc

Spring+Session+interceptor+ajax(攔截器)的登陸退出

register servle output http con cal 異常 header get 方法一使用servlet自帶的HttpSession 註意點: HttpSession應該作為方法的參數 //登入 public boolean customerLo

restframework利用django原生的登錄退出登錄需註意!!

ews 格式 logo str bsp ffffff 原生 elf word class LoginView(views.APIView): """ 用戶登錄 """def post(self, request, *args, **kwargs):

python-selenum3 第三天補充——截圖退出

num mark a10 fir 關閉瀏覽器 roc 進程 Oz cto 截圖 driver = webdriver.Firefox(executable_path = "d:\\geckodriver") driver.get("https://www.baidu.co

PyQt5開發小記,如何實現程序啟動畫面退出提示?

argv qpi spl fin 對象 測試數據 pla widgets 分享 程序啟動畫面: if __name__ == "__main__": ui_style = UIStyle().get_style() app = QtWidgets.QAppl

$?:退出狀態退出狀態碼

mage image pin 遇到 ech bubuko 狀態 例如 執行 $? 變量保存最近的命令退出狀態 進程使用退出狀態來報告成功或失敗 ?0 代表成功,1-255代表失敗 ?例如: ping -c1 -W1 hostdown &> /dev/null

Confluence 6 白名單允許進入禁用

line url ext wrap 禁用 white 情況下 urn 控制臺 允許進入啟用 CORS 請求,將會從特定的 URL 來源中允許進入(Allow Incoming)。URL 格式必須匹配格式 scheme://host[:port],結尾是沒有反斜杠的(:por

MYSQL 用戶登陸退出命令

pre 用戶登陸 oot 用戶名 127.0.0.1 數據 退出 文章 mysql 任何數據庫都有用戶名和密碼,當用戶名登陸後,也可以退出命令,那麽mysql是如何登陸的和退出的呢? 1,用戶登陸 MySQL + 參數

高通方案的Android設備幾種開機模式的進入退出

內容 熱啟動 boot 操作 com 刷機 安裝 tor min 高通方案的Android設備主要有以下幾種開機模式,Android、EDL、Fastboot、Recovery和FFBM,其進入及退出的方式如下表。 開機模式 屏幕表現 冷啟