trc_find_first , trc_find_next 或 trc_compare 子例程

用途

查找自变量的第一个或下一个出现项,或者将当前条目与自变量进行比较。

libtrace.a

语法

#include <sys/libtrace.h>

int trc_find_first (handle, argp, ret)
trc_log_handle_t handle;
trc_logsearch_t *argp;
trc_read_t *ret;

int trc_find_next (handle, argp, ret)
trc_log_handle_t handle;
trc_logsearch_t *argp;
trc_read_t *ret;
int trc_compare (handle, argp)
trc_log_handle_t handle;
trc_logsearch_t *argp;

描述

trc_find_first 子例程找到与 阿尔格普 参数所指向的自变量匹配的跟踪日志条目的第一次出现。 trc_find_next 子例程从日志对象中的当前位置开始查找该自变量的下一个实例。 如果搜索自变量指针 阿尔格普为 NULL ,那么将使用来自先前搜索的自变量。 trc_find_firsttrc_find_next 子例程都返回找到的项。 如果句柄的标志字段同时包含 TRC_MULTI_MERGE 和 TRC_REMOVE_DUPS ,那么 trc_find_firsttrc_find_next 将使用存在于其他跟踪源中的当前事件的任何重复条目。 所使用的条目数将在 trchi_dupcounttrcri_dupcount 变量中返回 (根据分别是已处理的数据项还是原始数据项)。

trc_compare 子例程用来根据自变量检查当前条目。 未读取任何数据。 它在实现出口条件时很有用,您需要根据某些条件来查找条目,然后检查不是正常搜索的一部分的出口条件。

参数

描述
句柄 (handle) 包含从对 trc_open 子例程的成功调用返回的句柄。
阿尔格普 指向 /usr/include/sys/libtrace.a 文件中定义的参数列表。 可以将参数链接在一起以执行复杂搜索。
将指向要返回的 trc_read_t 结构。 除非在打开时指定了 TRC_LOGLIVE ,否则应该使用 trc_Free 子例程来释放从 trc_read_t 数据类型引用的数据。

搜索参数由三个部分组成,即运算符, 特尔斯奥普以及左右两边。

可以轻松识别运算符值,因为它们的格式为 TLS_OP_...。 运算符分为两个类别,即叶运算符和复合运算符。 叶运算符是用于将左边的字段与右边的值进行比较的运算符。 复合运算符用于将两个表达式 (例如) 与组合的表达式进行比较。

