Ftrace使用及实现机制

2023-11-16

Ftrace使用及实现机制

版权声明:本文为本文为博主原创文章,转载请注明出处 https://www.cnblogs.com/wsg1100 如有错误,欢迎指正。

一、使用ftrace

ftrace 即function tracer,最初是用来 trace 内核中的函数,在 2008 年的时候被合入了 Linux 内核,当时的版本是 Linux2.6.x。现在 ftrace 的功能不仅仅是function tracer,更加丰富了,可观测内核很多信息。本文分为两个部分,第一部分介绍ftrace的使用,大部分来源于Linux内核ftrace文档,第二部分介绍ftrace的实现原理。


1.挂载

ftrace 的所有操作在 tracefs 这个虚拟文件系统中完成, tracefs 的挂载点在 /sys/kernel/debug/tracing 下:

# cat /proc/mounts | grep tracefs
tracefs /sys/kernel/debug/tracing tracefs rw,relatime 0 0

如果没有自动挂载,则需要手动挂载:

# mount -t tracefs /sys/kernel/debug/tracing

挂载后/sys/kernel/debug/tracing 目录下的文件如下:

# cd /sys/kernel/debug/tracing
# ls
available_events            events                    README                  set_graph_function  trace_marker_raw
available_filter_functions  free_buffer               saved_cmdlines          set_graph_notrace   trace_options
available_tracers           function_profile_enabled  saved_cmdlines_size     snapshot            trace_pipe
buffer_percent              hwlat_detector            saved_tgids             stack_max_size      trace_stat
buffer_size_kb              instances                 set_event               stack_trace         tracing_cpumask
buffer_total_size_kb        kprobe_events             set_event_notrace_pid   stack_trace_filter  tracing_max_latency
current_tracer              kprobe_profile            set_event_pid           synthetic_events    tracing_on
dynamic_events              max_graph_depth           set_ftrace_filter       timestamp_mode      tracing_thresh
dyn_ftrace_total_info       options                   set_ftrace_notrace      trace               uprobe_events
enabled_functions           per_cpu                   set_ftrace_notrace_pid  trace_clock         uprobe_profile
error_log                   printk_formats            set_ftrace_pid          trace_marker

2. 关键文件介绍

tracefs 虚拟文件系统下的文件操作和我们常用的 Linux proc 和 sys 虚拟文件系统的操作差不多。通过对某个文件的 echo 操作,我们可以向内核的 ftrace 系统发送命令,然后 cat 某个文件得到 ftrace 的返回结果。

/sys/kernel/debug/tracing 目录各文件及作用如下,根据具体场景使用:

current_tracer

设置或显示当前tracer配置。

available_tracers

内核支持的tracer配置,内核编译时配置,将里面的配置写入current_tracer即设置设置当前trace功能。

tracing_on

设置是否将trace写入tracer缓冲区,写0到该文件禁用trace写入缓冲区,写1启用,无论写0还是写1,内核trace都在运行,都有trace开销。

trace:

该文件以人类可读的格式保存跟踪的输出。注意,正在读取(打开)此文件时会暂时禁用跟踪。

trace_pipe:

输出与“trace”文件相同,但此文件应使用实时跟踪进行流式处理。从此文件读取将阻塞,直到检索到新数据。 与“trace”文件不同,此文件是消费者。 一旦从该文件读取数据,就会消耗该数据。 “trace”文件是静态的,如果跟踪器没有添加更多数据,则每次读取时都会显示相同的信息。 此文件在读取时不会禁用跟踪。

trace_options:

此文件允许用户控制上述输出文件之一中显示的数据量。

options:

这是一个目录,其中包含每个可用跟踪选项的文件(也在trace_options中)。 也可以通过将“1”或“0”分别写入带有选项名称的相应文件来设置或清除选项。

tracing_max_latency:

一些跟踪器记录了最大延迟。 例如,禁用中断的最长时间。此文件中保存最长时间。 最大跟踪也将得到优化,并通过trace显示。 如果延迟大于此文件中的值(以微秒为单位),则只会记录新的最大跟踪。
通过echo写入一个时间值,除非它大于此文件中的时间,否则不会记录任何延迟。

tracing_thresh:

只要延迟大于此文件中的数字,某些延迟跟踪器就会记录跟踪。仅当文件包含大于0的数字时才有效。(以微秒为单位)

buffer_size_kb

这将设置或显示每个CPU缓冲区大小。 默认情况下,跟踪缓冲区的大小与每个CPU的大小相同。 显示的数字是CPU缓冲区的大小,而不是所有缓冲区的总大小。 跟踪缓冲区分配在一个内存页面(内核用于分配的内存块,通常为4 KB)。

buffer_total_size_kb:

这将显示所有跟踪缓冲区的总大小。

free_buffer:

用于释放缓冲区,让一个跟踪进程打开这个文件,当进程退出时,该文件的文件描述符将被关闭,这样,环形缓冲区将被“释放”。

