记录:添加trace_event埋点并调用

1. 环境

基于如下环境添加测试:

  1. Android P
  2. kernel 4.9.118
  3. ftrace 功能打开

2. 添加trace_test_entry

kernel中所有支持的trace接口,都定义在如下目录:

kernel-4.9/include/trace/events

所以我们只需要参照其中实现方法,将所需要的内容添加进去即可:

#undef TRACE_SYSTEM
#define TRACE_SYSTEM my_test //确保定义为我们添加的trace,注意这里的name需要与xxx.h保持一致#if !defined(_TRACE_MYTEST_H) || defined(TRACE_HEADER_MULTI_READ)
#define _TRACE_MYTEST_H#include <linux/tracepoint.h>DECLARE_EVENT_CLASS(test_class,//这里定义一个模板类,参数相同,处理相同的trace_api可以使用TP_PROTO(const char *name, int count),TP_ARGS(name, count),//name、proto、args这三个参数会在tracepoint解析时使用;TP_STRUCT__entry(//name、entry、assign、printk是traceevent解析时使用;__string(name, name)__field(int, count)),//entry即trace event入口定义的结构TP_fast_assign(//处理entry与args的关系__assign_str(name, name);__entry->count = count;),TP_printk("function: %s, count: %d ",//以需要的方式打印,如下这里搞两个常用的__get_str(name),// 打印个字符串__entry->count // 打印个int)
);DEFINE_EVENT(test_class, test_entry,//实际定义trace_test_entryTP_PROTO(const char *name, int count),TP_ARGS(name, count)
);DEFINE_EVENT(test_class, test_exit,TP_PROTO(const char *name, int count),TP_ARGS(name, count)
);#endif /* _TRACE_PRINTK_H */
/* This part must be outside protection */
#include <trace/define_trace.h>

注释中已经有相关描述了,操作非常简单,想记录哪些参数进去,只需要在此目录中grep 参考即可;

上述code中,主要为测试class的用法,如果只有一个简单的接口的话,直接参考printk.h文件使用TRACE_EVENT宏即可;

3. 调用trace_test_entry

上述添加完成后,需要在合适的位置调用trace_test_entry接口,对于kernel中,我们直接new一个module来做测试:

  1. mytest.c

    #include <linux/init.h>
    #include <linux/module.h>
    #include <linux/kthread.h>#define CREATE_TRACE_POINTS
    #include <trace/events/my_test.h>//引入头文件,注意上述define 只有包含这个才会在编译时找到头文件解析;static int test_thread(void *args) {static unsigned long count = 0;while (!kthread_should_stop()) {//线程循环1s唤醒一次set_current_state(TASK_INTERRUPTIBLE);schedule_timeout(HZ);trace_test_entry(__func__, count);//我们的trace调用count++;//用来统计唤醒次数;}return 0;
    }struct task_struct *test_task;
    static __init int __module_test_init(void) {//module init入口函数printk("Hello, %s is entry. \n", __func__);//只是为了确保有加载成功;test_task = kthread_run(test_thread, NULL, "my_test_thread");//起一个线程if(IS_ERR(test_task)) return -1;return 0;
    }
    static __exit void __module_test_exit(void) {kthread_stop(test_task);//stop线程并退出printk("Bye, %s is exit. \n", __func__);return ;
    }module_init(__module_test_init);
    module_exit(__module_test_exit);
    MODULE_LICENSE("GPL");
    

    非常简单的一个drv,其主要功能就是1s唤醒一次线程,调用一次trace接口;

  2. Makefile

    obj-y := my_test.o

  3. 编译

    将上述的my_test.c和Makefile 添加到drivers中某个目录下,比如:

    drivers/misc/test/

    需要在misc目录下的Makefile中添加:

    obj-y += test/

    即将我们添加的drv加入编译;

4. 测试抓取

  1. 升级烧录kernel.img,重新启动机器;

  2. 设置需要抓取的event:

    echo “my_test sched” > set_event

  3. 抓取

    echo 1 > tracing_on

    # 等待10s

    echo 0 > tracing_on

  4. 拉取trace查看

    上述抓取数据为中间版本,整理code为最终版本,基本可以体现要点;

5. 相关记录

  1. 添加的关键在于/include/trace/events/ 需要注意此部分的type使用;
  2. 调用时一定注意包含宏和头文件,这样相关部分才会实际进行编译;
  3. 注意到底层实际1s计算是按照1024个单位计算的:schedule_timeout(HZ)

另本部分仅整理如何添加,对于相关宏的解析处理下一篇整理;

