记录:添加trace_event埋点并调用
记录:添加trace_event埋点并调用
1. 环境
基于如下环境添加测试:
- Android P
- kernel 4.9.118
- 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来做测试:
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接口;
Makefile
obj-y := my_test.o
编译
将上述的my_test.c和Makefile 添加到drivers中某个目录下,比如:
drivers/misc/test/
需要在misc目录下的Makefile中添加:
obj-y += test/
即将我们添加的drv加入编译;
4. 测试抓取
升级烧录kernel.img,重新启动机器;
设置需要抓取的event:
echo “my_test sched” > set_event
抓取
echo 1 > tracing_on
# 等待10s
echo 0 > tracing_on
拉取trace查看
上述抓取数据为中间版本,整理code为最终版本,基本可以体现要点;
5. 相关记录
- 添加的关键在于/include/trace/events/ 需要注意此部分的type使用;
- 调用时一定注意包含宏和头文件,这样相关部分才会实际进行编译;
- 注意到底层实际1s计算是按照1024个单位计算的:schedule_timeout(HZ)
另本部分仅整理如何添加,对于相关宏的解析处理下一篇整理;
记录:添加trace_event埋点并调用相关推荐
- Android记录15--关于ListView中adapter调用notifyDataSetChanged无效的原因
Android记录15--关于ListView中adapter调用notifyDataSetChanged无效的原因 2014年1月16日 开发记录 话说这个问题已经困扰我很久了,一直找不到原因,我以 ...
- SharePoint中添加或者修改Item时调用EventReceiver(Event Handler)处理额外的逻辑
SharePoint中添加或者修改Item时调用EventReceiver(Event Handler)处理额外的逻辑.取名:EricSunArticlesListItemEventReceiver ...
- JDBC实现四六级考试记录添加、查询、删除功能
JDBC实现四六级考试记录添加.查询.删除功能 1. 代码演示 2. 项目的目录结构 3. 数据库mysql 4. code 4.1 ExamTest.class package com.shan.e ...
- 隐性域名转发html代码,你知道显性URL转发/隐性URL转发记录添加方式吗
显性URL转发/隐性URL转发其实URL转发里面的两种转发方式,根据跳转后的是否改变域名来判断显性还是隐形.当然根据不同的需要,可以选择不同的转发方式.今天小编为大家介绍的是隐/显性URL转发记录添加 ...
- 如何给查询出的SQL记录添加序号列
--给查询出的SQL记录添加序号列,解决方法有以下两种--第一:这种方法是根据字段名1进行分组排队.select ROW_NUMBER() OVER (partition by 字段名1 ORDER ...
- 域名申请·多域名SSL证书申请·SSL证书认证流程·CAA解析记录添加
环境:VPS:CentOS8 1.申请域名 通过阿里云申请一个域名就好,博主申请了个人域名.top,第一年6元 2.添加一条IPV4的DNS解析记录 阿里云-控制台-域名解析-解析设置-添加新纪录 这 ...
- html 删除记录,添加删除记录.html
添加删除记录练习 window.onload = function () { var allA = document.getElementsByTagName("a"); //为删 ...
- mysql insert 几分钟_我们可以在MySQL中应用INSERT语句时向VARCHAR日期时间记录添加分钟吗?...
是的,我们可以在将值插入表中时增加分钟数.让我们首先创建一个表.在这里,我们有一列包含VARCHAR记录,其中mysql> create table DemoTable2026 -> ( ...
- 记录 activity onStop、onDestroy 延迟调用问题解决过程
问题背景 在我的项目中,从其它页面回到首页后,其它页面的 onStop.onDestroy 都会延迟调用,大概 7s 左右吧. 思考方向 1.可能是 Home 页面的onStart onResume ...
- linux添加了路径还是不能调用_166个最常用的Linux命令,哪些你还不知道?
击上方蓝色"程序员追风",选择"设为星标" 回复"关键词"获取整理好的面试资料 来源:cnblogs.com/chenliangchaosh ...
最新文章
- linux 保留内核中sas驱动的加载导致crash问题
- 注册和登陆与数据库的链接
- 【LaTeX】E喵的LaTeX新手入门教程(2)基础排版
- Springboot 整合 swagger
- IntelliJ IDEA打jar时,MANIFEST.MF内容出错
- redis使用lua脚本
- ASP.NET中的HttpWorkerRequest对像及其应用
- 东方时尚驾校学习心得
- java graphics 模糊_使用Graphics2D模糊Java背景
- 如何在你的 wordpress 网站中添加搜索框
- 北京妙计旅行 后台开发实习一面二面
- Linux服务器git clone卡住不动
- Android UI设计经验分享,掌握设计技巧,让你的应用独树一帜
- 速卖帮AI点餐流程 AI菜品识别结账
- AB PLC数据的Node-Red简单数据可视化+MQTT数据云共享之节点分享
- Eclipse 安装 Jrebel插件
- 移柯L620接入电信云平台
- 绝密!!!!!明星的身份证照片!!!!
- 威力导演19安装说明以新功能
- 正确选择PDF转CAD软件官方下载能够免费使用
热门文章
- Android 测试 之MonkeyRunner
- 重读《从菜鸟到测试架构师》--构建测试
- error: not found: value sc
- croppic 图片裁剪
- 根据深度优先算法(DFS)和标记数组求全排列
- [转]js和jquery获取窗体高度
- HDU 2028Lowest Common Multiple Plus
- 高性能服务器架构 的几个注意点 (High-Performance Server Architecture)
- JQuery CSS 基本选择器 详解
- python3.7.4安装chrome_Python3.7安装chrome驱动方法