tracing_cpumask:

这是一个掩码,用于指定跟踪的CPU。格式是表示CPU的十六进制字符串。

set_ftrace_filter:

set_ftrace_notrace:

这与set_ftrace_filter的效果相反。 此处添加的任何功能都不会被跟踪。 如果set_ftrace_filterset_ftrace_notrace中都存在函数,则不会跟踪该函数。

set_ftrace_pid:

让函数跟踪器仅跟踪其PID在此文件中列出的线程。如果设置了“function-fork”选项,那么当该文件中列出PID的任务分fork时,子进程的PID将自动添加到该文件中,并且该子进程将被跟踪。 此选项还将导致退出的任务的PID从文件中删除。

set_event_pid:

此文件中列出的需要event跟踪的任务PID。注意,sched_switchsched_wake_up还将跟踪此文件中列出的事件。如果要跟踪此文件中PID的任务的子进程,还需要启用“event-fork”选项。 任务退出时该文件内的PID将被删除。

set_graph_function:

函数图形跟踪器将跟踪此文件中列出的函数及其调用的函数。 (有关详细信息,请参阅“动态ftrace”部分)。

set_graph_notrace:

set_graph_function类似,但在函数被命中时将禁用函数图形跟踪,直到它退出函数。这使得可以忽略由特定函数调用的跟踪函数。

max_graph_depth:

与函数图形跟踪器一起使用。 这是它将追溯到函数的最大深度。 将其设置为值1将仅显示从用户空间调用的第一个内核函数。

available_filter_functions:

这列出了ftrace已处理并可跟踪的功能。这些是可以传递给“set_ftrace_filter”或“set_ftrace_notrace”的函数名称。 (有关详细信息,请参阅下面的“动态ftrace”部分。)

dyn_ftrace_total_info:

此文件用于调试目的。 已转换为nops且可以跟踪的函数数。

enabled_functions:

function_profile_enabled:

设置后,它将启用具有功能跟踪器或功能图形跟踪器的所有功能。 它将保留被调用函数数量的直方图,如果配置了函数图形跟踪器,它还将跟踪这些函数所花费的时间。 直方图内容可以显示在文件中:
trace_stats/function<cpu>(function0,function1等)。

trace_stats:

包含不同跟踪统计信息的目录。

kprobe_events:

启用动态跟踪点。 请参阅kprobetrace.txt。

kprobe_profile:

动态跟踪点统计信息。 请参阅kprobetrace.txt。

printk_formats:

这适用于读取原始格式文件的工具。 如果环形缓冲区中的事件引用了一个字符串,则只有指向该字符串的指针被记录到缓冲区而不是字符串本身。 这可以防止工具知道该字符串是什么。 此文件显示字符串的字符串和地址,允许工具将指针映射到字符串。

saved_cmdlines:

除非事件专门保存任务comm,否则只有任务的pid记录在跟踪事件中。 Ftrace对通信进行pid映射缓存,以尝试显示事件的通信。 如果未列出comm的pid,则输出中将显示“<…>”。
如果选项“record-cmd”设置为“0”,则在录制期间不会保存任务通信。 默认情况下,它启用.

saved_cmdlines_size:

默认情况下,会保存128个通讯(请参阅上面的“saved_cmdlines”)。 要增加或减少缓存的通信量,请将要缓存的通信数回显到此文件中。

saved_tgids:

如果设置了“record-tgid”选项,则在每个调度上下文切换时,任务的任务组ID将保存在将线程的PID映射到其TGID的表中。 默认情况下,禁用“record-tgid”选项。

snapshot:

这将显示“Snapshot”缓冲区,还允许用户拍摄当前运行跟踪的快照。 有关详细信息,请参阅下面的“Snapshot”部分。

stack_max_size:

激活堆栈跟踪器时,将显示它遇到的最大堆栈大小。请参阅下面的“堆栈跟踪”部分。

stack_trace:

这将显示激活堆栈跟踪器时遇到的最大堆栈的堆栈跟踪跟踪。请参阅下面的“堆栈跟踪”部分。

stack_trace_filter:

这与“set_ftrace_filter”类似,但它限制了堆栈跟踪器将检查的功能。

trace_clock:

只要将事件记录到环形缓冲区中,就会添加“timestamp”。这个时间戳来自指定的时钟。默认情况下,ftrace使用“local”时钟。这个时钟非常快且严格按照cpu计算,但在某些系统上,它可能与其他CPU相比不是单调的。换句话说,本地时钟可能与其他CPU上的本地时钟不同步。

通常用于跟踪的时钟如下(带有方括号的时钟是有效的。):

# cat trace_clock 
[local] global counter uptime perf mono mono_raw boot x86-tsc

local:默认时钟,但可能不在CPU之间同步.

global:此时钟与所有CPU同步,但可能比本地时钟慢一点。

