中暑虚脱

注册

 

发新话题 回复该主题

Zephyrtracing系统2 [复制链接]

1#
程少为预约 https://m-mip.39.net/disease/mip_8231870.html

Zephyr支持5种TraceTool,虽然每种tool的实现都不一样,但从内核代码埋入tracingAPI到实际调用到tool是共用的,本文对共用部分进行分析。

配置

CONFIG_TRACING配置启用tracing系统,如果为n,tracing系统将不会被编译进zephyr下面6项是多选1:TRACING_NONE:不使用TracetoolCONFIG_PERCEPIO_TRACERECORDER:使用tracerecoderSEGGER_SYSTEMVIEW:使用systemviewTRACING_CTF:使用CTSTRACING_TEST:使用testTRACING_USER:使用user下面17项是对tracing对象的选择,默认为选中,当配置为n时将不会在该对象中埋入hookAPICONFIG_SYSCALL_TRACING:trace系统调用,目前没有实现CONFIG_TRACING_THREAD:tracethread,sys_port_trace_type_mask_k_threadCONFIG_TRACING_WORK:traceworkCONFIG_TRACING_ISR:traceISRCONFIG_TRACING_SEMAPHORE:trace信号量CONFIG_TRACING_MUTEX:trace互斥量CONFIG_TRACING_CONDVAR:trace条件变量CONFIG_TRACING_QUEUE:tracequeueCONFIG_TRACING_FIFO:traceFIFOCONFIG_TRACING_LIFO:traceLIFOCONFIG_TRACING_STACK:tracestackCONFIG_TRACING_MESSAGE_QUEUE:trace消息列队CONFIG_TRACING_MAILBOX:trace邮箱CONFIG_TRACING_PIPE:trace管道CONFIG_TRACING_HEAP:traceheapCONFIG_TRACING_MEMORY_SLAB:traceslabCONFIG_TRACING_TIMER:tracetimer

框架代码hook宏

所有被trace内核对象中都是调用下面9个宏进行hook

SYS_PORT_TRACING_FUNC(type,func,...)SYS_PORT_TRACING_FUNC_ENTER(type,func,...)SYS_PORT_TRACING_FUNC_BLOCKING(type,func,...)SYS_PORT_TRACING_FUNC_EXIT(type,func,...)SYS_PORT_TRACING_OBJ_INIT(obj_type,obj,...)SYS_PORT_TRACING_OBJ_FUNC(obj_type,func,obj,...)SYS_PORT_TRACING_OBJ_FUNC_ENTER(obj_type,func,obj,...)SYS_PORT_TRACING_OBJ_FUNC_BLOCKING(obj_type,func,obj,timeout,...)SYS_PORT_TRACING_OBJ_FUNC_EXIT(obj_type,func,obj,...)

这9个宏可以分为两组,一组是普通函数的hook,一组是内核对象函数的hook,两组宏都支持变参,可以记录被trace函数的参数

普通函数的hook

用于hook一般的内核函数:

线程相关函数

调度相关函数

poll相关函数

timeout相关函数

电源管理相关函数:目前电源管理虽然有插入hook,但最后并没有实现

各个宏的含义SYS_PORT_TRACING_FUNC(type,func,…)跟踪函数被调用次数和何时调用,类型为type功能为func,例如要跟踪k_thread_user_mode_enter,其type是k_thread,函数功能是user_mode_enter就在其中埋入

1

SYS_PORT_TRACING_FUNC(k_thread,user_mode_enter);

SYS_PORT_TRACING_FUNC_ENTER(type,func,…)`SYS_PORT_TRACING_FUNC_EXIT(type,func,…):跟踪函数进入和退出的时机点,类型为type功能为func,例如要跟踪线程sleep函数z_impl_k_usleep,其type是k_thread,函数功能是usleep,sleep的时间为us,埋入情况如下

101

int32_tz_impl_k_usleep(intus){  int32_tticks;  SYS_PORT_TRACING_FUNC_ENTER(k_thread,usleep,us);  ticks=k_us_to_ticks_ceil64(us);  ticks=z_tick_sleep(ticks);  SYS_PORT_TRACING_FUNC_EXIT(k_thread,usleep,us,k_ticks_to_us_floor64(ticks));  returnk_ticks_to_us_floor64(ticks);}

SYS_PORT_TRACING_FUNC_BLOCKING(type,func,…)跟踪函数被bloking的时机点,类型为type功能为func,目前Zephyr内核未使用该种trace。

内核对象函数的hook

用于hook内核对象:mutex,semaphore,msgq,pipes,queue,timer,fifo,lifo,work,stack,mailbox,condvar,heap,slab

SYS_PORT_TRACING_OBJ_INIT(obj_type,obj,…)跟踪内核对象obj初始化的时机,类型为obj_type,例如要跟踪mutex的初始化,埋入下面hook

1

SYS_PORT_TRACING_OBJ_INIT(k_mutex,mutex,0);

SYS_PORT_TRACING_OBJ_FUNC(obj_type,func,obj,…)跟踪内核对象obj的函数被调用时机,类型为type功能为func,例如要跟踪z_impl_k_timer_start,埋入下面hook

1

SYS_PORT_TRACING_OBJ_FUNC(k_timer,start,timer);

SYS_PORT_TRACING_OBJ_FUNC_ENTER(obj_type,func,obj,…)SYS_PORT_TRACING_OBJ_FUNC_EXIT(obj_type,func,obj,…)跟踪内核对象obj的函数进入和退出时机点,类型为type功能为func,例如要跟踪k_malloc,埋入下面hook

10

void*k_malloc(size_tsize){  SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_heap_sys,k_malloc,_SYSTEM_HEAP);  void*ret=k_aligned_alloc(sizeof(void*),size);  SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_heap_sys,k_malloc,_SYSTEM_HEAP,ret);  returnret;}

SYS_PORT_TRACING_OBJ_FUNC_BLOCKING(obj_type,func,obj,timeout,…)跟踪内核对象obj的函数block时机点,类型为type功能为func,例如要跟踪k_malloc,埋入下面hook

1011415161

boolk_work_flush(structk_work*work,    structk_work_sync*sync){  SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_work,flush,work);  structz_work_flusher*flusher=sync-flusher;  k_spinlock_key_tkey=k_spin_lock(lock);  boolneed_flush=work_flush_locked(work,flusher);  k_spin_unlock(lock,key);  /*Ifnecessarywaituntiltheflusheritem

分享 转发
TOP
发新话题 回复该主题