跟踪工具

跟踪工具通过监视选定的系统事件或选定的进程帮助您隔离系统问题。 能够监视的事件包括:选定子例程的入口和出口、内核例程、内核扩展例程和中断处理程序。

跟踪也能够被限制为跟踪一组正在运行的进程或线程,或者也能够被用于启动和跟踪程序。

当跟踪工具处于活动状态时,将信息记录在系统跟踪日志文件中。 跟踪工具包括激活和控制跟踪以及生成跟踪报告的命令。 应用程序和内核扩展能够使用数个子例程记录额外的事件。

有关跟踪工具的更多信息,请参阅如下内容:

跟踪工具概述

跟踪工具在 bos.sysmgt.trace 文件集中。 要了解此文件集是否已安装,请在命令行上输入以下内容:

lslpp -l | grep bos.sysmgt.trace

如果生成包含 bos.sysmgt.trace 的行,那么文件集已安装,否则必须安装它。

系统跟踪工具记录稍后可由跟踪报告命令格式化的跟踪事件。 跟踪事件被编译为内核或者应用程序代码,但是仅当跟踪处于活动状态时才对这些事件进行跟踪。

激活跟踪是使用 trace 命令或者 trcstart 子例程实现的。 停止跟踪是使用 trcstop 命令或者 trcstop 子例程实现的。 当跟踪处于活动状态时,可使用 trcofftrcon 命令或 trcofftrcon 子例程进行暂挂或者恢复。

一旦已使用 trcstop 停止跟踪,就可用 trcrpt 命令生成跟踪报告。 此命令使用模板文件 /etc/trcfmt 来了解如何格式化条目。 该模板使用 trcupdate 命令来安装。 有关模板的讨论,请参阅 trcupdate 命令。

控制跟踪

trace 命令启动系统事件的跟踪并控制跟踪缓冲区和日志文件大小。

收集跟踪数据有三种方法。

  1. 缺省方法是用两个缓冲区连续收集跟踪数据,当正将数据放入一个缓冲区时,写入另一个缓冲区。 日志文件放满时则回绕。
  2. 循环方法连续收集跟踪数据,但是仅当跟踪停止时才将数据写入日志文件。 这对审查知道何时发生而只是想捕获即时数据的问题特别有帮助。 您可随时启动跟踪,随后在问题发生时立即停止它,于是您将捕获到和问题有关的事件。 此方法通过使用跟踪守护程序标记 -l 来启用。
  3. 第三个选项仅使用一个跟踪缓冲区并且当缓冲区填满时退出跟踪并将缓冲区写入到日志文件。 此时跟踪并不停止,而是如已发出 trcoff 命令一般将跟踪关闭。 此时,您通常希望使用 trcstop 命令停止跟踪。 此选项经常用于在以下情况下收集性能数据:在收集完数据前,我们不希望跟踪去执行输入/输出或者缓冲区交换。 使用 -f 标记可启用此选项。

您通常会希望以异步方式运行 trace 命令,换句话说,您希望输入 trace 命令然后继续其他工作。 要异步运行跟踪,请使用 -a 标志或 -x 标志。 如果使用 -a 标志,那么必须使用 trcstop 命令停止跟踪。 如果使用 -x 标志,那么跟踪将在程序完成时自动停止。

通常都希望对跟踪的信息加以限制。 使用 -j events-k events 标记可指定一组要包含 (-j) 或排除 (-k) 的事件。

注: 将跟踪限制为特定进程或线程时,还会限制跟踪的信息量。

为了显示与跟踪挂钩关联的程序名,必须启用特定的挂钩。 使用 tidhk 跟踪事件组来指定这些挂钩。 例如,如果想跟踪 mbuf 挂钩 254,并且也想显示程序名,那么需要如下运行 trace

trace -aJ tidhk -j 254

进行跟踪。 要停止跟踪,请在命令行上输入如下内容:

trcstop
trcrpt -O exec=on

-O exec=on trcrpt 选项显示程序名,请参阅 trcrpt 命令以获取更多信息。

通常都期望指定缓冲区大小和最大日志文件大小。 跟踪缓冲区需要可用的实内存,这样记录跟踪挂钩时就不需要页面调度了。 日志文件将填充到指定的最大大小,然后回绕,废弃最旧的跟踪数据。 -T size-L size 标记按字节指定内存缓冲区的大小和日志文件中的跟踪数据的最大大小(以字节计)。

注: 由于跟踪设施会锁定数据收集缓冲区,使此内存量不可用于系统的其余部分,因此跟踪设施可能会影响内存受限环境中的性能。 如果正在监视的应用程序不是内存受限的, 或者如果跟踪例程消耗的内存百分率比系统中可用的内存小,那么因跟踪“窃取”内存造成的影响应该较小。 如果不指定值,那么跟踪使用缺省大小。

