BBS水木清华站∶精华区

发信人: TJB (老六), 信区: Linux
标  题: GDB (8) Part Three
发信站: BBS 水木调试站 (Wed Jun  3 08:46:33 1998)

发信人: System_Killer@bbs.ustc.edu.cn (大家一起来发呆), 信区: Linux
标  题: gdb(八)
发信站: 中国科大BBS站 (Tue Apr 14 00:22:55 1998)
转信站: SwordHouse!linux.ustc.edu.cn!ustcnews!ustcbbs

设置观察点
==============
   你可以使用观察点来停止一个程序,当某个表达式的值改变时,观察点会将程序
停止。而不需要先指定在某个地方设置一个断点。
   由于观察点的这个特性,使观察点的使用时开销比较大,但在捕捉错误时非常有
用。特别是你不知道你的程序什么地方出了问题时。

`watch EXPR'
     这个命令使用EXPR作为表达式设置一个观察点。GDB将把表达式加入到程序中
并监视程序的运行,当表达式的值被改变时GDB就使程序停止。这个也可以被用在
SPARClite DSU提供的新的自陷工具中。当程序存取某个地址或某条指令时(这个地
址在调试寄存器中指定),DSU将产生自陷。对于数据地址DSU支持'watch'命令,然而
硬件断点寄存器只能存储两个断点地址,而且断点的类型必须相同。就是两个
'rwatch'型断点,或是两个'awatch'型断点。

`rwatch EXPR'
     设置一个观察点,当EXPR被程序读时,程序被暂停。

`awatch EXPR'
     设置一个观察点,当EXPR被读出然后被写入时程序被暂停。这个命令和'awatch'
命令合用。

`info watchpoints'
     显示所设置的观察点的列表,和'info break'命令相似。
     *注意:*在多线程的程序中,观察点的作用很有限,GDB只能观察在一个线程中
的表达式的值如果你确信表达式只被当前线程所存取,那么使用观察点才有效。GDB
不能注意一个非当前线程对表达式值的改变。

断点和异常
==============
   在一些语言中比如象GNU C++,实现了异常处理。你可以使用GDB来检查异常发生的
原因。而且GDB还可以列出在某个点上异常处理的所有过程。

`catch EXCEPTIONS'
     你可以使用这个命令来在一个被激活的异常处理句柄中设置断点。EXCEPTIONS是
一个你要抓住的异常。
     你一样可以使用'info catch'命令来列出活跃的异常处理句柄。
     现在GDB中对于异常处理由以下情况不能处理。
   * 如果你使用一个交互的函数,当函数运行结束时,GDB将象普通情况一样把控制返
回给你。如果在调用中发生了异常,这个函数将继续运行直到遇到一个断点,一个信号
或是退出运行。
   * 你不能手工产生一个异常( 即异常只能由程序运行中产生 )
   * 你不能手工设置一个异常处理句柄。
   有时'catch'命令不一定是调试异常处理的最好的方法。如果你需要知道异常产生的
确切位置,最好在异常处理句柄被调用以前设置一个断点,这样你可以检查栈的内容。
如果你在一个异常处理句柄上设置断点,那么你就不容易知道异常发生的位置和原因。
   要仅仅只在异常处理句柄被唤醒之前设置断点,你必须了解一些语言的实现细节。
比如在GNU C++中异常被一个叫'__raise_exception'的库函数所调用。这个函数的原
型是:

         /* ADDR is where the exception identifier is stored.
            ID is the exception identifier.  */
         void __raise_exception (void **ADDR, void *ID);
要使GDB在栈展开之前抓住所有的句柄,你可以在函数'__raise_exception'上设置断点。
   对于一个条件断点,由于它取决于ID的值,你可以在你程序中设置断点,当某个特
别的异常被唤醒。当有一系列异常被唤醒时,你可以使用多重条件断点来停止你的程序。

--
※ 来源: 中国科大BBS站 [bbs.ustc.edu.cn]
                                按任何键继续 ..

--
※ 来源:·BBS 水木调试站 Leeward.lib.tsinghua.edu.cn·[FROM: 202.200.37.100]

BBS水木清华站∶精华区

本文转自中文Linux论坛