counter:这根本不是时钟,而是一个原子计数器。它逐个计数,但与所有CPU同步。当您需要准确了解不同CPU上相互发生的订单事件时,这非常有用。

uptime 这使用jiffies计数器,时间戳相对于启动后的时间。

perf: 这使得ftrace使用perf使用的相同时钟。最终perf将能够读取ftrace缓冲区,这将有助于交错数据。

x86-tsc:架构可以定义自己的时钟。例如,x86在此使用自己的TSC周期时钟。

ppc-tb:这使用powerpc时基寄存器值。这在CPU之间是同步的,并且如果已知tb_offset,还可以用于跨管理程序/来宾关联事件。

mono:这使用快速单调时钟(CLOCK_MONOTONIC),它是单调递增的,可以进行NTP速率调整。

mono_raw:这是原始的单调时钟(CLOCK_MONOTONIC_RAW),它是单调递增的,但不受任何速率调整和滴答,速率与硬件时钟源相同。

boot:这是启动时钟(CLOCK_BOOTTIME),基于快速单调时钟,但也占用了挂起时间。由于时钟访问被设计用于在挂起路径中进行跟踪,因此如果在更新快速单声道时钟之前计算挂起时间之后访问时钟,则可能产生一些副作用。在这种情况下,时钟更新似乎比通常情况稍早发生。

要设置时钟,只需将时钟名称回显到此文件中即可。

echo global> trace_clock

trace_marker:
这是一个非常有用的文件,用于将用户空间与内核中发生的事件同步。 将字符串写入此文件将写入ftrace缓冲区。在应用程序中,在应用程序启动时打开此文件,并仅引用文件的文件描述符非常有用。

	void trace_write(const char *fmt, ...)
	{
		va_list ap;
		char buf[256];
		int n;

		if (trace_fd < 0)
			return;

		va_start(ap, fmt);
		n = vsnprintf(buf, 256, fmt, ap);
		va_end(ap);

		write(trace_fd, buf, n);
	}

//	开始:
		trace_fd = open("trace_marker", WR_ONLY);

trace_marker_raw:

这与上面的trace_marker类似,但是用于将二进制数据写入其中,其中可以使用工具来解析来自trace_pipe_raw的数据。

uprobe_events:

在程序中添加动态跟踪点。 请参阅uprobetracer.txt

uprobe_profile:

Uprobe统计。 请参阅uprobetrace.txt

instances:

这是一种制作多个跟踪缓冲区的方法,可以在不同的缓冲区中记录不同的事件。 请参阅下面的“实例”部分。

events:

这是跟踪事件目录。 它包含已编译到内核中的事件跟踪点(也称为静态跟踪点)。 它显示了存在哪些事件跟踪点以及它们如何按系统分组。 各种级别都有“启用”文件,可以在写入“1”时启用跟踪点。有关更多信息,请参阅events.txt。

set_event:

通过在事件中回显到此文件,将启用该事件。有关更多信息,请参阅events.txt。

available_events:

可以在跟踪中启用的事件列表,有关更多信息,请参阅events.txt。

hwlat_detector:

硬件延迟检测器的目录。请参阅下面的“硬件延迟检测器”部分。

per_cpu:

这是一个包含跟踪per_cpu信息的目录。

per_cpu/cpu0/buffer_size_kb:

ftrace缓冲区定义为per_cpu。 也就是说,每个CPU都有一个单独的缓冲区,允许以原子方式完成写入,并且不受cache bouncing的影响。 这些缓冲区可能有不同大小的缓冲区 此文件类似于buffer_size_kb文件,但它仅显示或设置特定CPU的缓冲区大小。 (这里是cpu0)。

per_cpu/cpu0/trace:

这类似于“跟踪”文件,但它只显示特定于CPU的数据。 如果写入,它只清除特定的CPU缓冲区。

per_cpu/ CPU0/ trace_pipe

这类似于“trace_pipe”文件,并且是一个消耗读取,但它只显示(和使用)特定于CPU的数据。

per_cpu/ CPU0/ trace_pipe_raw

对于可以解析ftrace环形缓冲区二进制格式的工具,trace_pipe_raw文件可用于直接从环形缓冲区中提取数据。 通过使用splice()系统调用,缓冲区数据可以快速传输到文件或服务器正在收集数据的网络。与trace_pipe一样,这是一个消费者,其中多次读取将始终产生不同的数据。

per_cpu/ CPU0/snapshot

这类似于主“快照”文件,但只会对当前CPU(如果支持)进行快照。 它仅显示给定CPU的快照内容,如果写入,则仅清除此CPU缓冲区。

per_cpu/cpu0/snapshot_raw:

与trace_pipe_raw类似,但将从给定CPU的快照缓冲区中读取二进制格式。

per_cpu/cpu0/stats:
这会显示有关环形缓冲区的某些统计信息:

entries:仍在缓冲区中的事件数。

overrun: 缓冲区已满时由于覆盖而丢失的事件数。