可以使用数字或字符串数据执行叶操作。 如果对字符串数据执行此操作,那么将使用 斯特伦普 利布克 字符串比较功能对除 TLS_OP_SUBSTR之外的所有运算符进行比较。 有效的叶运算符为:
描述
TLS_OP_EQUAL 完全相等
TLS_OP_NE 不等于
TLS_OP_LT 小于
TLS_OP_LE 小于等于
TLS_OP_GT 大于
TLS_OP_GE 大于等于
TLS_OP_SUBSTR 左边的字符串在右边包含字符串。
复合运算符为:
描述
TLS_OP_AND 左表达式和右表达式的结果的逻辑 AND。
TLS_OP_OR 左表达式和右表达式的结果的逻辑 OR 值。
TLS_OP_XOR 左表达式和右表达式的结果的排他或排他。
TLS_OP_NOT 左 tls_left引用的自变量的求反。
该表达式的左右两侧定义如下:
描述
左 tls_lefttls_right 当运算符要求左侧和右侧是表达式时 (例如,当它是复合运算符时) ,将使用这些值。 左 tls_lefttls_right 指向其他 trc_logsearch_t 结构。
特尔斯菲尔德 和相应的值 对于叶操作,左侧的 特尔斯菲尔德指定要进行比较的字段。 可轻松识别字段名称,因为它们都具有 TLS_MATCH_...格式。 右侧是根据左侧字段的数据类型指定的值。
下表显示了左手边字段值及其对应的右手边数据值:
字段 描述
TLS_MATCH_HOOKID tls_ushortvalue 将挂钩标识与 乌绍尔特 数据项进行比较。 只有 3 位数的挂钩标识可以使用。 从提供 4 位钩子标识符的AIX® 6.1开始,参数左移 4 以创建 4 位钩子标识符。 例如,要指定挂钩标识 0x1000,请指定 0x100。 要指定挂钩标识 0x00F0,请指定 0x00F。 因此,只能指定格式为 0xhhh0 的 4 数字挂钩标识,其中 h 是十六进制数字。 要指定任何 4 数字挂钩标识,请使用 TLS_MATCH_HOOKID64
TLS_MATCH_HOOKID64 tls_ushortvalue AIX 6.1开始有效。 将挂钩标识与 乌绍尔特 数据项进行比较。 假定所有挂钩标识都是 4 位数的挂钩标识。
TLS_MATCH_HOOK_AND_SUBHOOK tls_uintvalue 比较挂钩和子挂钩。 使用具有指定整数的 32 位。 该字段的格式为 0xhhhhssss,其中 hhhh 是挂钩标识 (并且可以选择为 hhh0) ,而 ssss 是子挂钩。
TLS_MATCH_HOOKSET tls_hooksetvalue 位图指定要对其进行测试的挂钩。 您可以使用一个搜索参数来测试多个挂钩。 使用 trc_hkemptysettrc_hkfillsettrc_hkaddset特尔克德勒特 子例程对位图进行操作。 从 AIX 6.1开始,提供了 16 位挂钩标识。 但是, 特尔克胡克塞特 只能指定 12 位的挂钩标识。 通过指定挂钩 0xhhhtrc_find_firsttrc_find_next 子例程搜索 0xhhh0 ,因为这两个值等效以 AIX 6.1开头。 要以 0xhhhh格式指定挂钩,请使用 TLS_MATCH_HOOKSET64
TLS_MATCH_HOOKSET64 tls_hooksetvalue AIX 6.1开始有效。 位图指定要对其进行测试的挂钩标识。 您可以使用一个搜索参数来测试多个 16 位挂钩。 使用 trc_hkemptyset64trc_hkfillset64trc_hkaddset64trc_hkdelset64 子例程来处理位图。
Tls_MATCH_TIME tls_ulongvalue 比较从跟踪开始的时间值 (以纳秒为单位)。
TLS_MATCH_TID tls_ulongvalue 线程标识
TLS_MATCH_PID tls_ulongvalue 进程标识
TLS_MATCH_RAWOFST tls_ulongvalue 原始文件偏移量
TLS_MATCH_CPUID tls_uintvalue 处理器标识
TLS_MATCH_RCPU tls_uintvalue 跟踪中的剩余处理器数
Tls_MATCH_FLAGS tls_uintvalue trcr_flags进行比较。
TLS_MATCH_TICKS tls_ulongvalue 与自跟踪启动以来的计时器寄存器刻度标记数匹配。
TLS_MATCH_TRCONTIME tls_ulongvalue trchi_trcontime进行比较。
TLS_MATCH_TRCOFFTIME tls_ulongvalue trchi_trcofftime进行比较。
TLS_MATCH_COMPONENT tls_strvalue 与特定组件名称匹配。

返回值

成功完成后, trc_find_firsttrc_find_nexttrc_compare 子例程将返回 0。

错误代码

发生错误时, errno 全局变量将设置为 errno.h 文件中的值。 trc_find_firsttrc_find_nexttrc_Compare 子例程返回 errno.h 文件中的值或 libtrace.h 文件中的错误值。
描述
EINVAL 该句柄无效,或者搜索自变量无效。
TRCE_EOF 找不到匹配项,或者不存在更多匹配项。 将 错误号 全局变量设置为 0。
TRCE_BADFORMAT 日志对象包含格式错误的数据。 错误号 全局变量已设置为 EINVAL

