CTF工具-gdb简介
gdb簡介
gdb是 GNU 開發(fā)的一個(gè)Unix/Linux下強(qiáng)大的程序調(diào)試工具。
使用 gdb 進(jìn)行程序調(diào)試之前,gcc編譯選項(xiàng)加上 -g 選項(xiàng)來講調(diào)試信息加到可執(zhí)行文件里
一般來說,GDB主要幫助你完成下面四個(gè)方面的功能:
1、啟動(dòng)你的程序,可以按照你自定義的要求隨心所欲的運(yùn)行程序。
2、可以讓調(diào)試程序在你所指定的位置的斷點(diǎn)處停止。
3、當(dāng)程序停止時(shí),可以檢查此時(shí)你的程序里所發(fā)生的事情。
最后,動(dòng)態(tài)的改變你程序的執(zhí)行環(huán)境。
使用GDB
一般來說GDB主要調(diào)試的是C/C++程序。要調(diào)試C/C++程序,首先在編譯時(shí),我們需要把調(diào)試信息加到可執(zhí)行文件里。使用編譯器(cc/gcc/g++)的-g參數(shù)可以做到這一點(diǎn),如:
$ cc –g hello.c –o hello
$ g++ -g hello.cpp –o hello
如果沒有-g,你將看不見程序的函數(shù)名,變量名,所代替的全是運(yùn)行的內(nèi)存地址。當(dāng)你用-g把調(diào)試信息假如之后,并成功編譯目標(biāo)代碼以后,可以用GDB調(diào)試它。
一.運(yùn)行
| continue (簡寫c ) | 繼續(xù)執(zhí)行,到下一個(gè)斷點(diǎn)處(或運(yùn)行結(jié)束) |
| next(簡寫 n) | 單步跟蹤程序,當(dāng)遇到函數(shù)調(diào)用時(shí),也不進(jìn)入此函數(shù)體;此命令同 step 的主要區(qū)別是,step 遇到用戶自定義的函數(shù),將步進(jìn)到函數(shù)里去運(yùn)行,而 next 則直接調(diào)用函數(shù),不會(huì)進(jìn)入到函數(shù)體內(nèi)。 |
| step(簡寫s) | 單步調(diào)試如果有函數(shù)調(diào)用,則進(jìn)入函數(shù);與命令n不同,n是不進(jìn)入調(diào)用的函數(shù)的 |
| until | 當(dāng)你厭倦了在一個(gè)循環(huán)體內(nèi)單步跟蹤時(shí),這個(gè)命令可以運(yùn)行程序直到退出循環(huán)體。 |
| until+行號(hào) | 運(yùn)行至某行,不僅僅用來跳出循環(huán) |
| finish | 運(yùn)行程序,直到當(dāng)前函數(shù)完成返回,并打印函數(shù)返回時(shí)的堆棧地址和返回值及參數(shù)值等信息。 |
| call函數(shù)(參數(shù)) | 調(diào)用程序里可見的函數(shù),并傳遞“參數(shù)”,如:call gdb_test(55) |
| quit(簡記為 q) | 退出gdb |
二.設(shè)置斷點(diǎn)
| b fn1 if a>b | 條件斷點(diǎn)設(shè)置 |
| break func(break縮寫為b) | 在函數(shù)func()的入口處設(shè)置斷點(diǎn),如:break cb_button |
| delete 斷點(diǎn)號(hào)n | 刪除第n個(gè)斷點(diǎn) |
| disable 斷點(diǎn)號(hào)n | 暫停第n個(gè)斷點(diǎn) |
| enable 斷點(diǎn)號(hào)n | 開啟第n個(gè)斷點(diǎn) |
| clear 行號(hào)n | 清除第n行的斷點(diǎn) |
| info b (info breakpoints) | 顯示當(dāng)前程序的斷點(diǎn)設(shè)置情況 |
| delete breakpoints | 清除所有斷點(diǎn) |
三.查看源代碼
| list 行號(hào) | 將顯示當(dāng)前文件以“行號(hào)”為核心的前后10行代碼,如:list 12 |
| list 函數(shù)名 | 將顯示“函數(shù)名”所在函數(shù)的源代碼,如:list main |
| list | 不帶參數(shù),將接著上一次 list 命令的,輸出下邊的內(nèi)容。 |
四.打印表達(dá)式
| print a | 將顯示整數(shù) a 的值 |
| print ++a | 將把 a 里的值加1,并顯示出來 |
| print name | 將顯示字符串 name 的值 |
| print gdb_test(22) | 將以整數(shù)22作為參數(shù)調(diào)用 gdb_test() 函數(shù) |
| print gdb_test(a) | 將以變量 a 作為參數(shù)調(diào)用 gdb_test() 函數(shù) |
| display 表達(dá)式 | 在單步運(yùn)行時(shí)將非常有用,使用display命令設(shè)置一個(gè)表達(dá)式后,它將在每次單步進(jìn)行指令后,緊接著輸出被設(shè)置的表達(dá)式及值。如: display a |
| watch 表達(dá)式 | 設(shè)置一個(gè)監(jiān)視點(diǎn),一旦被監(jiān)視的“表達(dá)式”的值改變,gdb將強(qiáng)行終止正在被調(diào)試的程序。如: watch a |
| whatis | 查詢變量或函數(shù) |
| info function | 查詢函數(shù) |
| 擴(kuò)展info locals | 顯示當(dāng)前堆棧頁的所有變量 |
五.查詢運(yùn)行信息
| bt backtrace | 顯示當(dāng)前調(diào)用堆棧 |
| up/down | 改變堆棧顯示的深度 |
| set args 參數(shù) | 指定運(yùn)行時(shí)的參數(shù) |
| show args | 查看設(shè)置好的參數(shù) |
| info program | 來查看程序的是否在運(yùn)行,進(jìn)程號(hào),被暫停的原因 |
總結(jié)
以上是生活随笔為你收集整理的CTF工具-gdb简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java jackson 注解,java
- 下一篇: 2018北京大学计算机考研分数线,201