在linux的c編程中大家經(jīng)常用gdb調(diào)試程序,,以下是一些常用的指令 1.break FUNCTION 在某個函數(shù)上設(shè)置斷點,。函數(shù)重載時,,有可能同時在幾個重載的函數(shù)上設(shè)置了斷點 break +OFFSET break -OFFSET 在當前程序運行到的前幾行或后幾行設(shè)置斷點 break LINENUM 在行號為LINENUM的行上設(shè)置斷點 break FILENAME:LINENUM 在文件名為FILENAME的原文件的第LINENUM行設(shè)置斷點 break FILENAME:FUNCTION 在文件名為FILENAME的FUNCTION函數(shù)上設(shè)置斷點 當你的多個文件中可能含有相同的函數(shù)名時必須給出文件名,。 break *ADDRESS 在地址ADDRESS上設(shè)置斷點,,這個命令允許你在沒有調(diào)試信息的程序中設(shè)置斷點 break 當break命令不包含任何參數(shù)時,,break命令在當前執(zhí)行到的程序運行棧中的 下一條指令上設(shè)置一個斷點,。除了棧底以外,這個命令使程序在一旦從當前 函數(shù)返回時停止,。相似的命令是finish,但finish并不設(shè)置斷點。這一點在 循環(huán)語句中很有用,。gdb在恢復執(zhí)行時,至少執(zhí)行一條指令,。 break ... if COND 這個命令設(shè)置一個條件斷點,條件由COND指定,;在gdb每次執(zhí)行到此斷點時 COND都被計算當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一起 使用。當程序訪問某些變量和代碼時,,DSU將設(shè)置“陷井”,。注意:你只能一次使用 一個斷點,,在新設(shè)置斷點時,,先刪除原斷點 thbreak ARGS 設(shè)置只有一次作用的硬件支持斷點 rbreak REGEX 在所有滿足表達式REGEX的函數(shù)上設(shè)置斷點,。這個命令在所有相匹配的函數(shù)上設(shè)置無 條件斷點,,當這個命令完成時顯示所有被設(shè)置的斷點信息。這個命令設(shè)置的斷點和 break命令設(shè)置的沒有什么不同,。當調(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)用的目標上 until:until命令所使用的內(nèi)部斷點 finish:finish命令所使用的內(nèi)部斷點 2.watch EXPR 為表達式(變量)expr設(shè)置一個觀察點,。一量表達式值有變化時,,馬上停住程序。 這個命令使用EXPR作為表達式設(shè)置一個觀察點。GDB將把表達式加入到程序中并監(jiān) 視程序的運行,,當表達式的值被改變時GDB就使程序停止。這個也可以被用在SPARClite DSU提供的新的自陷工具中,。當程序存取某個地址或某條指令時(這個地址在調(diào)試寄 存器中指定),DSU將產(chǎn)生自陷。對于數(shù)據(jù)地址DSU支持watch命令,然而硬件斷點寄 存器只能存儲兩個斷點地址,,而且斷點的類型必須相同。就是兩個rwatch型斷點 或是兩個awatch型斷點,。 rwatch EXPR 設(shè)置一個觀察點,當EXPR被程序讀時,,程序被暫停,。 awatch EXPR 設(shè)置一個觀察點,當EXPR被讀出然后被寫入時程序被暫停。 info watchpoints 在多線程的程序中,,觀察點的作用很有限,GDB只能觀察在一個線程中的表達式的值 如果你確信表達式只被當前線程所存取,,那么使用觀察點才有效。GDB不能注意一個 非當前線程對表達式值的改變,。 rwatch <expr> 當表達式(變量)expr被讀時,,停住程序。 awatch <expr> 當表達式(變量)的值被讀或被寫時,,停住程序,。 info watchpoints 列出當前所設(shè)置了的所有觀察點,。 3.catch EXCEPTIONS 使用這個命令在一個被激活的異常處理句柄中設(shè)置斷點,。EXCEPTIONS是一個你要抓住 的異常,。你一樣可以使用info catch命令來列出活躍的異常處理句柄。 GDB中對于異常處理由以下情況不能處理: * 如果你使用一個交互的函數(shù),,當函數(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)細節(jié),。 3.cont N 第N次經(jīng)過該斷點時才停止程序運行 4.enable 斷點編號 恢復暫時失活的斷點,,要恢復多個編號的斷點,,可用空格將編號分開 5.disable 斷點編號 使斷點失效,但是斷點還在 6.delete 斷點編號或者表達式 刪除某斷點 7.clear 斷點所在行號 清除某斷點 8.查看斷點列表 info break 9.watch counter>15 當counter>15的時候程序終止 10.當程序崩潰的時候linux會生成一個core文件,,可以用 gdb a.out core where 查看導致崩潰的原因 11.continue 恢復程序運行,,直到遇到下一個斷點 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 ,(char*)0x120100fa0 結(jié)果打印出:He 20. 設(shè)置gdb的列寬,以下為將屏幕設(shè)置為70列 set width 70 21. info args 列出你程序所接受的命令行參數(shù) info registers列出寄存器的狀態(tài) info breakpoint列出在程序中設(shè)的斷點 要獲得詳細的關(guān)于info的信息用help info. 22. set 這個命令用來為你的程序設(shè)置一個運行環(huán)境(使用一個表達式),。 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顯示擔保信息 |
|
來自: 啟_明_星 > 《GNU文化與技術(shù)》