示例

  1. 查找程序 mypgm的 SVC 挂钩 101 和 104。
    {
                      int rv;
                      trc_loghandle_t h;
                      trc_read_t r;
                      trc_logsearch_t t1, t2, t3, t4, t5;
    
                      /* Setup the leaf search arguments. */
                      t1.tls_op = TLS_OP_EQUAL;
                      t1.tls_field = TLS_MATCH_HOOKID;
                      t1.tls_ushortvalue = 0x101;
                      t2.tls_op = TLS_OP_EQUAL;
                      t2.tls_field = TLS_MATCH_HOOKID;
                      t2.tls_ushortvalue = 0x104;
                      t3.tls_op = TLS_OP_EQUAL;
                      t3.tls_field = TLS_MATCH_PROCNAME;
                      t3.tls_strvalue = "mypgm";
                      /* Join the items and form a single search tree. */
                      t4.tls_op = TLS_OP_AND;
                      t4.tls_left = &t1
                      t4.tls_right = &t2
                      t5.tls_op = TLS_OP_AND;
                      t5.tls_left = &t4
                      t5.tls_right = &t3
                      /* Open the default trace log object. */
                      rv = trc_open("", "", TRC_LOGREAD|TRC_LOGPROC, >h);
                      if (rv) {
                              trc_perror(h, rv, "open");
                              return(rv);
                      }
                      /* Do the search. */
                      rv = trc_find_first(h, &t5, &r);
                      if (rv) {
                              trc_perror(h, rv, "find test");
                              return(rv);
                      }
    
                      ...
              }
    请注意,与此搜索匹配的后续条目可能会返回以下内容:
    rv = trc_find_next(h, NULL, &r);

    在查找之后,可以使用 trc_find_next 来更改搜索参数,而无需重新开始搜索。 换言之, trc_find_first 始终从文件开头开始,而 trc_find_next 则从文件中的当前位置开始,但其中任何一个都可以更改搜索参数。

  2. 查找程序 mypgm的 SVC 挂钩 101 和 104。 使用单个自变量来搜索两个挂钩标识。
    {
                      int rv;
                      trc_loghandle_t h;
                      trc_read_t r;
                      trc_logsearch_t t1, t2, t3;
                      trc_hookset_t hs;
    
                      /* Setup the hook set. */
                      trc_hkemptyset(hs);
                      (void)trc_hkaddset(hs, 0x101);
                      (void)trc_hkaddset(hs, 0x104);
                      /* Setup the leaf search arguments. */
                      t1.tls_op = TLS_OP_EQUAL;
                      t1.tls_field = TLS_MATCH_HOOKSET;
                      t1.tls_hooksetvalue = hs;
                      t2.tls_op = TLS_OP_EQUAL;
                      t2.tls_field = TLS_MATCH_PROCNAME;
                      t2.tls_strvalue = "mypgm";
                      /* Join the items and form a single search tree. */
                      t3.tls_op = TLS_OP_AND;
                      t3.tls_left = &t1
                      t3.tls_right = &t2
                      /* Open the default trace log object. */
                      rv = trc_open("", "", TRC_LOGREAD|TRC_LOGPROC, &h);
                      if (rv) {
                              trc_perror(h, rv, "open");
                              return(rv);
                      }
                      /* Do the search. */
                      rv = trc_find_first(h, &t3, &r);
                      if (rv) {
                              trc_perror(h, rv, "find test");
                              return(rv);
                      }
    
                      ...
              }
  3. 您可以使用 trc_hookset64_t 类型找到程序 米普姆 的挂钩 101,104 和 1AB1 。 Hook 101 和 104 等于 0x1010 和 0x1040。
    {
                      int rv;
                      trc_loghandle_t h;
                      trc_read_t r;
                      trc_logsearch_t t1, t2, t3;
                      trc_hookset64_t hs;
    
                      /* Setup the hook set. */
                      trc_hkemptyset64(hs);
                      (void)trc_hkaddset64(hs, 0x1010);
                      (void)trc_hkaddset64(hs, 0x1040);
                      (void)trc_hkaddset64(hs, 0x1AB1);
    
                      /* Setup the leaf search arguments. */
                      t1.tls_op = TLS_OP_EQUAL;
                      t1.tls_field = TLS_MATCH_HOOKSET64;
                      t1.tls_hooksetvalue = hs;
                      t2.tls_op = TLS_OP_EQUAL;
                      t2.tls_field = TLS_MATCH_PROCNAME;
                      t2.tls_strvalue = "mypgm";
                      /* Join the items and form a single search tree. */
                      t3.tls_op = TLS_OP_AND;
                      t3.tls_left = &t1
                      t3.tls_right = &t2
                      /* Open the default trace log object. */
                      rv = trc_open("", "", TRC_LOGREAD|TRC_LOGPROC, &h);
                      if (rv) {
                              trc_perror(h, rv, "open");
                              return(rv);
                      }
                      /* Do the search. */
                      rv = trc_find_first(h, &t3, &r);
                      if (rv) {
                              trc_perror(h, rv, "find test");
                              return(rv);
                      }
    
                      . . .
              }