Linux C 服務端開發教程 二 gdb除錯

2021-10-24 08:44:59 字數 3546 閱讀 1760

gdb的全稱是gnu debuger,是linux 下的一種免費的debug程式,沒有介面,當然linux也有帶介面的比如cgdb、

kdbg、ddd和insight debugger,在使用gdb除錯的時候我們需要在編譯程式的時候生成除錯資訊,比如:

gcc -wall -g3 -o test test.c
gcc生成除錯資訊的一些選項:

-w的意思是關閉編譯時的警告,也就是編譯後不顯示任何warning,因為有時在編譯之後編譯器會顯示一些例如資料轉換之類的警告,這些警告是我們平時可以忽略的。

-wall選項意思是編譯後顯示所有警告。

-w選項類似-wall,會顯示警告,但是只顯示編譯器認為會出現錯誤的警告。

●-g:該選項可以利用作業系統的 「原生格式(native format)」 生成除錯資訊。gdb可以直接利用這個資訊,其它偵錯程式

也可以使用這個除錯資訊

●-ggdb: 使gcc為gdb生成專用的更為豐富的除錯資訊,但是,此時就不能用其他的偵錯程式來進行除錯了(如ddx)

-g和-ggdb也是分級別的

●-g2: 這是預設的級別,此時產生的除錯資訊包括擴充套件的符號表、行號、區域性或外部變數資訊。

●-g3: 包含級別2中的所有除錯資訊,以及源**中定義的巨集,以及c++中的內聯函式(inline) 。

●-g1:級別1 (-g1)不包含區域性變數和與行號有關的除錯資訊,因此只能夠用於回溯跟蹤和堆疊轉儲之用。回溯跟蹤指

的是監視程式在執行過程中的函式呼叫歷史,堆疊轉儲則是-種以原始的十六進製制格式儲存程式執行環境的方法,兩者

都是經常用到的除錯手段。

除錯可執行檔案:

$gdb

program也就是你的執行檔案,一般在當前目錄下。

除錯core檔案(core是程式非法執行後core dump後產生的檔案):

$gdb

$gdb program core.11127

除錯服務程式:

$gdb

$gdb hello 11127

如果你的程式是乙個服務程式,那麼你可以指定這個服務程式執行時的程序id。gdb會自動attach上去,並除錯他。

program應該在path環境變數中搜尋得到。

啟動gdb後,進入到互動模式,通過以下命令完成對程式的除錯;注意高頻使用的命令一般都會有縮寫, 熟練使用這些縮寫

命令能提高除錯的效率;

執行相關命令

●run:簡記為r,其作用是執行程式,當遇到斷點後,程式會在斷點處停止執行,等待使用者輸入下一步的命令,run後可

以帶一些命令,比如我們要除錯brks程式,我們第一步是gdb brks,進入gdb後,我們輸入run log.conf去執行程式。

●continue (簡寫c):繼續執行,到下乙個斷點處(或執行結束)

●next:(簡寫n),單步跟蹤程式,當遇到函式呼叫時,也不進入此函式體;此命令同step的主要區別是,step 遇到

使用者自定義的函式,將步進到函式中去執行,而next則直接呼叫函式,不會進入到函式體內。

●step (簡寫s) :單步除錯如果有函式呼叫,則進入函式;與命令n不同,n是不進入呼叫的函式的。

●until: 當你厭倦了在乙個迴圈體內單步跟蹤時,這個命令可以執行程式直到退出迴圈體。

●until+行號:執行至某行,不僅僅用來跳出迴圈。

●finish:執行程式,直到當前函式完成返回,並列印函式返回時的堆疊位址和返回值及引數值等資訊。

●call:函式(引數):呼叫程式中可見的函式,並傳遞「引數」, 如: call gdb_ test(55)

●quit:簡記為q,退出gdb

設定斷點

●break n (簡寫b n) :在第n行處設定斷點(可以帶上**路徑和行號: b oagupdate cpp:578)

●b fn 1 if a > b:條件斷點設定

●break func (break縮寫為b) :在函式func()的入口處設定斷點,如: break cb_ button

●delete 斷點號n:刪除第n個斷點

●disable 斷點號n:暫停第n個斷點

●enable斷點號n:開啟第n個斷點

●clear 行號n:清除第n行的斷點

●info b (info breakpoints) :顯示當前程式的斷點設定情況

●delete breakpoints:清除所有斷點:

檢視源**

●list: 簡記為1,其作用就是列出程式的源**,預設每次顯示10行。

●list行號:將顯示當前檔案以「行號為中心的前後10行**,如: list 12

●list函式名:將顯示「函式名」所在函式的源**,如: list main

●list: 不帶引數,將接著上- -次list命令的,輸出下邊的內容。

列印表示式

●print表示式:簡記為p,其中"表示式可以是任何當前正在被測試程式的有效表示式,比如當前正在除錯c語言的程

序,那麼「表示式」可以是任何c語言的有效表示式,包括數字,變數甚至是函式呼叫。

●printa:將顯示整數a的值

●print ++a: 將把a中的值加1,並顯示出來

●print name:將顯示字串name的值

●print gdb_ test(22): 將以整數22作為引數呼叫gdb_ test()函式

●print gdb_ test(a): 將以變數a作為引數呼叫gdb_ test()函式

●display表示式:在單步執行時將非常有用,使用display命令設定-個表示式後,它將在每次單步進行指令後,緊接著

輸出被設定的表示式及值。如: display a

●watch表示式:設定乙個監視點,- -旦被監視的「表示式的值改變,gdb將強行終止正在被除錯的程式。如: watch a

●whatis :查詢變數或函式

●info function:查詢函式

●擴充套件info locals: 顯示當前堆疊頁的所有變數

查詢執行資訊

●where/bt :當前執行的堆疊列表;

●bt backtrace顯示當前呼叫堆疊

●up/down改變堆疊顯示的深度

●set args引數:指定執行時的引數

●show args:檢視設定好的引數

●info p: 來檢視程式的是否在執行,程序號,被暫停的原因。

分割視窗

●layout: 用於分割視窗,可以一邊檢視**,- -邊測試:

●layout src: 顯示源**視窗

●layout asm:顯示反彙編視窗

●layout regs: 顯示源**/反彙編和cpu暫存器視窗

●layout split:顯示源**和反彙編視窗

●ctrl+l: 重新整理視窗

遊戲服務端開發 二

應用伺服器的設計 上 應用伺服器的工作有 0 同步廣播玩家的行為 1作為第三方對玩家個體和玩家之間互動行為計算,並將計算結果推送到資料儲存系統 2驅動遊戲中的 npc 3作為乙個特殊的遊戲參與者,與玩家相互作用。應用伺服器最重要的工作莫過於同步廣播玩家之間的行為,使玩家之間能夠互視,多人同時遊戲才有...

Serv U FTP服務端使用教程

serv u ftp server是一種被廣泛運用的ftp伺服器端軟體,可以設定多個ftp伺服器 限定登入使用者的許可權 登入主目錄及空間大小等,功能非常完備。具有非常完備的安全特性,支援ssl ftp傳輸,支援在多個serv u和ftp客戶端通過ssl加密連線保護您的資料安全等。做個人的 ftp ...

服務端開發規範Restful

規範了url,提交方式的語義。遵守restful規範,有些東西不言而喻,減少前後端不必要的交流。舉例提交方式 位址說明 get 查 http localhost 8080 book 1查詢id為1的書 post 增 http localhost 8080 book 1新增一本id1的書 delete...