跟踪也可以从应用程序中控制。 请参阅 trcstarttrcstop 文章。

记录跟踪事件数据

有两种跟踪数据类型。

类属数据
由数据字、模糊数据缓冲区和模糊数据长度组成。 它对跟踪诸如路径名这类的项有帮助。 请参阅跟踪工具概述中有关类属跟踪通道的篇章。 这可以在跟踪工具中找到。
注: 仅通道 0 支持跟踪特定进程或线程。 类属跟踪通道不支持此功能。
非类属数据
这就是AIX®操作系统通常跟踪的内容。 此类型的每一个条目由挂钩字和最多 5 个跟踪数据字组成。 对 64 位应用程序而言,它们是 8 字节的字。 C 语言程序员应使用 /usr/include/sys/trcmacros.h 文件中定义的宏 TRCHKL0 至 TRCHKL5 和 TRCHKL0T 至 TRCHKL5T 来记录非类属数据。 如果不能使用这些宏,请参阅 utrchook 子例程上的文章。

生成跟踪报告

请参阅 trcrpt 命令文章,以获取 trcrpt 的完整描述。 此命令用来从使用 trace 命令生成的日志文件中生成可读跟踪报告。 缺省情况下,该命令对来自缺省日志文件 /var/adm/ras/trcfile 的数据进行格式化。 trcrpt 输出被写至标准输出。

要从缺省日志文件生成跟踪报告并将它写入 /tmp/rptout,请输入

trcrpt>/tmp/rptout

要从日志文件 /tmp/tlog 生成其中包括程序名和系统调用名的跟踪报告并写入 /tmp/rptout,请使用

trcrpt-Oexec=on,svc=on/tmp/tlog /tmp/rptout

从转储抽取跟踪数据

如果在系统执行转储时跟踪处于活动状态,那么通常可以使用 trcdead 命令来检索跟踪。 要避免覆盖当前系统中的缺省跟踪日志文件,请使用 -o output-file 选项。

例如:

trcdead -o /tmp/tlog /var/adm/ras/vmcore.0

生成跟踪日志文件 /tmp/tlog,随后可用以下命令对其格式化:

trcrpt /tmp/tlog

跟踪工具命令

以下命令是跟踪工具的一部分:

命令 函数
跟踪 启动对系统事件的跟踪。 使用此命令,可以管理跟踪日志文件和收集跟踪事件数据的内部跟踪缓冲区并控制两者大小。
trcdead 从系统转储中抽取跟踪信息。 如果当跟踪工具处于活动状态时系统停机,那么内部跟踪缓冲区的内容被捕获。 此命令从转储中抽取跟踪事件数据并将其写入跟踪日志文件。
trcnm 生成由 trcrpt 命令使用的内核名称列表。 内核名称列表由一个符号表和一个对象文件的装载程序符号表组成。 trcrpt 命令在格式化来自跟踪日志文件的报告时使用内核名称列表文件来解释地址。
注: 建议您使用 -n trace 选项而不是 trcnm。 此操作将名称列表信息输入到跟踪日志文件而非单独的文件中并且包括了来内核扩展的符号。
trcrpt 格式化包含在跟踪日志文件中的跟踪事件数据的报告。 使用此命令,您可以指定在报告中包含(或省略)的事件,也可以确定输出的形式。 trcrpt 命令使用在 /etc/trcfmt 文件中存储的跟踪格式化模板以确定如何解释为每个事件记录的数据。
trcstop 停止对系统事件的跟踪。
trcupdate 更新存储在 /etc/trcfmt 文件中的跟踪格式化模板。 当您添加记录跟踪事件的应用程序或内核扩展时,必须将这些事件的模板添加到 /etc/trcfmt 文件。 trcrpt 命令将使用跟踪格式化模板以确定如何解释为每个事件记录的数据。 记录事件的软件产品通常运行 trcupdate 命令作为安装过程的一部分。

跟踪工具调用和子例程

以下调用和子例程是跟踪工具的一部分:

子例程 描述
trcgen trcgent

记录多于五个数据字的跟踪事件。 trcgen 子例程可用来记录事件作为系统事件跟踪(跟踪通道 0)的一部分或记录类属跟踪通道(通道 1 到 7)上的事件。 当您记录跟踪事件时,请指定子例程参数中的通道号。 trcgent 子例程将时间戳记追加到事件数据。 将 AIX 5L V 5.3 与 5300-05 技术级别 及更高版本配合使用时,无论使用的子例程如何,始终会将时间戳记追加到事件数据。 在内核中使用 trcgenktrcgenkt 。 C 语言程序员应该始终使用宏 TRCGENTRCGENK

