在linux的c編程中大家經(jīng)常用gdb調(diào)試程式,以下是一些常用的指令
1.break FUNCTION 在某個函數(shù)上設(shè)置斷點,。函數(shù)重載時,,有可能同時在幾個重載的函數(shù)上設(shè)置了斷點 break +OFFSET break -OFFSET 在當(dāng)前程式運行到的前幾行或后幾行設(shè)置斷點 break LINENUM 在行號為LINENUM的行上設(shè)置斷點 break FILENAME:LINENUM 在文件名為FILENAME的原文件的第LINENUM行設(shè)置斷點 break FILENAME:FUNCTION 在文件名為FILENAME的FUNCTION函數(shù)上設(shè)置斷點 當(dāng)你的多個文件中可能含有相同的函數(shù)名時必須給出文件名。 break *ADDRESS 在地址ADDRESS上設(shè)置斷點,,這個命令允許你在沒有調(diào)試信息的程式中設(shè)置斷點 break 當(dāng)break命令不包含所有參數(shù)時,,break命令在當(dāng)前執(zhí)行到的程式運行棧中的 下一條指令上設(shè)置一個斷點。除了棧底以外,,這個命令使程式在一旦從當(dāng)前 函數(shù)返回時停止。相似的命令是finish,,但finish并不設(shè)置斷點,。這一點在 循環(huán)語句中非常有用。gdb在恢復(fù)執(zhí)行時,,至少執(zhí)行一條指令,。 break ... if COND 這個命令設(shè)置一個條件斷點,條件由COND指定,;在gdb每次執(zhí)行到此斷點時 COND都被計算當(dāng)COND的值為非零時,,程式在斷點處停止 ignore BNUM COUNT’ 設(shè)置第BNUM號斷點的被忽略的次數(shù)為’COUNT’,即斷點BNUM再執(zhí)行到第COUNT+1 次時程式停止 tbreak ARGS 或簡寫為 tb 設(shè)置斷點為只有效一次,。ARGS的使用同break中的參量的使用 hbreak ARGS 設(shè)置一個由硬件支持的斷點,。這個命令的主要目的是用于對EPROM/ROM程式的調(diào)試 因為這條命令能在不改動代碼的情況下設(shè)置斷點。這能同SPARCLite DSU一起 使用,。當(dāng)程式訪問某些變量和代碼時,,DSU將設(shè)置“陷井”。注意:你只能一次使用 一個斷點,,在新設(shè)置斷點時,,先刪除原斷點 thbreak ARGS’ 設(shè)置只有一次作用的硬件支持?jǐn)帱c rbreak REGEX 在所有滿足表達(dá)式REGEX的函數(shù)上設(shè)置斷點。這個命令在所有相匹配的函數(shù)上設(shè)置無 條件斷點,當(dāng)這個命令完成時顯示所有被設(shè)置的斷點信息,。這個命令設(shè)置的斷點和 break命令設(shè)置的沒有什么不同,。當(dāng)調(diào)試C++程式時這個命令在重載函數(shù)上設(shè)置斷點時 非常有用。 info breakpoints [N] info break [N] info watchpoints [N] 顯示所有的斷點和觀察點的設(shè)置表,,有下列一些列 *Breakpoint Numbers*----斷點號 *Type*----斷點類型(斷點或是觀察點) *Disposition*---顯示斷點的狀態(tài) *Enabled or Disabled*---使能或不使能,。’y’表示使能,’n’表示不使能,。 *Address*----地址,,斷點在你程式中的地址(內(nèi)存地址) *What*---地址,斷點在你程式中的行號,。 如果斷點是條件斷點,,此命令還顯示斷點所需要的條件。 帶參數(shù)N的’info break’命令只顯示由N指定的斷點的信息,。 此命令還顯示斷點的運行信息(被執(zhí)行過幾次),,這個功能在使用’ignore’ 命令時非常有用。你能’ignore’一個斷點許多次,。使用這個命令能查看斷點 被執(zhí)行了多少次,。這樣能更快的找到錯誤。 maint info breakpoints 顯示所有的斷點,,無論是你設(shè)置的還是gdb自動設(shè)置的,。 斷點的含義: breakpoint:斷點,普通斷點 watchpoint:普通觀察點 longjmp:內(nèi)部斷點,,用于處理’longjmp’調(diào)用 longjmp resume:內(nèi)部斷點,,設(shè)置在’longjmp’調(diào)用的目標(biāo)上 until:’until’命令所使用的內(nèi)部斷點 finish:finish’命令所使用的內(nèi)部斷點 2.watch EXPR 為表達(dá)式(變量)expr設(shè)置一個觀察點。一量表達(dá)式值有變化時,,馬上停住程式,。 這個命令使用EXPR作為表達(dá)式設(shè)置一個觀察點。GDB將把表達(dá)式加入到程式中并監(jiān) 視程式的運行,,當(dāng)表達(dá)式的值被改動時GDB就使程式停止,。這個也能被用在SPARClite DSU提供的新的自陷工具中。當(dāng)程式存取某個地址或某條指令時(這個地址在調(diào)試寄 存器中指定),DSU將產(chǎn)生自陷,。對于數(shù)據(jù)地址DSU支持’watch’命令,然而硬件斷點寄 存器只能存儲兩個斷點地址,,而且斷點的類型必須相同。就是兩個’rwatch’型斷點 或是兩個’awatch’型斷點,。 rwatch EXPR’ 設(shè)置一個觀察點,,當(dāng)EXPR被程式讀時,程式被暫停,。 awatch EXPR’ 設(shè)置一個觀察點,當(dāng)EXPR被讀出然后被寫入時程式被暫停,。 info watchpoints 在多線程的程式中,觀察點的作用非常有限,GDB只能觀察在一個線程中的表達(dá)式的值 如果你確信表達(dá)式只被當(dāng)前線程所存取,,那么使用觀察點才有效,。GDB不能注意一個 非當(dāng)前線程對表達(dá)式值的改動。 rwatch <expr> 當(dāng)表達(dá)式(變量)expr被讀時,,停住程式,。 awatch <expr> 當(dāng)表達(dá)式(變量)的值被讀或被寫時,停住程式,。 info watchpoints 列出當(dāng)前所設(shè)置了的所有觀察點,。 3.catch EXCEPTIONS 使用這個命令在一個被激活的異常處理句柄中設(shè)置斷點。EXCEPTIONS是個你要抓住 的異常,。你相同能使用’info catch’命令來列出活躍的異常處理句柄,。 GDB中對于異常處理由以下情況不能處理: * 如果你使用一個交互的函數(shù),當(dāng)函數(shù)運行結(jié)束時,,GDB將象普通情況相同把控制返 回給你,。如果在調(diào)用中發(fā)生了異常,這個函數(shù)將繼續(xù)運行直到遇見一個斷點,,一個信號 或是退出運行,。 * 你不能手工產(chǎn)生一個異常( 即異常只能由程式運行中產(chǎn)生 ) * 你不能手工設(shè)置一個異常處理句柄。 有時’catch’命令不一定是調(diào)試異常處理的最佳的方法,。如果你需要知道異常產(chǎn)生的 確切位置,,最佳在異常處理句柄被調(diào)用以前設(shè)置一個斷點,這樣你能檢查棧的內(nèi)容,。 如果你在一個異常處理句柄上設(shè)置斷點,,那么你就不容易知道異常發(fā)生的位置和原因。 要僅僅只在異常處理句柄被喚醒之前設(shè)置斷點,,你必須了解一些語言的實現(xiàn)細(xì)節(jié)。 3.cont N 第N次經(jīng)過該斷點時才停止程式運行 4.enable 斷點編號 恢復(fù)暫時失活的斷點,,要恢復(fù)多個編號的斷點,,可用空格將編號分開 5.disable 斷點編號 使斷點失效,不過斷點還在 6.delete 斷點編號或表達(dá)式 刪除某斷點 7.clear 斷點所在行號 清除某斷點 8.查看斷點列表 info break 9.watch counter>15 當(dāng)counter>15的時候程式終止 10.當(dāng)程式崩潰的時候linux會生成一個core文件,,能用 gdb a.out core where 查看導(dǎo)致崩潰的原因 11.continue 恢復(fù)程式運行,,直到遇見下一個斷點 12.run 程式開始運行,直到遇見斷點 13.step 執(zhí)行一行代碼 14.next 和s不同的是他不跟蹤到代碼的內(nèi)部,,一步一步執(zhí)行代碼 15.直接回車為執(zhí)行上一個命令 16.print 變量 打印某一變量的值 17.display 變量 每次運行到斷點就顯示變量的值,,用于觀察變量的變化 18.set 變量= 在程式執(zhí)行中重新設(shè)置某變量的值 19.printf "%2.2s\n",(char*)0x120100fa0 結(jié)果打印出:He 20. 設(shè)置gdb的列寬,以下為將屏幕設(shè)置為70列 set width 70 21. info args 列出你程式所接受的命令行參數(shù) info registers列出寄存器的狀態(tài) info breakpoint列出在程式中設(shè)的斷點 要獲得周詳?shù)年P(guān)于info的信息用help info. 22. set 這個命令用來為你的程式設(shè)置一個運行環(huán)境(使用一個表達(dá)式)。 set prompt $把gdb的提示符設(shè)為$. set args 可指定運行時參數(shù),。(如:set args 10 20 30 40 50) show args 命令能查看設(shè)置好的運行參數(shù),。 23. show show命令用來顯示gdb自身的狀態(tài)。 使用’set’命令能改動絕大多數(shù)由’show’顯示的信息 使用show radix命令來顯示基數(shù) 用不帶所有參變量的’set’命令能顯示所有能設(shè)置的變量的值 有三個變量是不能用’set’命令來設(shè)置的: show version顯示gdb的版本號 show copying顯示版權(quán)信息 show warranty顯示擔(dān)保信息 |
|