systemtap统计 探测linux驱动或应用程序中某个函数的执行时间

systemtap可以无损的探测。当然前提是ubuntu之类的系统默认已经开启kprobe。

直接上脚本:

#!/usr/bin/stap
global start, end

probe module("your_driver").function("your_function") {
start[tid()] = gettimeofday_ns()
}

probe module("your_driver").function("your_function").return {
end[tid()] = gettimeofday_ns()

printf("your_driver:your_function took %d ns to execute\n", end[tid()] - start[tid()])
}

使用方法:保存成xxx.stp,然后sudo stap xxx.stp      ——和sh脚本用法一样

全过程在ubuntu 20.04 destop lts 上测试,只需要安装systemtap-4.9,然后就可以直接运行这个脚本了,没有其他配置。我是systemtap-4.9源码编译安装的,linux kernel版本:5.15.0-88

systemtap的安装或源码安装,都需要和kernel版本匹配,这一点非常重要。

 

另外:linux用户空间的函数也可以探测:

 

#!/usr/local/bin/stap

global ns_starts
global enable_trace = 0

probe begin{
    printf("begin>>>>")
}

probe process("/data/xxx/cccc/output/zzz_write_read_buffer").library("/opt/eee/lib/x86_64-linux-gnu/libOpenCL.so.1").function("clEnqueueReadBuffer").call {
  enable_trace = 1
}
probe process("/data/xxx/ccc/output/zzz_write_read_buffer").library("/opt/eee/lib/x86_64-linux-gnu/libOpenCL.so.1").function("clEnqueueReadBuffer").return {
  enable_trace = 0
}

probe process("/data/xxx/ccc/output/zzz_write_read_buffer").function("MemCopy_dev").call {
if(enable_trace >= 1)
{
ns_starts = gettimeofday_ns()
}
}
probe process("/data/xxx/ccc/output/zzz_write_read_buffer").function("MemCopy_dev").return {
if(enable_trace >= 1)
{
printf("%s:%d\n", ppfunc(), gettimeofday_ns()-ns_starts)
}
}

 如果你不知道函数在哪个动态库,可以试试模糊匹配,自动查找:.library("/opt/eee/lib/x86_64-linux-gnu*.so.1")

systemtap里还有其他模糊匹配的方式

批评下2024年初的国产大模型:把标题给大模型,chatgpt 3.5给出的就是上述可用脚本,国产的讯飞和百度模型,全都错误,东拉西扯。

整合下各家的算力、知识库,引入外网知识库,好好搞搞吧。

posted @ 2024-01-18 11:19  园友1683564  阅读(97)  评论(0编辑  收藏  举报