commit overrun:应该始终为零。
如果在嵌套事件(环形缓冲区重入)中发生了如此多的事件,则它会被设置,它会填充缓冲区并开始丢弃事件。
bytes:字节实际读取(未覆盖)。
oldest event ts:缓冲区中最旧的时间戳
now ts:当前时间戳
dropped events:由于覆盖选项关闭而导致事件丢失。
read events:读取的事件数.

3.current_tracer列表

以下是可配置的current_tracer列表:

function
函数调用跟踪器来跟踪所有内核函数。

**function_graph **
与函数跟踪器类似,除了函数跟踪器探测其条目上的函数,而函数图形跟踪器跟踪函数的进入和退出。 然后它提供了绘制类似于C代码源的函数调用图的能力。

blk
块跟踪器。 blktrace用户应用程序使用的跟踪器。

hwlat
硬件延迟跟踪器用于检测硬件是否产生任何延迟。 请参阅下面的“硬件延迟检测器”部分。

irqsoff
跟踪禁用中断的区域并以最长的最大延迟保存跟踪。请参阅tracing_max_latency。 记录新的最大值时,它将替换旧的迹线。 最好在启用延迟格式选项的情况下查看此跟踪,这在选择跟踪器时会自动发生。

preemptoff
与irqsoff类似,但跟踪并记录禁用抢占的时间。

preemptirqsoff
与irqsoff和preemptoff类似,但跟踪并记录禁用irqs和/或抢占的最大时间。

wakeup
跟踪并记录最高优先级任务在被唤醒后进行调度所需的最大延迟。按照普通开发人员的预期跟踪所有任务。

wakeup_rt
跟踪并记录仅执行RT任务所需的最大延迟(如当前“唤醒”所做的那样)。 这对那些对RT任务的唤醒时间感兴趣的人很有用。

wakeup_dl
跟踪并记录SCHED_DEADLINE任务被唤醒所需的最大延(如wakeupwakeup_rt)。

mmiotrace
用于跟踪二进制模块的特殊跟踪器。 它将跟踪模块对硬件的所有调用。 它所写的所有内容以及从I / O中读取的内容。

branch
在跟踪内核中可能/不可能的调用时,可以配置此跟踪器。 它将追踪一个可能的和不太可能的分支何时被击中,以及它在预测正确时是否正确。

nop
这是“无痕迹”的示踪剂。 要从跟踪中删除所有跟踪器,只需将“nop”写道到current_tracer

4.trace输出示例

4.1 trace输出格式

下面简单了解下ftrace的使用。ftrace的输出结果都可以通过 cat trace 这个命令得到,在缺省状态下 ftrace 的 tracer 是 nop,也就是 ftrace 什么都不做。因此,我们从cat trace中也看不到别的,只是显示了 trace 输出格式。

root@work-machine:/sys/kernel/debug/tracing# cat trace
# tracer: nop
#
# entries-in-buffer/entries-written: 0/0   #P:8
#
#                                _-----=> irqs-off
#                               / _----=> need-resched
#                              | / _---=> hardirq/softirq
#                              || / _--=> preempt-depth
#                              ||| / _-=> migrate-disable
#                              |||| /     delay
#           TASK-PID     CPU#  |||||  TIMESTAMP  FUNCTION
#              | |         |   |||||     |         |

这里以function tracer为例,function tracer 只是 ftrace 最基本的功能,是我们平常调试 Linux 内核问题时最常用到的功能,执行 echo function > current_tracer 来告诉 ftrace,我要启用 function tracer.

root@work-machine:/sys/kernel/debug/tracing# cat current_tracer
nop
root@work-machine:/sys/kernel/debug/tracing# cat available_tracers
hwlat blk mmiotrace function_graph wakeup_dl wakeup_rt wakeup function nop
root@work-machine:/sys/kernel/debug/tracing# echo function > current_tracer
root@work-machine:/sys/kernel/debug/tracing# cat current_tracer
function

在启动了 function tracer 之后,我们再查看一下 trace 的输出。这时候我们就会看到大量的输出,每一行的输出就是当前内核中被调用到的内核函数。

root@work-host:/sys/kernel/debug/tracing# cat trace
# tracer: function
#
# entries-in-buffer/entries-written: 358096/10552611   #P:8
#
#                                _-----=> irqs-off
#                               / _----=> need-resched
#                              | / _---=> hardirq/softirq
#                              || / _--=> preempt-depth
#                              ||| / _-=> migrate-disable
#                              |||| /     delay
#           TASK-PID     CPU#  |||||  TIMESTAMP  FUNCTION
#              | |         |   |||||     |         |
          <idle>-0       [000] *.... 46719.316253: handle_irq_pipelined_prepare <-arch_pipeline_entry
          <idle>-0       [000] *.~.. 46719.316289: arch_handle_irq <-arch_pipeline_entry
          <idle>-0       [000] *.~.. 46719.316289: generic_pipeline_irq_desc <-arch_handle_irq
          <idle>-0       [000] *.~.. 46719.316289: handle_fasteoi_irq <-generic_pipeline_irq_desc
          <idle>-0       [000] *.~.. 46719.316290: irq_may_run <-handle_fasteoi_irq
          <idle>-0       [000] *.~.. 46719.316290: handle_oob_irq <-handle_fasteoi_irq
          <idle>-0       [000] *.~.. 46719.316290: mask_irq.part.0 <-handle_fasteoi_irq
          <idle>-0       [000] *.~.. 46719.316290: mask_ioapic_irq <-mask_irq.part.0
          <idle>-0       [000] *.~.. 46719.316294: io_apic_sync <-mask_ioapic_irq
