|
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
轉(zhuǎn)載:GDB調(diào)試器使用手冊(cè)(八) |
作者:宇宙飛船 欄目:驅(qū)動(dòng)編程 |
<< GDB調(diào)試器使用手冊(cè)(八) 設(shè)置斷點(diǎn) ============= 使用\"break\"或簡(jiǎn)寫成\"b\"來(lái)設(shè)置斷點(diǎn)。gdb使用環(huán)境變量$bpnum來(lái)記錄你最新設(shè)置的 斷點(diǎn)。 你有不少方法來(lái)設(shè)置斷點(diǎn)。 `break FUNCTION\" 此命令用來(lái)在某個(gè)函數(shù)上設(shè)置斷點(diǎn)。當(dāng)你使用允許函數(shù)重載的語(yǔ)言比如C++時(shí),有可 能同時(shí)在幾個(gè)重載的函數(shù)上設(shè)置了斷點(diǎn)。 `break +OFFSET\" `break -OFFSET\" 在當(dāng)前程序運(yùn)行到的前幾行或后幾行設(shè)置斷點(diǎn)。OFFSET為行號(hào)。 `break LINENUM\" 在行號(hào)為L(zhǎng)INENUM的行上設(shè)置斷點(diǎn)。程序在運(yùn)行到此行之前停止。 `break FILENAME:LINENUM\" 在文件名為FILENAME的原文件的第LINENUM行設(shè)置斷點(diǎn)。 `break FILENAME:FUNCTION\" 在文件名為FILENAME的原文件的名為FUNCTION的函數(shù)上設(shè)置斷點(diǎn)。 當(dāng)你的多個(gè)文件中可能含有相同的函數(shù)名時(shí)必須給出文件名。 `break *ADDRESS\" 在地址ADDRESS上設(shè)置斷點(diǎn),這個(gè)命令允許你在沒有調(diào)試信息的程 序中設(shè)置斷點(diǎn)。 `break\" 當(dāng)\"break\"命令不包含任何參數(shù)時(shí),\"break\"命令在當(dāng)前執(zhí)行到的程 序運(yùn)行棧中的下一條指令上設(shè)置一個(gè)斷點(diǎn)。除了棧底以外,這個(gè)命令使 程序在一旦從當(dāng)前函數(shù)返回時(shí)停止。相似的命令是\"finish\",但\"finish\" 并不設(shè)置斷點(diǎn)。這一點(diǎn)在循環(huán)語(yǔ)句中很有用。 gdb在恢復(fù)執(zhí)行時(shí),至少執(zhí)行一條指令。 `break ... if COND\" 這個(gè)命令設(shè)置一個(gè)條件斷點(diǎn),條件由COND指定;在gdb每次執(zhí)行到此 斷點(diǎn)時(shí)COND都被計(jì)算當(dāng)COND的值為非零時(shí),程序在斷點(diǎn)處停止。這意味著 COND的值為真時(shí)程序停止。...可以為下面所說(shuō)的一些參量。 `tbreak ARGS\" 設(shè)置斷點(diǎn)為只有效一次。ARGS的使用同\"break\"中的參量的使用。 `hbreak ARGS\" 設(shè)置一個(gè)由硬件支持的斷點(diǎn)。ARGS同\"break\"命令,設(shè)置方法也和 \"break\"相同。但這種斷點(diǎn)需要由硬件支持,所以不是所有的系統(tǒng)上這個(gè) 命令都有效。這個(gè)命令的主要目的是用于對(duì)EPROM/ROM程序的調(diào)試。因?yàn)? 這條命令可以在不改變代碼的情況下設(shè)置斷點(diǎn)。這可以同SPARCLite DSU 一起使用。當(dāng)程序訪問某些變量和代碼時(shí),DSU將設(shè)置“陷井”。注意: 你只能一次使用一個(gè)斷點(diǎn),在新設(shè)置斷點(diǎn)時(shí),先刪除原斷點(diǎn)。 `thbreak ARGS\" 設(shè)置只有一次作用的硬件支持?jǐn)帱c(diǎn)。ARGS用法同\"hbreak\"命令。這個(gè)命令 和\"tbreak\"命令相似,它所設(shè)置的斷點(diǎn)只起一次作用,然后就被自動(dòng)的刪除。這 個(gè)命令所設(shè)置的斷點(diǎn)需要有硬件支持。 `rbreak REGEX\" 在所有滿足表達(dá)式REGEX的函數(shù)上設(shè)置斷點(diǎn)。這個(gè)命令在所有相匹配的函數(shù) 上設(shè)置無(wú)條件斷點(diǎn),當(dāng)這個(gè)命令完成時(shí)顯示所有被設(shè)置的斷點(diǎn)信息。這個(gè)命令設(shè) 置的斷點(diǎn)和\"break\"命令設(shè)置的沒有什么不同。這樣你可以象操作一般的斷點(diǎn)一 樣對(duì)這個(gè)命令設(shè)置的斷點(diǎn)進(jìn)行刪除,使能,使不能等操作。當(dāng)調(diào)試C++程序時(shí)這 個(gè)命令在重載函數(shù)上設(shè)置斷點(diǎn)時(shí)非常有用。 `info breakpoints [N]\" `info break [N]\" `info watchpoints [N]\" 顯示所有的斷點(diǎn)和觀察點(diǎn)的設(shè)置表,有下列一些列 *Breakpoint Numbers*----斷點(diǎn)號(hào) *Type*----斷點(diǎn)類型(斷點(diǎn)或是觀察點(diǎn)) *Disposition*---顯示斷點(diǎn)的狀態(tài)。 *Enabled or Disabled*---使能或不使能。\"y\"表示使能,\"n\"表示不使能。 *Address*----地址,斷點(diǎn)在你程序中的地址(內(nèi)存地址) *What*---地址,斷點(diǎn)在你程序中的行號(hào)。 如果斷點(diǎn)是條件斷點(diǎn),此命令還顯示斷點(diǎn)所需要的條件。 帶參數(shù)N的\"info break\"命令只顯示由N指定的斷點(diǎn)的信息。 此命令還顯示斷點(diǎn)的運(yùn)行信息(被執(zhí)行過幾次),這個(gè)功能在使用\"ignore\" 命令時(shí)很有用。你可以\"ignore\"一個(gè)斷點(diǎn)許多次。使用這個(gè)命令可以查看斷點(diǎn) 被執(zhí)行了多少次。這樣可以更快的找到錯(cuò)誤。 gdb允許你在一個(gè)地方設(shè)置多個(gè)斷點(diǎn)。但設(shè)置相同的斷點(diǎn)無(wú)疑是弱智的。不過 你可以使用條件斷點(diǎn),這樣就非常有用。 gdb有時(shí)會(huì)自動(dòng)在你的程序中加入斷點(diǎn)。這主要是gdb自己的需要。比如為了正 確的處理C語(yǔ)言中的\"longjmp\"。這些內(nèi)部斷點(diǎn)都是負(fù)值,以\"-1\"開始。\"info breakpoints\"不會(huì)顯示它們。 不過你可以使用命令’maint info breakpoints\"來(lái)查看這些斷點(diǎn)。 `maint info breakpoints\" 使用格式和\"info breakpoints\"相同,顯示所有的斷點(diǎn),無(wú)論是你設(shè)置的還是 gdb自動(dòng)設(shè)置的。 以下列的含義: `breakpoint\" 斷點(diǎn),普通斷點(diǎn)。 `watchpoint\" 普通觀察點(diǎn)。 `longjmp\" 內(nèi)部斷點(diǎn),用于處理\"longjmp\"調(diào)用。 `longjmp resume\" 內(nèi)部斷點(diǎn),設(shè)置在\"longjmp\"調(diào)用的目標(biāo)上。 `until\" \"until\"命令所使用的內(nèi)部斷點(diǎn)。 `finish\" \"finish\"命令所使用的內(nèi)部斷點(diǎn)。 設(shè)置觀察點(diǎn) ============== 你可以使用觀察點(diǎn)來(lái)停止一個(gè)程序,當(dāng)某個(gè)表達(dá)式的值改變時(shí),觀察點(diǎn)會(huì)將程序 停止。而不需要先指定在某個(gè)地方設(shè)置一個(gè)斷點(diǎn)。 由于觀察點(diǎn)的這個(gè)特性,使觀察點(diǎn)的使用時(shí)開銷比較大,但在捕捉錯(cuò)誤時(shí)非常有 用。特別是你不知道你的程序什么地方出了問題時(shí)。 `watch EXPR\" 這個(gè)命令使用EXPR作為表達(dá)式設(shè)置一個(gè)觀察點(diǎn)。GDB將把表達(dá)式加入到程序中 并監(jiān)視程序的運(yùn)行,當(dāng)表達(dá)式的值被改變時(shí)GDB就使程序停止。這個(gè)也可以被用在 SPARClite DSU提供的新的自陷工具中。當(dāng)程序存取某個(gè)地址或某條指令時(shí)(這個(gè)地 址在調(diào)試寄存器中指定),DSU將產(chǎn)生自陷。對(duì)于數(shù)據(jù)地址DSU支持\"watch\"命令,然而 硬件斷點(diǎn)寄存器只能存儲(chǔ)兩個(gè)斷點(diǎn)地址,而且斷點(diǎn)的類型必須相同。就是兩個(gè) \"rwatch\"型斷點(diǎn),或是兩個(gè)\"awatch\"型斷點(diǎn)。 `rwatch EXPR\" 設(shè)置一個(gè)觀察點(diǎn),當(dāng)EXPR被程序讀時(shí),程序被暫停。 `awatch EXPR\" 設(shè)置一個(gè)觀察點(diǎn),當(dāng)EXPR被讀出然后被寫入時(shí)程序被暫停。這個(gè)命令和\"awatch\" 命令合用。 `info watchpoints\" 顯示所設(shè)置的觀察點(diǎn)的列表,和\"info break\"命令相似。 *注意:*在多線程的程序中,觀察點(diǎn)的作用很有限,GDB只能觀察在一個(gè)線程中 的表達(dá)式的值如果你確信表達(dá)式只被當(dāng)前線程所存取,那么使用觀察點(diǎn)才有效。GDB 不能注意一個(gè)非當(dāng)前線程對(duì)表達(dá)式值的改變。 斷點(diǎn)和異常 ============== 在一些語(yǔ)言中比如象GNU C++,實(shí)現(xiàn)了異常處理。你可以使用GDB來(lái)檢查異常發(fā)生的 原因。而且GDB還可以列出在某個(gè)點(diǎn)上異常處理的所有過程。 `catch EXCEPTIONS\" 你可以使用這個(gè)命令來(lái)在一個(gè)被激活的異常處理句柄中設(shè)置斷點(diǎn)。EXCEPTIONS是 一個(gè)你要抓住的異常。 你一樣可以使用\"info catch\"命令來(lái)列出活躍的異常處理句柄。 現(xiàn)在GDB中對(duì)于異常處理由以下情況不能處理。 * 如果你使用一個(gè)交互的函數(shù),當(dāng)函數(shù)運(yùn)行結(jié)束時(shí),GDB將象普通情況一樣把控制返 回給你。如果在調(diào)用中發(fā)生了異常,這個(gè)函數(shù)將繼續(xù)運(yùn)行直到遇到一個(gè)斷點(diǎn),一個(gè)信號(hào) 或是退出運(yùn)行。 * 你不能手工產(chǎn)生一個(gè)異常( 即異常只能由程序運(yùn)行中產(chǎn)生 ) * 你不能手工設(shè)置一個(gè)異常處理句柄。 有時(shí)\"catch\"命令不一定是調(diào)試異常處理的最好的方法。如果你需要知道異常產(chǎn)生的 確切位置,最好在異常處理句柄被調(diào)用以前設(shè)置一個(gè)斷點(diǎn),這樣你可以檢查棧的內(nèi)容。 如果你在一個(gè)異常處理句柄上設(shè)置斷點(diǎn),那么你就不容易知道異常發(fā)生的位置和原因。 要僅僅只在異常處理句柄被喚醒之前設(shè)置斷點(diǎn),你必須了解一些語(yǔ)言的實(shí)現(xiàn)細(xì)節(jié)。 比如在GNU C++中異常被一個(gè)叫\(zhòng)"__raise_exception\"的庫(kù)函數(shù)所調(diào)用。這個(gè)函數(shù)的原 型是: /* ADDR is where the exception identifier is stored. ID is the exception identifier. */ void __raise_exception (void **ADDR, void *ID); 要使GDB在棧展開之前抓住所有的句柄,你可以在函數(shù)\"__raise_exception\"上設(shè)置斷點(diǎn)。 對(duì)于一個(gè)條件斷點(diǎn),由于它取決于ID的值,你可以在你程序中設(shè)置斷點(diǎn),當(dāng)某個(gè)特 別的異常被喚醒。當(dāng)有一系列異常被喚醒時(shí),你可以使用多重條件斷點(diǎn)來(lái)停止你的程序。 發(fā)布人:netbull 來(lái)自:中國(guó)LINUX開發(fā)聯(lián)盟 |
|
|
免費(fèi)注冊(cè)為維庫(kù)電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 www.udpf.com.cn 浙ICP證030469號(hào) |