Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1299744
  • 博文数量: 554
  • 博客积分: 10425
  • 博客等级: 上将
  • 技术积分: 7555
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-09 09:49
文章分类

全部博文(554)

文章存档

2012年(1)

2011年(1)

2009年(8)

2008年(544)

分类:

2008-04-11 16:37:24

 

 


第6 章• 执行控制49
::events [-av]
$b [-av]
用于显示软件事件说明符的列表。针对每个事件说明符都会指定一个唯一的ID 号,稍
后可以使用该编号对其进行删除或修改。调试器可能还会启用自己的内部事件进行跟踪
;仅当存在-a 选项时,才会显示这些内部事件。如果存在-v 选项,则将显示更详细的
内容,其中包括任何说明符不活动的原因。以下的::events dcmd 显示了示例输出:
> ::events
ID S TA HT LM Description Action
----- - -- -- -- ---------------------------------------- -------------
[ 1 ] - T 1 0 stop on SIGINT -
[ 2 ] - T 0 0 stop on SIGQUIT -
[ 3 ] - T 0 0 stop on SIGILL -
...
[ 11] - T 0 0 stop on SIGXCPU -
[ 12] - T 0 0 stop on SIGXFSZ -
[ 13] - 2 0 stop at libc‘printf ::echo printf
>
以下讨论说明了每列的含义。使用::help events 可以显示此信息的摘要。
ID 事件说明符的标识符。如果启用了说明符,则将在方括号[ ] 中显示标识
符;如果禁用了说明符,则在圆括号( ) 中显示标识符;如果当前在与指
定说明符匹配的事件上停止了目标程序,则在尖括号<>中显示标识符。
S 事件说明符的状态。状态将是以下符号之一:
- 事件说明符处于空闲状态。如果没有任何目标程序运行,则表明所有说明
符都处于空闲状态。目标程序正在运行时,如果无法评估说明符,则表明
该说明符可能处于空闲状态(如尚未装入的共享对象中的延迟断点)。
+ 事件说明符处于活动状态。继续执行目标时,调试器将检测到此类型的事
件。
* 事件说明符处于待命状态。此状态意味着目标当前正在运行,并且可检测
到此类型的事件。仅当使用-o nostop 选项将调试器附加到正在运行的程序
时,此状态才可见。
内置dcmd
50 Solaris 模块调试器指南• 2006 年11 月
! 由于出现操作系统错误,事件说明符未处于待命状态。可以使用::events
-v 选项显示有关检测失败原因的更多信息。
TA “临时”、“粘滞”和“自动”事件说明符的属性。可能显示以下符号
中的一个或多个:
t 事件说明符是临时的,无论它是否匹配,下次目标停止时都会将其删除。
T 事件说明符是粘滞说明符,不会被::delete all 或:z 删除。通过将其id 号
显式指定为::delete,可以删除该说明符。
d 命中计数等于命中限制时,将自动禁用事件说明符。
D 命中计数等于命中限制时,将自动删除事件说明符。
s 命中计数等于命中限制时,目标将自动停止。
HT 当前的命中计数。此列显示自创建此事件说明符以来对应软件事件在目
标中发生的次数。
LM 当前的命中限制。此列显示自动禁用、自动删除或自动停止行为将生效
的命中计数限制。可以使用::evset dcmd 配置这些行为。
Description 对给定的说明符所匹配的软件事件类型的说明。
Action 对应软件事件发生时要执行的回调字符串。系统将执行此回调,就好像
已在命令提示符下键入了它一样。
id ::evset [+/-dDestT] [-c cmd] [-n count] id ...
用于修改一个或多个软件事件说明符的属性。将设置由dcmd 前面的可选表达式和dcmd
后面的可选参数列表所标识的每个说明符的属性。除非指定显式基数,否则参数列表将
被解释为十进制整数的列表。::evset dcmd 可识别以下选项:
-d 当命中计数达到命中限制时,禁用事件说明符。如果指定了该选项的+d 形式,则
会禁用此行为。禁用事件说明符后,调试器便会删除任何对应检测并忽略对应的
软件事件,直到随后重新启用说明符为止。如果-n 选项不存在,则会立即禁用说
明符。
-D 当命中计数达到命中限制时,删除事件说明符。如果指定了该选项的+D 形式,则
会禁用此行为。-D 选项优先于-d 选项。可以使用-n 选项配置命中限制。
-e 启用事件说明符。如果指定了该选项的+e 形式,则会禁用说明符。
-s 当命中计数达到命中限制时,停止目标程序。如果指定了该选项的+s 形式,则会
禁用此行为。-s 行为通知调试器就像在每次执行说明符回调后发出::cont 那样进
行操作,但第N次执行除外,其中N是说明符命中限制的当前值。-s 选项优先于
-D 选项和-d 选项。
内置dcmd
第6 章• 执行控制51
-t 将事件说明符标记为临时说明符。无论临时说明符是否由于对应于指定说明符的
软件事件而停止,下次目标停止时都会自动将其删除。如果指定了该选项的+t 形
式,则会删除临时标记。-t 选项优先于-T 选项。
-T 将事件说明符标记为粘滞。粘滞说明符不会被::delete all 或:z 删除。通过将对
应的说明符ID 指定为::delete 的显式参数,可以将其删除。如果指定了该选项的
+T 形式,则会删除粘滞属性。缺省的一组事件说明符最初都标记为粘滞。
-c 每次目标程序中发生对应软件事件时,执行指定的cmd 字符串。可以使用
::events 显示当前的回调字符串。
-n 将命中限制的当前值设置为count。如果当前未设置任何命中限制,并且-n 选项
未附带-s 或-D,则命中限制将被设置为1。
使用::help evset 可以显示此信息的摘要。
flt ::fltbp [+/-dDestT] [-c cmd] [-n count] flt ...
用于跟踪指定的计算机故障。使用dcmd 前面的可选故障编号或者dcmd 后面的故障名称
或编号的列表(请参见)来标识故障。-d、-D、-e、-s、-t、-T、-c 和-n
选项具有与用于::evset dcmd 时相同的含义。::fltbp 命令仅适用于用户进程调试。
signal :i
如果目标是实时用户进程,请忽略指定的信号,并允许以透明方式将其传送到目标。将
从跟踪的事件列表中删除跟踪指定信号传送的所有事件说明符。缺省情况下,忽略的信
号集会初始化为导致进程缺省情况下转储核心的信号集的补充(请参见signal(3HEAD)
手册页),但SIGINT 除外,缺省情况下将跟踪此信号。:i 命令仅适用于用户进程调
试。
$i
显示调试器忽略的将直接由目标处理的信号的列表。使用::events dcmd 可以获取有关
跟踪的信号的更多信息。$i 命令仅适用于用户进程调试。
::kill
:k
如果目标是实时用户进程,则强制将其终止。如果目标是调试器使用::run 创建的,则
在调试器退出时,也将强制终止该目标。::kill 命令仅适用于用户进程调试。
$l
如果目标是用户进程,则列显代表线程的LWPID。
$L
如果目标是用户进程,则列显该目标中每个LWP 的LWPID。
::next [SIG]
:e [SIG]
一次执行目标程序的一条指令,但步过子例程调用。如果将可选的信号名称或编号(请
参见signal(3HEAD) 手册页)指定为参数,则信号会在其恢复执行的过程中立即传送到
目标。如果当前没有任何目标程序正在运行,则::next 将开始运行新程序,就好像是通
过::run 执行一样,然后在第一条指令处停止。
::run [args ... ]
:r [args ... ]
内置dcmd
52 Solaris 模块调试器指南• 2006 年11 月
用于通过指定的参数开始运行新的目标程序,并附加到该程序。这些参数不是通过shell
解释的。如果调试器已经在检查实时运行的程序,则它将首先与该程序分离,就好像是
通过::release 执行一样。
[signal] ::sigbp [+/-dDestT] [-c cmd] [-n count] SIG ...
[signal] :t [+/-dDestT] [-c cmd] [-n count] SIG ...
用于跟踪指定信号的传送。使用dcmd 前面的可选信号编号或者dcmd 后面的信号名称或
编号的列表(请参见signal(3HEAD))来标识信号。-d、-D、-e、-s、-t、-T、-c 和-n
选项具有与用于::evset dcmd 时相同的含义。最初会跟踪缺省情况下导致进程转储核心
的信号集(请参见signal(3HEAD))和SIGINT。::sigbp 命令仅适用于用户进程调试。
::step [branch | over | out] [SIG]
:s SIG
:u SIG
用于执行目标程序的一条指令。如果将可选的信号名称或编号(请参见signal(3HEAD)
手册页)指定为参数并且目标是用户进程,则信号会在其恢复执行的过程中立即传送到
目标。如果指定了可选的branch 参数,则在用于对处理器控制流进行分支的下一条指令
之前,目标程序将继续执行。仅当针对启用了相应处理器特定功能的x86 系统使用kmdb
时,::step branch 功能才可用。如果指定了可选的over 参数,则::step 将跳过子例程
调用。::step over 参数与::next dcmd 相同。如果指定了可选的out 参数,则在代表线
程从当前函数返回之前,目标程序将继续执行。如果当前没有任何目标程序正在运行,
则::step over 将开始运行新程序,就好像是通过::run 执行一样,然后在第一条指令处
停止。:s dcmd 与::step 相同。:u dcmd 与::step out 相同。
[syscall] ::sysbp [+/-dDestT] [-io] [-c cmd] [-n count] syscall ...
用于跟踪指定系统调用的进出信息。使用dcmd 前面的可选系统调用编号或者dcmd 后面
的系统调用名称或编号的列表(请参见)来标识系统调用。如果指定
了-i 选项(缺省值),则事件说明符会在每个系统调用进入内核时触发。如果指定了
-o 选项,则事件说明符会在从内核退出时触发。-d、-D、-e、-s、-t、-T、-c 和-n 选项
具有与用于::evset dcmd 时相同的含义。::sysbp 命令仅适用于用户进程调试。
addr [,len] ::wp [+/-dDestT] [-rwx] [-ip] [-c cmd] [-n count]
addr [,len]:a [cmd... ]
addr [,len]:p [cmd... ]
addr [,len] :w [cmd... ]
用于在指定的地址上设置监视点。通过在dcmd 前面指定可选的重复计数,可以设置监
视的区域的长度(以字节为单位)。如果未显式设置长度,则缺省长度为1 个字节。使
用::wp dcmd 可将监视点配置为由读取(-r 选项)、写入(-w 选项)或执行(-x 选项)
访问的任意组合操作触发。-d、-D、-e、-s、-t、-T、-c 和-n 选项具有与用于::evset
dcmd 时相同的含义。可以使用-i 选项指明应该在I/O 端口的地址上设置监视点(仅当
在x86 系统上使用kmdb 时可用)。可以使用-p 选项指明应该将指定的地址解释为物理地
址(仅在使用kmdb 时可用)。:a dcmd 用于在指定的地址上设置读取访问监视点。:p
dcmd 用于在指定的地址上设置执行访问监视点。:w dcmd 用于在指定的地址上设置写入
访问监视点。:a、:p 和:w dcmd 后面的参数会串联在一起形成回调字符串。如果此字符
串包含元字符,则必须使用引号将此字符串引起来。
:z
用于从跟踪的软件事件列表中删除所有事件说明符。另外,也可以使用::delete 删除事
件说明符。
内置dcmd
第6 章• 执行控制53
与exec 交互
如果受控的用户进程成功执行exec(2),则可通过::set -o follow_exec_mode 选项控制调试
器的行为,如第127 页中的“命令行选项摘要”中所述。如果调试器和被调试的进程
(victim process) 具有相同的数据模型,则“停止”和“跟随”模式可确定MDB是自动继续
执行目标还是返回到exec 后面的调试器提示符下。如果调试器和被调试的进程具有不同的
数据模型,则“跟随”行为导致MDB使用相应的数据模型自动地重新执行MDB二进制代
码并重新附加到该进程,从exec 返回时仍然被停止。并非所有在此重新执行中生成的调试
器状态都会保留。
如果在32 位数据模型中被调试的进程对64 位程序执行exec,则MDB在“停止”模式下将
返回到命令提示符,但调试器将无法再检查进程,因为现在它使用的是64 位数据模型。要
恢复调试,请执行::release -a dcmd,退出MDB,然后执行mdb -p pid 将64 位调试器重新
附加到进程。
如果在64 位数据模型中被调试的进程执行32 位程序,则命令提示符中将返回“停止”,但
调试器将仅提供有限的功能用于检查新进程。所有内置dcmd 都将按照说明的那样运行,
但是可装入的dcmd 则不会,因为它们不会执行结构的数据模型转换。如前所述,为了恢
复完整的调试功能,用户应该释放调试器再将其重新附加到进程。
与作业控制交互
如果将调试器附加到作业控制所停止的用户进程(即,该用户进程响应SIGTSTP、
SIGTTIN 或SIGTTOU而停止),则用于继续执行操作的dcmd 继续执行进程时,可能无法
将该进程设置为再次运行。如果被调试的进程是同一会话的成员(即,该进程与MDB共享
同一控制终端),则MDB会尝试将关联的进程组置于前台,并响应SIGCONT 继续执行进
程,以便将其从作业控制停止中恢复。MDB与此类进程分离时,它在退出之前会将进程组
恢复到后台。如果被调试的进程不是同一会话的成员,则MDB无法安全地将进程组置于前
台,因此它将继续执行与调试器有关的进程,但作业控制会继续停止进程。在这种情况
下,MDB将列显一条警告,用户必须从相应的shell 发出fg 命令才能恢复进程。
进程的附加和释放
如果MDB附加到正在运行的用户进程,则会停止该进程并使其一直处于停止状态,直到应
用一个用于继续执行操作的dcmd 或调试器退出为止。如果在使用-p 将调试器附加到某个
进程之前或者发出::attach 或:A 命令之前启用了-o nostop 选项,MDB 将会附加到该进程
但不会将其停止。在进程仍然运行的同时,可以按通常那样对其进行检查(尽管结果会不
一致),并且可以启用断点或其他跟踪标志。如果在进程运行的同时执行:c 或::cont
dcmd,则调试器将等待进程停止。如果没有发生跟踪的软件事件,则用户可以在:c 或
::cont 之后发送中断字符(^C),以强制进程停止并将控制返回到调试器。
执行:R、::release、:r、::run、$q 或::quit dcmd 时,或者调试器因遇到EOF 或信号而
终止时,MDB将释放当前运行的进程(如果有)。如果进程最初是调试器使用:r 或::run
创建的,则在释放该进程时会强制将其终止,就好像是通过SIGKILL 执行一样。如果在将
与exec 交互
54 Solaris 模块调试器指南• 2006 年11 月
MDB附加到进程之前该进程已经运行,则在释放该进程时会将其设置为再次运行。使用
::release -a 选项,可以释放进程并使其保持停止和放弃状态。
进程的附加和释放
第6 章• 执行控制55
56
内核执行控制
本章介绍运行kmdb 时可用于实时操作系统内核执行控制的MDB功能。kmdb 是MDB的一种
版本,专为内核执行控制和实时内核调试而设计。使用kmdb,可以与使用mdb 控制和观察
用户进程几乎相同的方式控制和观察内核。内核执行控制功能包括每个CPU 上执行的内核
线程的指令级控制,这样开发者就可以单步控制内核以及实时检查数据结构。
mdb 和kmdb 共享相同的用户界面。第6 章中介绍的所有执行控制功能在kmdb 中都可用,它
们与用于控制用户进程的一组命令相同。第3 章和第5 章中介绍的用于检查内核状态的命
令在使用kmdb 时也是可用的。最后,除非另有说明,否则第8 章中介绍的特定于Solaris 内
核实现的命令也可用。本章介绍特定于kmdb 的其他功能。
引导、装入和卸载
为便于启动内核调试,可以在控制从内核运行时链接程序(krtld) 传递到内核之前,在引导
过程的初期阶段装入kmdb。可以使用-k 引导标志、kmdb 引导文件或kadb 引导文件(用于
实现兼容性)在引导时装入kmdb。如果在引导时装入kmdb,则在系统随后重新引导之前,
无法卸载调试器。在引导的初期阶段,某些功能不会立即可用。特别是,在内核模块子系
统初始化之前,不会装入调试模块。在内核完成处理器标识过程之前,不会启用处理器特
定功能。
如果使用-k 选项引导系统,则会在引导过程中自动装入kmdb。可以使用-d 引导选项,在
启动内核之前请求调试器断点。此功能适用于缺省内核以及替代内核。例如,要使用kmdb
引导SPARC 系统并请求立即进入调试器,请键入以下任一命令:
ok boot -kd
ok boot kmdb -d
ok boot kadb -d
要以相同方式引导x86 系统,请键入以下任一命令:
7第7 章
57
Select (b)oot or (i)nterpreter: b -kd
Select (b)oot or (i)nterpreter: b kmdb -d
Select (b)oot or (i)nterpreter: b kadb -d
要使用kmdb 引导SPARC 系统并装入备用64 位内核,请键入以下命令:
ok boot kernel.test/sparcv9/unix -k
要使用kmdb 引导x86 系统并装入备用64 位内核,请键入以下命令:
Select (b)oot or (i)nterpreter: b kernel.test/amd64/unix -k
如果引导文件被设置为字符串kmdb 或kadb,并且希望引导替代内核,请使用-D 选项指定要
引导的内核的名称。要以此方式引导SPARC 系统,请键入以下命令:
ok boot kmdb -D kernel.test/sparcv9/unix
要以此方式引导32 位x86 系统,请键入以下命令:
Select (b) or (i)nterpreter: b kmdb -D kernel.test/unix
要以此方式引导64 位x86 系统,请键入以下命令:
Select (b) or (i)nterpreter: b kmdb -D kernel.test/amd64/unix
要调试已引导的系统,请使用mdb -K 选项装入kmdb 并停止内核执行。如果使用此方法装入
调试器,则随后可以卸载它。通过为::quit dcmd 指定-u 选项,可以在完成调试后卸载
kmdb。或者,可以使用命令mdb -U 恢复操作系统的执行。
终端处理
kmdb 始终使用系统控制台进行交互。kmdb 将根据以下规则确定相应的终端类型:
 如果被调试的系统将连接的键盘和显示器用于其控制台,并且调试器是在引导时装入
