我试着用Linux 4.2.0-42-generic#49~14.04.1-Ubuntu SMP来测试用户空间程序,systemtap说:“Systemtap翻译程序/驱动程序(版本2.3/0.158,Debian版本2.3-1ubuntu 1.4(可信)”
因此,我首先尝试获取所有可调用函数的列表,使用:
stap --version
不过,请注意,我的程序的绝对路径是巨大的。因此,从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脚本:

#!/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)
}

这很有效,我可以运行test.stp,然后打印两个字符串。
但是,当我尝试在探测中使用这些字符串时,它们失败了:
编写这样的探测:
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")失败。
那么,我有什么选择,以某种方式缩短脚本中的探测线?

最佳答案

您最好的选择可能是使用宏:

@define part1 %(  "/path/part/1" %)
@define part2 %(  "/part/2" %)
probe process(@part1 @part2).function("...") { }

注意(展开为的宏)字符串文本之间没有显式连接运算符。解析器将自动连接它们,就像在C中一样。

关于linux - 在systemtap用户空间脚本(变量)中处理长探测路径?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46781773/

10-11 22:49