
GDB 官網(wǎng)https://www.sourceware.org/gdb/GDB 是什么東西GDB, the GNU Project debugger, allows you to see what is going on inside’ another program while it executes – or what another program was doing at the moment it crashed.GDBGNU工程調試器允許你看到另一個程序在執(zhí)行時“內部”發(fā)生了什么 - 或者另一個程序在崩潰時正在做什么。GDB can do four main kinds of things (plus other things in support of these) to help you catch bugs in the act:Start your program, specifying anything that might affect its behavior.Make your program stop on specified conditions.Examine what has happened, when your program has stopped.Change things in your program, so you can experiment with correcting the effects of one bug and go on to learn about another.GDB可以做四種主要的事情以及支持這些事情的其他事情來幫助你發(fā)現(xiàn)錯誤啟動程序并設置參數(shù)。打斷點在特殊情況下停止。檢查程序停止時發(fā)生了什么。執(zhí)行到斷點停止時或crash停止時可以打印當前變量更改程序中的內容以便您可以嘗試更正一個錯誤的影響并繼續(xù)了解另一個錯誤。GDB 支持哪些語言AdaAssemblyCCDFortranGoObjective-COpenCLModula-2PascalRust搭建實驗環(huán)境安裝 gdbyum install gdb 或 apt install gdb檢查 gdb 是否安裝成功gdb --version三種調試方式調試一個二進制文件 gdb a.out調試一個正在運行的進程 gdb -p調試一個掛掉的進程 gdb a.out core文件GDB 命令GDB 命令共有 12 大類類別介紹示例aliases其它命令的別名ni、tpbreakpoints在某個節(jié)點上讓程序停止break、disabledata查看數(shù)據(jù)disassemble、printfiles指定并檢查文件file、listinternals維護指令(GDB維護人員使用)flushregs、maintenanceobscure模糊的特性compile、recordrunning運行程序next、runstack檢查堆棧bt、framestatus狀態(tài)查詢info、showsupport配套設施if、quittracepoints在不停止程序的情況下追蹤程序的執(zhí)行actions、collectuser-defined用戶自定義命令1、運行命令run簡記為 r 其作用是運行程序當遇到斷點后程序會在斷點處停止運行等待用戶輸入下一步的命令。continue簡寫c 繼續(xù)執(zhí)行到下一個斷點處或運行結束 next簡寫 n單步跟蹤程序當遇到函數(shù)調用時也不進入此函數(shù)體此命令同 step 的主要區(qū)別是step 遇到用戶自定義的函數(shù)將步進到函數(shù)中去運行而 next 則直接調用函數(shù)不會進入到函數(shù)體內。 step 簡寫s單步調試如果有函數(shù)調用則進入函數(shù)與命令n不同n是不進入調用的函數(shù)的 until當你厭倦了在一個循環(huán)體內單步跟蹤時這個命令可以運行程序直到退出循環(huán)體。 until行號 運行至某行不僅僅用來跳出循環(huán) finish 運行程序直到當前函數(shù)完成返回并打印函數(shù)返回時的堆棧地址和返回值及參數(shù)值等信息。 call 函數(shù)(參數(shù))調用程序中可見的函數(shù)并傳遞“參數(shù)”如call gdb_test(55)quit簡記為 q 退出gdb2、斷點breakn 簡寫b n:在第n行處設置斷點 可以帶上代碼路徑和代碼名稱 b OAGUPDATE.cpp:578 b fn1ifab條件斷點設置breakfuncbreak縮寫為b在函數(shù)func()的入口處設置斷點如break cb_button delete 斷點號n刪除第n個斷點 disable 斷點號n暫停第n個斷點enable斷點號n開啟第n個斷點clear行號n清除第n行的斷點 info b info breakpoints 顯示當前程序的斷點設置情況 delete breakpoints清除所有斷點3、查看源碼list 簡記為 l 其作用就是列出程序的源代碼默認每次顯示10行。 list 行號將顯示當前文件以“行號”為中心的前后10行代碼如list12list 函數(shù)名將顯示“函數(shù)名”所在函數(shù)的源代碼如list main list 不帶參數(shù)將接著上一次 list 命令的輸出下邊的內容。4、打印表達式print 表達式簡記為 p 其中“表達式”可以是任何當前正在被測試程序的有效表達式比如當前正在調試C語言的程序那么“表達式”可以是任何C語言的有效表達式包括數(shù)字變量甚至是函數(shù)調用。 print a將顯示整數(shù) a 的值 print a將把 a 中的值加1,并顯示出來 print name將顯示字符串 name 的值 print gdb_test(22)將以整數(shù)22作為參數(shù)調用 gdb_test()函數(shù) print gdb_test(a)將以變量 a 作為參數(shù)調用 gdb_test()函數(shù) display 表達式在單步運行時將非常有用使用display命令設置一個表達式后它將在每次單步進行指令后緊接著輸出被設置的表達式及值。如 display awatch表達式設置一個監(jiān)視點一旦被監(jiān)視的“表達式”的值改變gdb將強行終止正在被調試的程序。如watcha whatis 查詢變量或函數(shù) info function 查詢函數(shù) 擴展info locals 顯示當前堆棧頁的所有變量5、查看運行信息where/bt 當前運行的堆棧列表 bt backtrace 顯示當前調用堆棧 up/down 改變堆棧顯示的深度setargs 參數(shù):指定運行時的參數(shù) show args查看設置好的參數(shù) info program 來查看程序的是否在運行進程號被暫停的原因。6、保存歷史命令編輯 ~/.gdbinitvim~/.gdbinit寫入plaintextsethistorysave onsethistoryfilename ~/.gdb_historysethistorysize2000sethistoryexpansion on之后退出 gdb 會自動保存命令下次打開 gdb 上下箭頭可以翻歷史。7、分割窗口layout用于分割窗口可以一邊查看代碼一邊測試 layout src顯示源代碼窗口 layout asm顯示反匯編窗口 layout regs顯示源代碼/反匯編和CPU寄存器窗口 layout split顯示源代碼和反匯編窗口 Ctrl L刷新窗口8、其它功能shell 執(zhí)行終端命令shellls打開日志功能set loggin on