的,则会根据平台体系结构和控制台终端设置自动确定终端类型。
 如果被调试的系统使用串行控制台,并且调试器是在引导时装入的,将假定为缺省终端
类型vt100。
 如果调试器是通过在控制台上运行mdb -K 装入的,则将$TERM 环境变量的值用作终端类
型。
终端处理
58 Solaris 模块调试器指南• 2006 年11 月
 如果调试器是通过在非控制台的终端上运行mdb -K 装入的,则调试器将使用已配置为用
于系统控制台登录提示的终端类型。
可以在kmdb 中使用::term dcmd 来显示终端类型。
调试器项
在到达断点时或者根据第6 章中所述的其他执行控制设置,操作系统内核将隐式停止执行
并进入kmdb。可以使用mdb -K 选项或相应的键盘中断序列来请求显式进入kmdb。在SPARC
系统控制台上,使用STOP-A组合键发送中断信号并进入kmdb。在x86 系统控制台上,使用
F1–A组合键发送中断信号并进入kmdb。在Solaris 系统上,可以使用kbd 命令自定义转义序
列。要在具有串行控制台的系统上进入kmdb,请使用相应的串行控制台命令发送中断序
列。
处理器特定功能
某些kmdb 功能特定于单独的处理器体系结构。例如,各种x86 处理器支持硬件分支跟踪功
能,而在一些其他处理器体系结构中找不到该功能。对处理器特定功能的访问是通过处理
器特定的dcmd(仅存在于支持它们的系统上)提供的。处理器特定支持是否可用将在
::status dcmd 的输出中指示。调试器依赖于内核来确定处理器类型。因此,尽管调试器可
能为给定的处理器体系结构提供功能,但是在内核前进到已完成处理器标识的点之前,不
会公开此支持。
处理器特定功能

 

以上文章转自于 : http://developers.sun.com.cn/

阅读(1239) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~