utrchookutrchook64 记录多达五个数据字的跟踪事件。 这些子例程可用来记录事件作为系统事件跟踪(跟踪通道 0)的一部分。 内核程序员可使用 trchooktrchook64。 C 语言程序员应该始终使用宏 TRCHKL0 - TRCHKL5TRCHKL0T - TRCHKL5T

如果您未在使用这些宏,那么需要构建自己的跟踪挂钩字。 格式随 /etc/trcfmt 文件一起记录。 注意 32 位跟踪和 64 位跟踪的挂钩字格式不同。

trcoff 暂挂对系统事件跟踪通道(通道 0)或类属跟踪通道(1 到 7)上的跟踪数据的收集。 跟踪通道保持活动并且可以通过使用 trcon 子例程恢复对跟踪数据的收集。
trcon 启动对跟踪通道上的跟踪数据的收集。 该通道可以是系统事件跟踪通道 (0)或类属通道(1 至 7)。 但是,必须通过使用 trace 命令或者 trcstart 子例程预先激活该跟踪通道。 可以通过使用 trcoff 子例程暂挂对跟踪数据的收集。
trcstart 提供 trace 命令的库接口。 返回启动的跟踪的通道号。 如果请求通用通道,那么通道号为下列其中一个数字: 1,2,3,4,5,6 , 7。 否则,通道号为 0。
trcstop 释放和停用类属跟踪通道。

跟踪工具文件

文件 描述
/etc/trcfmt 包含 trcrpt 命令用于确定如何解释为每个事件记录的数据的跟踪格式化模板。
/var/adm/ras/trcfile 包括缺省跟踪日志文件。 trace 命令允许您指定一个不同的跟踪日志文件。
/usr/include/sys/trchkid.h 包含跟踪挂钩标识定义。
/usr/include/sys/trcmacros.h 包含记录跟踪事件的常用宏。

跟踪事件数据

请参阅 /etc/trcfmt 文件以获取跟踪事件数据的格式。

跟踪挂钩标识

跟踪挂钩标识是标识被跟踪事件的三位或四位十六进制数字。 在 AIX 7.1之前以及在 AIX 7.1 及更高版本上运行的 32 位应用程序上,只能使用三位数的挂钩标识。 使用跟踪宏 (例如 TRCHKL1) 时,将跟踪挂钩指定为:
hhh00000
其中 hhh 是挂钩标识。
AIX 7.1 及更高版本上运行的 64 位应用程序和内核例程上,可以使用三位数和四位数标识。 使用跟踪宏 (例如 TRCHKL1) 时,将跟踪挂钩指定为:
hhhh0000
其中 hhhh 是挂钩标识。
注: 如果使用四位数标识并且该标识小于 0x1000,那么最小有效位数必须为 0 (格式为 0x0hh0)。

三位的标识在最后一位有效数字中包含一个隐藏的 0,因此 32 位的挂钩标识等同于 64 位的挂钩标识 hhh0。

多数跟踪挂钩标识定义在 /usr/include/sys/trchkid.h 文件中。 64 位的用户应用程序可使用值 0x0100 到 0x0FF0。 32 位的用户应用程序可使用值 0x010 到 0x0FF。 所有其他值均保留给系统使用。 通过使用 trcrpt -j 命令可列示当前定义的跟踪挂钩标识。

跟踪工具类属跟踪通道

跟踪工具一次支持多达八个活动跟踪会话。 每一个跟踪会话使用多路复用跟踪特殊文件 /dev/systrace 的一个通道。 跟踪工具使用通道 0 记录系统事件。 对系统事件的跟踪通过 tracetrcstop 命令启动和停止。 如果跟踪特定的进程或线程,或者如果跟踪程序,那么仅使用通道 0。 通道 1 到 7 称为类属跟踪通道且仅可由子系统用于其他类型的跟踪,例如数据链路跟踪。

为了实现使用跟踪工具的类属跟踪通道的跟踪, 子系统调用 trcstart 子例程以激活某跟踪通道并确定通道号。 于是子系统模块能够使用 TRCGENTRCGENT 宏或者如果必要可使用 trcgentrcgenttrcgenktrcgenkt 子例程记录跟踪事件。 trcstart 子例程返回的通道号是必须传递给这些子例程的参数之一。 子系统能够使用 trcofftrcon 子例程暂挂和恢复对跟踪数据的收集并且能够使用 trcstop 子例程停用某跟踪通道。 子系统必须提供用来激活和取消激活子系统跟踪的用户界面。

多数存储在 /usr/include/sys/trchkid.h 文件中的跟踪挂钩标识和存储在 /etc/trcfmt 文件中的跟踪格式化模板由所有跟踪通道所共享。