Probe alias
的语法:
probe <alias> = <probepoint> { <prologue_stmts> }
probe <alias> += <probepoint> { <epilogue_stmts> }
(1)第一种方式定义的prologue_stmts
会在probe handler
执行前执行,而第二种方式定义的<epilogue_stmts>
则会在probe handler
执行后执行。要注意,上述的方式只是定义了probe alias
,而并没有激活它们(参考Re: How does stap execute probe aliases?):
# cat timer_test.stp
#!/usr/bin/stap
probe timer_alias = timer.s(3) {printf("Entering timer\n")}
# ./timer_test.stp
semantic error: no probes found
Pass 2: analysis failed. [man error::pass2]
下面则能正常运行:
# cat timer_test.stp
#!/usr/bin/stap
probe timer_alias = timer.s(3) {printf("Entering timer\n")}
probe timer_alias {}
# ./timer_test.stp
Entering timer
......
(2)看下面脚本的执行结果:
# cat timer_test.stp
#!/usr/bin/stap
probe timer_alias = timer.s(3) {printf("Entering timer\n")}
probe timer_alias += timer.s(3) {printf("Leaving timer\n")}
probe timer_alias {printf("In timer \n")}
# ./timer_test.stp
Entering timer
In timer
In timer
Leaving timer
......
它相当于执行下面的脚本(参考 Re: Why is the same log printed twice when using probe alias?):
# cat timer_test.stp
#!/usr/bin/stap
probe timer.s(3)
{
printf("Entering timer\n")
printf("In timer\n")
}
probe timer.s(3)
{
printf("In timer\n")
printf("Leaving timer\n")
}
(3) Alias suffixes
It is possible to include a suffix with a probe alias invocation. If only the initial part of a probe point matches an alias, the remainder is treated as a suffix and attached to the underlying probe point(s) when the alias is expanded. For example:
/* Define an alias: */
probe sendrecv = tcp.sendmsg, tcp.recvmsg { … }/* Use the alias in its basic form: */
probe sendrecv { … }/* Use the alias with an additional suffix: */
probe sendrecv.return { … }Here, the second use of the probe alias is equivalent to writing probe tcp.sendmsg.return, tcp.recvmsg.return.