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_first 和 trc_find_next 子例程都返回找到的项。 如果句柄的标志字段同时包含 TRC_MULTI_MERGE 和 TRC_REMOVE_DUPS ,那么 trc_find_first 和 trc_find_next 将使用存在于其他跟踪源中的当前事件的任何重复条目。 所使用的条目数将在 trchi_dupcount 或 trcri_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_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_left 和 tls_right | 当运算符要求左侧和右侧是表达式时 (例如,当它是复合运算符时) ,将使用这些值。 左 tls_left 和 tls_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_hkemptyset, trc_hkfillset, trc_hkaddset和 特尔克德勒特 子例程对位图进行操作。 从 AIX 6.1开始,提供了 16 位挂钩标识。 但是, 特尔克胡克塞特 只能指定 12 位的挂钩标识。 通过指定挂钩 0xhhh, trc_find_first 和 trc_find_next 子例程搜索 0xhhh0 ,因为这两个值等效以 AIX 6.1开头。 要以 0xhhhh格式指定挂钩,请使用 TLS_MATCH_HOOKSET64。 |
| TLS_MATCH_HOOKSET64 | tls_hooksetvalue | 从 AIX 6.1开始有效。 位图指定要对其进行测试的挂钩标识。 您可以使用一个搜索参数来测试多个 16 位挂钩。 使用 trc_hkemptyset64, trc_hkfillset64, trc_hkaddset64和 trc_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_first, trc_find_next和 trc_compare 子例程将返回 0。
错误代码
| 项 | 描述 |
|---|---|
| EINVAL | 该句柄无效,或者搜索自变量无效。 |
| TRCE_EOF | 找不到匹配项,或者不存在更多匹配项。 将 错误号 全局变量设置为 0。 |
| TRCE_BADFORMAT | 日志对象包含格式错误的数据。 错误号 全局变量已设置为 EINVAL。 |
示例
- 查找程序
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 则从文件中的当前位置开始,但其中任何一个都可以更改搜索参数。
- 查找程序
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); } ... } - 您可以使用 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); } . . . }