记录:添加trace_event埋点并调用相关推荐

  1. Android记录15--关于ListView中adapter调用notifyDataSetChanged无效的原因

    Android记录15--关于ListView中adapter调用notifyDataSetChanged无效的原因 2014年1月16日 开发记录 话说这个问题已经困扰我很久了,一直找不到原因,我以 ...

  2. SharePoint中添加或者修改Item时调用EventReceiver(Event Handler)处理额外的逻辑

    SharePoint中添加或者修改Item时调用EventReceiver(Event Handler)处理额外的逻辑.取名:EricSunArticlesListItemEventReceiver ...

  3. JDBC实现四六级考试记录添加、查询、删除功能

    JDBC实现四六级考试记录添加.查询.删除功能 1. 代码演示 2. 项目的目录结构 3. 数据库mysql 4. code 4.1 ExamTest.class package com.shan.e ...

  4. 隐性域名转发html代码,你知道显性URL转发/隐性URL转发记录添加方式吗

    显性URL转发/隐性URL转发其实URL转发里面的两种转发方式,根据跳转后的是否改变域名来判断显性还是隐形.当然根据不同的需要,可以选择不同的转发方式.今天小编为大家介绍的是隐/显性URL转发记录添加 ...

  5. 如何给查询出的SQL记录添加序号列

    --给查询出的SQL记录添加序号列,解决方法有以下两种--第一:这种方法是根据字段名1进行分组排队.select ROW_NUMBER() OVER (partition by 字段名1 ORDER ...

  6. 域名申请·多域名SSL证书申请·SSL证书认证流程·CAA解析记录添加

    环境:VPS:CentOS8 1.申请域名 通过阿里云申请一个域名就好,博主申请了个人域名.top,第一年6元 2.添加一条IPV4的DNS解析记录 阿里云-控制台-域名解析-解析设置-添加新纪录 这 ...

  7. html 删除记录,添加删除记录.html

    添加删除记录练习 window.onload = function () { var allA = document.getElementsByTagName("a"); //为删 ...

  8. mysql insert 几分钟_我们可以在MySQL中应用INSERT语句时向VARCHAR日期时间记录添加分钟吗?...

    是的,我们可以在将值插入表中时增加分钟数.让我们首先创建一个表.在这里,我们有一列包含VARCHAR记录,其中mysql> create table DemoTable2026 -> ( ...

  9. 记录 activity onStop、onDestroy 延迟调用问题解决过程

    问题背景 在我的项目中,从其它页面回到首页后,其它页面的 onStop.onDestroy 都会延迟调用,大概 7s 左右吧. 思考方向 1.可能是 Home 页面的onStart onResume ...

  10. linux添加了路径还是不能调用_166个最常用的Linux命令,哪些你还不知道?

    击上方蓝色"程序员追风",选择"设为星标" 回复"关键词"获取整理好的面试资料 来源:cnblogs.com/chenliangchaosh ...

最新文章

  1. linux 保留内核中sas驱动的加载导致crash问题
  2. 注册和登陆与数据库的链接
  3. 【LaTeX】E喵的LaTeX新手入门教程(2)基础排版
  4. Springboot 整合 swagger
  5. IntelliJ IDEA打jar时,MANIFEST.MF内容出错
  6. redis使用lua脚本
  7. ASP.NET中的HttpWorkerRequest对像及其应用
  8. 东方时尚驾校学习心得
  9. java graphics 模糊_使用Graphics2D模糊Java背景
  10. 如何在你的 wordpress 网站中添加搜索框
  11. 北京妙计旅行 后台开发实习一面二面
  12. Linux服务器git clone卡住不动
  13. Android UI设计经验分享,掌握设计技巧,让你的应用独树一帜
  14. 速卖帮AI点餐流程 AI菜品识别结账
  15. AB PLC数据的Node-Red简单数据可视化+MQTT数据云共享之节点分享
  16. Eclipse 安装 Jrebel插件
  17. 移柯L620接入电信云平台
  18. 绝密!!!!!明星的身份证照片!!!!
  19. 威力导演19安装说明以新功能
  20. 正确选择PDF转CAD软件官方下载能够免费使用

热门文章

  1. Android 测试 之MonkeyRunner
  2. 重读《从菜鸟到测试架构师》--构建测试
  3. error: not found: value sc
  4. croppic 图片裁剪
  5. 根据深度优先算法(DFS)和标记数组求全排列
  6. [转]js和jquery获取窗体高度
  7. HDU 2028Lowest Common Multiple Plus
  8. 高性能服务器架构 的几个注意点 (High-Performance Server Architecture)
  9. JQuery CSS 基本选择器 详解
  10. python3.7.4安装chrome_Python3.7安装chrome驱动方法