El principio de implementación de systrace
systrace se implementa utilizando atrace y ftrace juntos.
El comando adb para capturar systrace es el siguiente:
adb shell atrace -t 8 -z gfx view wm am sched freq input > atrace
comando python :
p>
python systrace.py -b 10240 -t 10 wm am input ss power view freq workq sincronización inactiva programada gfx view hal dalvik disk -a com.h
system/core/ libcutils/include /cutils/trace.h
system/core/libcutils/trace-dev.cpp
system/core/libcutils/trace-dev.inc
Como lo que ve aquí:
ATRACE_CALL en realidad escribe el nombre de la función y el pid del proceso en atrace_marker_fd, que corresponde al archivo "/sys/kernel/debug/tracing/trace_marker". "Marker"
Systrace en la capa del kernel se implementa esencialmente a través de ftrace. El contenido de systrace se escribe en el ringbuffer asignado por el kernel. El interruptor esencialmente habilita/deshabilita el ringbuffer. tracing/tracing_on
adb shell echo 0 > /sys/kernel/debug/tracing/tracing_on
Escribir ringbuffer a través de la función tracing_mark_write
msm-4.19/kernel/trace/trace.c.
Consulte la siguiente figura para conocer el principio general:
ftrace es la abreviatura de seguimiento de función. Cada seguimiento de función está representado por una estructura de punto de seguimiento correspondiente, que se almacena en una parte especial de memoria .
msm-4.19/include/linux/tracepoint-defs.h
3.1 Registro de la función de detección de Tracepoint
Tomando el controlador ftrace de la GPU de Qualcomm como ejemplo, el siguiente El comando activará el registro de la función de detección de tracepoint
adb shell echo 1 > /sys/kernel/debug/tracing/events/kgsl/enable
msm-4.19/kernel/ tracepoint.c
La función de detección de Tracepoint se define principalmente en la siguiente macro, a través de la cual ftrace escribe los datos de seguimiento de la función en el ringbuffer correspondiente
msm-4.19/include/trace/ trace_events.h
3.2 Detectar llamadas a funciones
Utilice el controlador Qualcomm gpu para enumerar los comandos de dibujo en la función _queue_drawobj
msm-4.19/drivers/gpu/ msm/adreno_dispatch .c
Rastree datos a través de trace_adreno _cmdbatch_queued para rastrear la función _queue_drawobj y llame a la función de sonda de tracepoint
A continuación, verifique la implementación de trace_adreno_cmdbatch_queued
msm-4.19/ drivers/gpu/msm/adreno_trace./adreno_trace.h
trace_adreno_cmdbatch_queued en realidad está definido en la siguiente macro
msm-4.19/include/linux/tracepoint.h
Finalmente llame a la función de detección registrada por tracepoint
msm-4.19/include/linux/tracepoint.h
En resumen: la capa local llama a tracing_mark_write del kernel para Al escribir en el ringbuffer de ftrace, la función del kernel llama a su función de detección correspondiente para escribir en el ringbuffer de ftrace.