Solaris 模块调试器指南

内置 dcmd

[ addr ] ::bp [+/-dDestT] [-c cmd] [-n count] sym ...
addr :b [cmd ... ]

用于在指定的位置设置断点。 ::bp dcmd 可在指定的每个地址或符号上设置断点,其中包括 dcmd 前面的显式表达式所指定的可选地址,以及 dcmd 后面的每个字符串或即时值。参数可以是表示特定的相关虚拟地址的符号名称或即时值。如果指定了符号名称,则它可能引用还无法在目标进程中评估的符号:即该符号可能包含尚未打开的装入对象中的对象名称和函数名称。 在这种情况下,断点将会延迟,在装入与指定名称匹配的对象之前,它在目标中不会处于活动状态。打开装入对象时,将自动启用断点。共享库中所定义的符号上的断点应该始终使用符号名称而不是地址表达式进行设置,因为地址可能会引用对应的过程链接表 (Procedure Linkage Table, PLT) 项而不是实际的符号定义。如果随后将 PLT 项解析为实际的符号定义,则运行时链接编辑器可能会覆写在该 PLT 项上设置的断点。如本节中稍后所述,-d-D-e-s-t-T-c-n 选项具有与用于 ::evset dcmd 时相同的含义。如果使用的是 dcmd 的 :b 形式,则仅会在 dcmd 前面的表达式所指定的虚拟地址上设置断点。 :b dcmd 后面的参数会串联在一起形成回调字符串。 如果此字符串包含元字符,则必须使用引号将此字符串引起来。

function ::call [ arg ... ]

调用操作系统内核中所定义的指定 function(仅在使用 kmdb 时可用)。function 表达式必须与其中一个已知内核模块的符号表中所定义的函数的地址匹配。如果指定的是表达式参数,则这些参数将通过值进行传递。如果指定的是字符串参数,则这些参数将通过引用进行传递。


注意 –

请务必谨慎使用 ::call 命令,决不可将其应用于产品化系统。操作系统内核不会为了执行指定的函数而恢复执行。因此,被调用的函数决不能利用任意内核服务,并且决不能由于任何原因而阻塞。必须完全了解使用此命令调用的任何函数的副作用。


::cont [SIG]
:c [SIG]

用于暂停调试器,继续执行目标程序,并等待它在相关软件事件发生后终止或停止。如果由于在启用了 -o nostop 选项的情况下将调试器附加到正在运行的程序,从而导致目标已在运行,则此 dcmd 仅等待目标在相关事件发生后终止或停止。如果将可选的信号名称或编号(请参见 signal(3HEAD) 手册页)指定为参数,则信号会在其恢复执行的过程中立即传送到目标。如果跟踪了 SIGINT 信号,则可通过键入用户定义的中断字符(通常为 ^C)将控制以异步方式返回到调试器。 此 SIGINT 信号会自动清除,下次继续执行此信号时目标不会观察到它。 如果当前没有任何目标程序正在运行,则 ::cont 将开始运行一个新程序,就好像通过 ::run 执行一样。

addr ::delete [id | all]
addr :d [id | all]

用于删除具有指定 id 号的事件说明符。缺省情况下,id 编号参数按十进制解释。 如果在 dcmd 前面指定了可选地址,则将删除与指定虚拟地址关联的所有事件说明符(例如,影响该地址的所有断点或监视点)。如果指定了特殊参数 "all",则将删除所有事件说明符,但标记为粘滞(T 标志)的说明符除外。 ::events dcmd 可用于显示事件说明符的当前列表。

::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 选项将调试器附加到正在运行的程序时,此状态才可见。

由于出现操作系统错误,事件说明符未处于待命状态。 可以使用 ::events -v 选项显示有关检测失败原因的更多信息。

TA

“临时”、“粘滞”和“自动”事件说明符的属性。可能显示以下符号中的一个或多个:

事件说明符是临时的,无论它是否匹配,下次目标停止时都会将其删除。 

事件说明符是粘滞说明符,不会被 ::delete all:z 删除。通过将其 id 号显式指定为 ::delete,可以删除该说明符。

命中计数等于命中限制时,将自动禁用事件说明符。 

命中计数等于命中限制时,将自动删除事件说明符。 

命中计数等于命中限制时,目标将自动停止。 

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 选项。

-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 后面的故障名称或编号的列表(请参见 <sys/fault.h>)来标识故障。-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 ... ]

用于通过指定的参数开始运行新的目标程序,并附加到该程序。这些参数不是通过 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 后面的系统调用名称或编号的列表(请参见 <sys/syscall.h>)来标识系统调用。 如果指定了 -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 删除事件说明符。