我正在尝试使用systemtap
,Linux 4.2.0-42-generic#49~14.04.1-Ubuntu SMP来检测用户空间程序; stap --version
说:“Systemtap翻译/驱动程序(版本2.3 / 0.158,Debian版本2.3-1ubuntu1.4(可靠))”
所以我首先尝试获取所有可调用函数的列表,其中包含:
stap -L 'process("/home/username/pathone/subpathtwo/subpaththree/subpathfour/subpathFive/subpathsix/subpathSeven/subpatheight/myprogramab").function("*").call' 2>&1 | tee /tmp/stap
这很有效 - 但请注意,我的程序的绝对路径是巨大的。因此,从/tmp/stap
文件中,我读了一些感兴趣的探测器,然而,它们甚至更长,例如:
process("/home/username/pathone/subpathtwo/subpaththree/subpathfour/subpathFive/subpathsix/subpathSeven/subpatheight/myprogramab").function("DoSomething@/home/username/pathone/subpathtwo/subpaththree/subpathfour/subpathFive/src/BasicTestCodeFileInterface.cpp:201").call
...因为这对我来说很难阅读/不可读,所以我想做一些事情将这一行分成更易读的部分。我想到的第一件事是使用变量,所以我尝试了这个test.stp
脚本:
#!/usr/bin/env stap
global exepath = "/home/username/pathone/subpathtwo/subpaththree/subpathfour/subpathFive/subpathsix/subpathSeven/subpatheight/myprogramab"
global srcpath = "/home/username/pathone/subpathtwo/subpaththree/subpathfour/subpathFive/src"
probe begin {
printf("%s\n", exepath)
exit() # must have; else probe end runs only upon Ctrl-C
}
probe end {
newstr = "DoSomething@" . srcpath # concatenate strings
printf("%s\n", newstr)
}
这样,我可以运行sudo stap /path/to/test.stp
,然后打印出两个字符串。
但是,当我尝试在探针中使用这些字符串时,它们会失败:
probe process(exepath).function("DoSomething@".srcpath."/BasicTestCodeFileInterface.cpp:201").call { ...
...失败:parse error: expected literal string or number; saw: identifier 'exepath' ...
。
global tproc = process("/home/username/pathone/subpathtwo/subpaththree/subpathfour/subpathFive/subpathsix/subpathSeven/subpatheight/myprogramab")
...以parse error: expected literal string or number; saw: identifier 'process' ...
失败。
那么,我有什么选择,以某种方式缩短脚本中的探测线?
答案 0 :(得分:0)
您最好的选择可能是使用宏:
@define part1 %( "/path/part/1" %)
@define part2 %( "/part/2" %)
probe process(@part1 @part2).function("...") { }
注意(扩展到的)宏字符串文字之间没有显式连接运算符。解析器将自动连接它们,就像在C中一样。