首先是在systemtap腳本中定義能夠抓取golang堆棧的功能函數(shù):
function print_time_now() {
ms = gettimeofday_us()
sec = gettimeofday_s()
printf(“%s %d\(us\)\n”,ctime(sec),ms-sec*1000000 )
}
function print_x8664_gostack(){
goBaseName = “runtime.go exit”
rip = u_register(“rip”)
rbp_itr = u_register(“rbp”)
funcName = usymname(rip)
fileLine = usymline(rip)
printf(“%p: %s\n”,rip,funcName)
while(funcName != goBaseName && rbp_itr !=0){
funcName = usymname(user_long(rbp_itr+8))
fileLine = usymline(user_long(rbp_itr+8))
printf(“%p: %s \n”,user_long(rbp_itr+8),funcName)
rbp_itr = user_long(rbp_itr)
}
printf(“……….……..\n”)
}
function dumpProccessInfo(){
printf(“pid:%d, tid:%d, pid name:%s, ppid:%d, ppid name:%s, func:%s, cmd:%s \n”,pid(),tid(),pid2execname(pid()),ppid(), pid2execname(ppid()), ppfunc(), cmdline_str())
)
}
下面結(jié)合實(shí)際例子給出上述systemtap自定義函數(shù)的使用
probe process(“/usr/bin/docker-runc”),function(“github.com/opencontainers/runc/libcontainer.prepareRoot”) {
print_timeNow()
print_x8664_gostack()
}
如何通過systemtap修改程序中變量
systemtap除了可以抓取程序執(zhí)行狀態(tài)外粹断,還可以修改程序的變量肉康。只需要在stap命令中添加-g參數(shù)讓其工作在guru模式下即可旷赖。
例如下面腳本可以修改dockerd程序的killwithSignal函數(shù)的入?yún)ig的值
probe process ("/usr/bin/dockerd) .function( "github .cam/docker/docker/ daemon. (*Daemon) .killwithsignal"){
print_time()
print _process_info()
printf(“before signal %s”,$sig)
$sig=4沥阱;
print kstack()
}