2017-10-17 25 views
0

我正在嘗試使用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(值得信賴))」處理systemtap用戶空間腳本(變量)中的長探測路徑?

所以我第一次嘗試獲得的所有可調用的函數列表,其中:

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("[email protected]/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 = "[email protected]" . srcpath # concatenate strings 
    printf("%s\n", newstr) 
} 

這工作,我可以運行sudo stap /path/to/test.stp,我也得到印刷兩個字符串。

然而,當我嘗試在探測使用這些字符串,它們失敗:

  • 書寫探針是這樣的:

probe process(exepath).function("[email protected]".srcpath."/BasicTestCodeFileInterface.cpp:201").call { ...

...失敗:​​3210。

  • 試圖把 「過程」 部分中的變量:

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

您最好的選擇可能是使用

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

注意沒有明確的級聯運算符(宏擴展到)字符串文字之間。解析器將自動連接它們,就像在C.