如何使用systemtap抓取golang 堆棧,如何修改程序運(yùn)行值

首先是在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()
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容