......

第2行标题及tracer的配置为function (跟踪函数)

第4行 显示缓冲区中的事件数以及写入的条目总数。 358096 / 10552611 358096/10552611 358096/10552611,由于缓冲区填满而丢失的条目数( 10552611 − 358096 = 10 , 194 , 515 10552611- 358096=10,194,515 10552611358096=10,194,515事件丢失),接着是处理器数量:8

下面是记录的事件的内容:任务名称“",它的PID为:0,运行在”000“号CPU上,后面是延迟的时间戳。格式:<秒>.<微秒>,跟踪到函数handle_irq_pipelined_prepare()及父函数arch_pipeline_entry(),时间戳是进入handle_irq_pipelined_prepare()时的时间。

4.2 Latency trace输出格式
root@work-host:/sys/kernel/debug/tracing# cat trace
# tracer: irqsoff
#
# irqsoff latency trace v1.1.5 on 4.4.182
# --------------------------------------------------------------------
# latency: 2674 us, #28/28, CPU#6 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:8)
#    -----------------
#    | task: compiz-3483 (uid:1000 nice:0 policy:0 rt_prio:0)
#    -----------------
#  => started at: __wake_up
#  => ended at:   __wake_up
#
#
#                  _------=> CPU#            
#                 / _-----=> irqs-off        
#                | / _----=> need-resched    
#                || / _---=> hardirq/softirq 
#                ||| / _--=> preempt-depth   
#                |||| /     delay            
#  cmd     pid   ||||| time  |   caller      
#     \   /      |||||  \    |   /         
  compiz-3483    6d.s1    0us : _raw_spin_lock_irqsave <-__wake_up
  compiz-3483    6d.s1    0us : preempt_count_add <-_raw_spin_lock_irqsave
	......
  compiz-3483    6d.s3    8us#: __x2apic_send_IPI_mask <-x2apic_send_IPI_mask
  compiz-3483    6d.s3 2669us : ttwu_stat <-try_to_wake_up
  compiz-3483    6d.s3 2671us : __rcu_read_lock <-ttwu_stat
  compiz-3483    6d.s3 2671us : __rcu_read_unlock <-ttwu_stat
  compiz-3483    6d.s3 2672us : _raw_spin_unlock_irqrestore <-try_to_wake_up
  compiz-3483    6d.s3 2673us : preempt_count_sub <-_raw_spin_unlock_irqrestore
  compiz-3483    6d.s2 2674us : _raw_spin_unlock_irqrestore <-__wake_up
  compiz-3483    6d.s2 2674us : _raw_spin_unlock_irqrestore <-__wake_up
  compiz-3483    6d.s2 2675us+: trace_hardirqs_on <-__wake_up
  compiz-3483    6d.s2 2727us : <stack trace>
 => rcu_gp_kthread_wake
 => note_gp_changes
 => rcu_process_callbacks
 => __do_softirq
 => irq_exit
 => smp_apic_timer_interrupt
 => apic_timer_interrupt
 => __wake_up_sync_key
 => sock_def_readable
 => unix_stream_sendmsg
 => sock_sendmsg
 => sock_write_iter
 => do_iter_readv_writev
 => do_readv_writev
 => vfs_writev
 => SyS_writev
 => entry_SYSCALL_64_fastpat

第2行tracer的配置为irqsoff,tracer版本以及内核版本
下面一行给出最大延迟latency:2674us, 跟踪条目和总数 28 / 28 28/28 28/28,VP,KP,SP和HP始终为零,保留供以后使用。#P是在线CPU的数量(#P:8)。

延迟发生时运行的任务:compiz,任务PID:3483
分别禁用和启用中断导致延迟的:开始位置:__wake_up; 结束位置:__wake_up

内容及含义:

cmd:跟踪中进程的名称

pid:该进程的PID

CPU#:这个进程运行在这个CPU上

irq-off:
**‘d’**中断禁用,'.‘其它。注意:如果架构不支持某种方式读取irq标志变量,在这里会打印’X’

need-resched:

‘N’ TIF_NEED_RESCHEDPREEMPT_NEED_RESCHED两者都置位

‘n’ 只有TIF_NEED_RESCHED设置

‘p’ 只有PREEMPT_NEED_RESCHED设置

‘.’ 其它

hardirq/softirq:

‘Z’ --NMI发生在硬件中断内部

‘z’ --NMI运行

**‘H’ **–在一个softirq内发生了硬件中断。

**‘h’ **–硬中断运行

**‘s’ **–软中断运行

‘.’- -正常上下文

preempt-depth:
preempt_disable的级别
以上内容对内核开发人员来说最有意义。

time:
启用 latency-format 选项时,跟踪文件输出包括相对于跟踪开始的时间戳。 这与禁用延迟格式时的输出不同,后者包括绝对时间戳。

delay:

不同时间戳前后的差异,主要为了容易找到前后时间差大的。
‘$’ - 超过1秒

‘@’ - 大于100ms

‘*’ - 大于10ms

‘#’ - 大于1000us

‘!’ - 大于100us

‘+’ - 大于10us

’ ’ - 小于等于10us

其余部分与’trace’文件相同(4.1 trace输出格式)。
请注意,延迟跟踪器通常以反向跟踪结束,以便轻松找到延迟发生的位置。

4.3 trace_options

trace_options文件(或options目录)用于控制在跟踪输出中打印的内容,要查看哪些有效,cat这个文件:

root@work-host:/sys/kernel/debug/tracing# cat trace_options
print-parent
nosym-offset
nosym-addr
noverbose
noraw
nohex
nobin
noblock
trace_printk
annotate
nouserstacktrace
nosym-userobj
noprintk-msg-only
context-info
nolatency-format
record-cmd
norecord-tgid
overwrite
nodisable_on_free
irq-info
markers
noevent-fork
nopause-on-trace
hash-ptr
function-trace
nofunction-fork
nodisplay-graph
nostacktrace
notest_nop_accept
notest_nop_refuse

要禁用某一个options,将这这一项前添加no,然后echo到trace_options

echo noprint-parent > trace_options

启用options:

echo sym-offset > trace_options

以下是可用options及含义:

  • print-parent: 在函数跟踪上,显示调用(父)函数以及正在跟踪的函数,如。
#echo print-parent > trace_options
	bash-4000  [01]  1477.606694: simple_strtoul <-kstrtoul
#echo noprint-parent > trace_options
   	bash-4000  [01]  1477.606694: simple_strtoul
  • **sym-offset
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ftrace使用及实现机制 的相关文章

  • Pthreads - 高内存使用率

    我正在用 C 编写一些东西 在 256Mb 系统上的 Linux 中创建大量 Pthread 我通常有 200Mb 的免费空间 当我使用少量线程运行该程序时 它可以工作 但是一旦我让它创建大约 100 个线程 它就会出现错误 因为系统内存不
  • 如何通过 makefile 在 Linux 上安装程序? [复制]

    这个问题在这里已经有答案了 可能的重复 Linux Unix make install 应该包含什么 https stackoverflow com questions 528399 what should linux unix make
  • 如何通过ssh获取远程命令的退出代码

    我正在通过 ssh 从远程计算机运行脚本 ssh some cmd my script 现在 我想在本地计算机上存储 shell 脚本的退出状态 我该怎么做 假设没有任何问题ssh其本身 其退出状态是在远程主机上执行的最后一个命令的退出状态
  • 选择fasta文件中氨基酸超过300个且“C”出现至少4次的序列

    我有一个包含蛋白质序列的 fasta 文件 我想选择超过 300 个氨基酸且半胱氨酸 C 氨基酸出现超过 4 次的序列 我使用此命令来选择具有超过 300 个 aa 的序列 cat 72hDOWN fasta fasta bioawk c
  • 如何在Linux上用C/C++编写Web服务器[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在考虑在 Linux 平台上开发一个小型 阅读 初级 Web 服务器 但我不知道从哪里开始 我希望它能够做的是 监听特定端口 接受
  • 使用 shell 脚本发送 HTML 邮件

    如何使用 shell 脚本发送 HTML 电子邮件 首先 您需要撰写消息 最低限度由这两个标头组成 MIME Version 1 0 Content Type text html 以及适当的消息正文 p Hello world p 获得后
  • Vagrant 遇到问题 - “404 - 未找到”

    我正在尝试使用 Vagrant 制作一个 LAMP 盒子 有人告诉我它使用起来非常简单 我对网络和虚拟机完全陌生 对 Linux Ubuntu 的经验也很少 我目前已尝试按照官方文档页面上的教程进行操作 http docs vagrantu
  • 在 Linux 中重新启动时,新创建的文件变为 0 kb(数据被覆盖为空)

    我遇到了一个奇怪的问题 这让我发疯 当前的任务是在 root 用户第一次登录时启动一组文件 并在同一用户第二次登录时启动另一组文件 我决定使用 profile 和 bashrc 文件 并在第一次登录期间发生的任务结束时重新加载 bashrc
  • bash 将输出重定向到文件,但结果不完整

    重定向命令输出的问题已经被问过很多次了 但是我有一个奇怪的行为 我使用的是 bash shell debian 版本 4 3 30 1 release 并尝试将输出重定向到文件 但并非所有内容都记录在文件中 我尝试运行的 bin 文件是 l
  • 从 shell 查找不包含特定注释的 XML 文件

    我想搜索 awk grep sed 几个 XML 文件 pom xml 文件 跳过某些文件夹 而且 第一个条件是它们必须包含标签
  • MySQL 与 PHP 的连接无法正常工作

    这是我的情况 我正在尝试使用 Apache 服务器上的 PHP 文件连接到 MySQL 数据库 现在 当我从终端运行 PHP 时 我的 PHP 可以连接到 MySQL 数据库 使用 php f file php 但是当我从网页执行它时 它只
  • 为什么 OS X 和 Linux 之间的 UTF-8 文本排序顺序不同?

    我有一个包含 UTF 8 编码文本行的文本文件 mac os x cat unsorted txt foo foo 津 如果它有助于重现问题 这里是文件中确切字节的校验和和转储 以及如何自己生成文件 在 Linux 上 使用base64 d
  • Ruby:在 Ubuntu 上安装 rmagick

    我正在尝试在 Ubuntu 10 04 上安装 RMagick 看起来here https stackoverflow com questions 1482823 is there an easy way to install rmagic
  • 如何比较两个文件中的多列并在找​​到匹配时从另一列检索相应的值

    我有两个文件 File1 txt 和 File2 txt 我需要将 File1 中的三列 1 2 和 3 分别与 File2 的 4 5 和 6 进行比较 如果找到匹配项 我想从 File2 的第 2 列中检索相应的值并将其粘贴到输出中 T
  • 在 x86 汇编语言中获取文件大小的简单方法

    假设我已经在汇编中打开了一个文件 并且在寄存器 eax 中有该文件的文件句柄 我将如何获取文件的大小 以便为其分配足够的缓冲区空间 我在这里研究了另一个讨论 建议使用sys fstat 28 系统调用来获取文件统计信息但无法实现它 My a
  • 嵌入清单文件以要求具有 mingw32 的管理员执行级别

    我正在 ubuntu 下使用 i586 mingw32msvc 交叉编译应用程序 我很难理解如何嵌入清单文件以要求 mingw32 具有管理员执行级别 对于我的例子 我使用了这个hello c int main return 0 这个资源文
  • Linux无法删除文件

    当我找到文件时 我在删除它们时遇到问题 任务 必须找到带有空格的文件并将其删除 我的尝试 rm find L root grep i 但我有错误 rm cannot remove root test No such file or dire
  • 使用 shell=True 将 PATH 设置为 bitbake 的“source”在 Python 中没有效果

    下面是shell脚本中的代码 source proj common tools repo etc profile d repo sh repo project init branch repo project sync source pok
  • Bash 中所有匹配的^单词^替换^?

    为了澄清 我正在寻找一种方法来执行global搜索并替换先前使用的命令 word replacement 似乎只替换了第一场比赛 有没有一些set我无法选择的选项 尝试这个 echo oneone oneone gs one two Rep
  • 将 JSON 导出到环境变量

    如果我有这样的 JSON hello1 world1 testk testv 我想将每个键值对导出为环境变量 如何通过 shell 脚本来做到这一点 例如 当我在终端上写时 echo hello1 world1应该打印其他键值对吗 注意 上

随机推荐

  • 【自我提升】Spring Data JPA之Specification动态查询详解

    写在前面 刷完Spring Data JPA的课后 发现Specification动态查询还挺有意思的 还应用到了规约设计模式 在此记录下学习过程和见解 目录 一 应用场景 二 源码解析 三 规约模式 四 实际应用 一 应用场景 1 简介
  • 云数据库知识学习——概述

    一 云计算是云数据库兴起的基础 云计算是分布式计算 并行计算 效用计算 网络存储 虚拟化 负载均衡等计算机和网络技术发展融合的产物 云计算是由一系列可以动态升级和被虚拟化的资源组成的 用户无需掌握云计算的技术 只要通过网络就可以访问这些资源
  • function XX declared implicitly

    stm32 keilMDK出现warning function XX declared implicitly 原创 2014年08月26日 14 50 47 26281 warning 223 D function CLR TX DATA
  • 枚举类,属性循环---(枚举类循环)通过名称取值

    代码示例 public enum DomeEnum AA 1 张三 BB 2 李四 CC 3 王五 DD 4 赵六 EE 5 李七 private Integer code private String name DomeEnum Inte
  • Qt 官方示例

    哈喽 我是老吴 最近又玩了一下 Qt 给大家分享一点 Qt 相关的基础知识吧 我个人非常喜欢 Qt 它简直就是我这个 C 手残党的利器 学习 Qt 的最佳途径应该是阅读官方的手册和示例 今天要分享的就是 Qt 官方提供的一个示例 http
  • 一种针对夏克哈特曼波前传感器质心数据求解波前斜率的处理方法

    一 导出质心数据 针对夏克哈特曼波前传感器 型号 索雷博 导出的质心数据 Save Centroid Date 本文提供一种基于质心数据的斜率矩阵获取及波前重构方法 图 1 哈特曼波前传感器导出质心数据 二 斜率矩阵求解 首先 通过Wave
  • 2023上半年京东运动鞋服市场数据分析(京东数据运营)

    大众线下运动生活恢复 掀起新一轮户外潮流 运动热潮迭起 由此产生的运动鞋服及专业装备需求 为运动品牌们带来了诸多增长机会 近日各大运动品牌陆续发布上半年财报 回答了品牌对复苏机遇 发展挑战的应对情况 接下来结合具体数据 我们一起来看一下运动
  • 【基础知识】一文看懂深度优先算法和广度优先算法

    概览 先上个图 现在我们要访问图中的每个节点 即图的遍历 图的遍历是指 从给定图中任意指定的顶点 称为初始点 出发 按照某种搜索方法沿着图的边访问图中的所有顶点 使每个顶点仅被访问一次 这个过程称为图的遍历 我们根据访问节点的顺序与方式 根
  • 【Redis】Redis实现点赞、点赞排行榜

    目录 一 点赞 1 思路 2 代码实现 二 点赞排行榜 1 思路 2 代码实现 一 点赞 1 思路 在我们的项目中我们有时候会碰到这样的需求 比如实现一个博客系统 当用户访问到这篇博客时可以进行点赞 那么这个功能如何去实现呢 我们可以在数据
  • JavaScript实现UTF-8字符集Base64编码

    下面是代码实现 function var BASE64 MAPPING 映射表 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n
  • 【Hexo】搭建自己的博客并到Github Pages

    一 什么是Hexo 用Hexo官网的介绍https hexo io zh cn docs Hexo是一个快速 简捷且高效的博客框架 Hexo使用Markdown解析文章 可以在很短的时间内生成静态网页 二 快速构建Hexo 安装Hexo之前
  • 【vue2】计算属性(computed)与侦听器(watch)详解

    博 主 初映CY的前说 前端领域 个人信条 想要变成得到 中间还有做到 本文核心 计算属性与侦听属性的用法 目录 文末有给大家准备好的Xmind思维导图 一 计算属性computed 默认get 方法 仅是获取值 不仅仅是获取值 还具有修改
  • Django 开发实战 1-3 创建子项目

    python 项目开发实战 创建Django 项目子应用 重应用模块 01 创建子项目 02 配置python py3 001 的开发环境 创建Django 项目子应用 重应用模块 项目背景 在这里插入图片描述 https img blog
  • Webpack的loader和plugin

    loader的作用 webpack中的loader是一个函数 主要为了实现源码的转换 所以loader函数会以源码作为参数 比如将ES6转换为ES5 将less转换为css 将css转换为js 以便能嵌入到html文件 常见的loader
  • html 视差效果,html5网页3D视差效果代码

    特效描述 html5网页 3D视差效果 html5网页3D视差效果代码 代码结构 1 引入CSS 2 引入JS 3 HTML代码 var ww wh function init t 0 ww window innerWidth wh win
  • win+r,cmd快捷操作合集

    1 appwiz cpl 程序和功能 2 calc 启动计算器 5 chkdsk exe Chkdsk磁盘检查 管理员身份运行命令提示符 6 cleanmgr 打开磁盘清理工具 9 cmd exe CMD命令提示符 10 自动关机命令 Sh
  • MySQL事务、日志、锁和MVCC机制

    InnoDB中事务的四大特性 原子性 当前事务的操作要么全部成功要么全部失败 原理 原子性是由undo log来保证的 undolog记录着数据修改之前的值 比如我们insert一条语句 undolog就会记录一条delete语句 我们up
  • 升级到 Ubuntu 18.04 LTS 的理由,大波新特性到来

    随着 2018 年 4 月 24 日稳定版正式发布日期的临近 也是时候来仔细研究下 Canonical 最新 Linux 发行版 Ubuntu 18 04 LTS Bionic Beaver 的最新功能特性了 LTS 版本每两年发布一次 而
  • Flutter Android 混合开发之使用 FlutterBoost 4.0

    搜了下全网 FlutterBoost教程大都还是老版本 所有有了这篇 当前使用环境 FlutterBoost 4 2 1 Flutter 3 3 4 首先根据官方文章集成 FlutterBoost FlutterBoost 集成详细步骤 接
  • Ftrace使用及实现机制

    Ftrace使用及实现机制 版权声明 本文为本文为博主原创文章 转载请注明出处 https www cnblogs com wsg1100 如有错误 欢迎指正 文章目录 Ftrace使用及实现机制 一 使用ftrace 1 挂载 2 关键文