?? program-gdb-g.html
字號:
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Mozilla/4.05 [zh-CN] (X11; I; Linux 2.1.127 i686) [Netscape]">
<title>BBS水木清華站∶精華區(qū)</title>
</head>
<body>
<center>
<h1>
BBS水木清華站∶精華區(qū)</h1></center>
發(fā)信人: TJB (老六), 信區(qū): Linux
<br>標 題: GDB (8) Part Three
<br>發(fā)信站: BBS 水木調(diào)試站 (Wed Jun 3 08:46:33 1998)
<p>發(fā)信人: System_<a href="mailto:Killer@bbs.ustc.edu.cn">Killer@bbs.ustc.edu.cn</a>
(大家一起來發(fā)呆), 信區(qū): Linux
<br>標 題: gdb(八)
<br>發(fā)信站: 中國科大BBS站 (Tue Apr 14 00:22:55 1998)
<br>轉(zhuǎn)信站: SwordHouse!linux.ustc.edu.cn!ustcnews!ustcbbs
<p>設(shè)置觀察點
<br>==============
<br> 你可以使用觀察點來停止一個程序,當某個表達式的值改變時,觀察點會將程序
<br>停止。而不需要先指定在某個地方設(shè)置一個斷點。
<br> 由于觀察點的這個特性,使觀察點的使用時開銷比較大,但在捕捉錯誤時非常有
<br>用。特別是你不知道你的程序什么地方出了問題時。
<p>`watch EXPR'
<br> 這個命令使用EXPR作為表達式設(shè)置一個觀察點。GDB將把表達式加入到程序中
<br>并監(jiān)視程序的運行,當表達式的值被改變時GDB就使程序停止。這個也可以被用在
<br>SPARClite DSU提供的新的自陷工具中。當程序存取某個地址或某條指令時(這個地
<br>址在調(diào)試寄存器中指定),DSU將產(chǎn)生自陷。對于數(shù)據(jù)地址DSU支持'watch'命令,然而
<br>硬件斷點寄存器只能存儲兩個斷點地址,而且斷點的類型必須相同。就是兩個
<br>'rwatch'型斷點,或是兩個'awatch'型斷點。
<p>`rwatch EXPR'
<br> 設(shè)置一個觀察點,當EXPR被程序讀時,程序被暫停。
<p>`awatch EXPR'
<br> 設(shè)置一個觀察點,當EXPR被讀出然后被寫入時程序被暫停。這個命令和'awatch'
<br>命令合用。
<p>`info watchpoints'
<br> 顯示所設(shè)置的觀察點的列表,和'info break'命令相似。
<br> *注意:*在多線程的程序中,觀察點的作用很有限,GDB只能觀察在一個線程中
<br>的表達式的值如果你確信表達式只被當前線程所存取,那么使用觀察點才有效。GDB
<br>不能注意一個非當前線程對表達式值的改變。
<p>斷點和異常
<br>==============
<br> 在一些語言中比如象GNU C++,實現(xiàn)了異常處理。你可以使用GDB來檢查異常發(fā)生的
<br>原因。而且GDB還可以列出在某個點上異常處理的所有過程。
<p>`catch EXCEPTIONS'
<br> 你可以使用這個命令來在一個被激活的異常處理句柄中設(shè)置斷點。EXCEPTIONS是
<br>一個你要抓住的異常。
<br> 你一樣可以使用'info catch'命令來列出活躍的異常處理句柄。
<br> 現(xiàn)在GDB中對于異常處理由以下情況不能處理。
<br> * 如果你使用一個交互的函數(shù),當函數(shù)運行結(jié)束時,GDB將象普通情況一樣把控制返
<br>回給你。如果在調(diào)用中發(fā)生了異常,這個函數(shù)將繼續(xù)運行直到遇到一個斷點,一個信號
<br>或是退出運行。
<br> * 你不能手工產(chǎn)生一個異常( 即異常只能由程序運行中產(chǎn)生 )
<br> * 你不能手工設(shè)置一個異常處理句柄。
<br> 有時'catch'命令不一定是調(diào)試異常處理的最好的方法。如果你需要知道異常產(chǎn)生的
<br>確切位置,最好在異常處理句柄被調(diào)用以前設(shè)置一個斷點,這樣你可以檢查棧的內(nèi)容。
<br>如果你在一個異常處理句柄上設(shè)置斷點,那么你就不容易知道異常發(fā)生的位置和原因。
<br> 要僅僅只在異常處理句柄被喚醒之前設(shè)置斷點,你必須了解一些語言的實現(xiàn)細節(jié)。
<br>比如在GNU C++中異常被一個叫'__raise_exception'的庫函數(shù)所調(diào)用。這個函數(shù)的原
<br>型是:
<p> /* ADDR is where the
exception identifier is stored.
<br>
ID is the exception identifier. */
<br> void __raise_exception
(void **ADDR, void *ID);
<br>要使GDB在棧展開之前抓住所有的句柄,你可以在函數(shù)'__raise_exception'上設(shè)置斷點。
<br> 對于一個條件斷點,由于它取決于ID的值,你可以在你程序中設(shè)置斷點,當某個特
<br>別的異常被喚醒。當有一系列異常被喚醒時,你可以使用多重條件斷點來停止你的程序。
<p>--
<br>※ 來源: 中國科大BBS站 [bbs.ustc.edu.cn]
<br>
按任何鍵繼續(xù) ..
<p>--
<br>※ 來源:·BBS 水木調(diào)試站 Leeward.lib.tsinghua.edu.cn·[FROM: 202.200.37.100]
<center>
<h1>
BBS水木清華站∶精華區(qū)</h1></center>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -