@@ -482,7 +482,8 @@ cpus=8
482
482
* [ KernelShark] ( http://rostedt.homelinux.com/kernelshark/ )
483
483
* [ Using KernelShark to analyze the real-time scheduler] ( https://lwn.net/Articles/425583/ )
484
484
485
- ## trace_options
485
+ ## 跟踪选项
486
+ ### trace_options
486
487
* ` /sys/kernel/debug/tracing/trace_options ` 文件
487
488
```
488
489
# cat /sys/kernel/debug/tracing/trace_options
@@ -515,6 +516,72 @@ cpus=8
515
516
notest_nop_accept
516
517
notest_nop_refuse
517
518
```
519
+ * 通过修改` /sys/kernel/debug/tracing/options ` 下的文件可以使能这些` trace_options `
520
+
521
+ #### latency-format
522
+ * 该选项会改变 trace 输出。使能的时候,trace 会显示关于延迟的额外的信息
523
+ ```
524
+ # tracer: irqsoff
525
+ #
526
+ # irqsoff latency trace v1.1.5 on 3.8.0-test+
527
+ # --------------------------------------------------------------------
528
+ # latency: 259 us, #4/4, CPU#2 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:4)
529
+ # -----------------
530
+ # | task: ps-6143 (uid:0 nice:0 policy:0 rt_prio:0)
531
+ # -----------------
532
+ # => started at: __lock_task_sighand
533
+ # => ended at: _raw_spin_unlock_irqrestore
534
+ #
535
+ #
536
+ # _------=> CPU#
537
+ # / _-----=> irqs-off
538
+ # | / _----=> need-resched
539
+ # || / _---=> hardirq/softirq
540
+ # ||| / _--=> preempt-depth
541
+ # |||| / delay
542
+ # cmd pid ||||| time | caller
543
+ # \ / ||||| \ | /
544
+ ps-6143 2d... 0us!: trace_hardirqs_off <-__lock_task_sighand
545
+ ps-6143 2d..1 259us+: trace_hardirqs_on <-_raw_spin_unlock_irqrestore
546
+ ps-6143 2d..1 263us+: time_hardirqs_on <-_raw_spin_unlock_irqrestore
547
+ ps-6143 2d..1 306us : <stack trace>
548
+ => trace_hardirqs_on_caller
549
+ => trace_hardirqs_on
550
+ => _raw_spin_unlock_irqrestore
551
+ => do_task_stat
552
+ => proc_tgid_stat
553
+ => proc_single_show
554
+ => seq_read
555
+ => vfs_read
556
+ => sys_read
557
+ => system_call_fastpath
558
+ ```
559
+ #### stacktrace
560
+ * 当设置该 option 时,任何 ** trace event** 的栈跟踪将会被记录下来
561
+
562
+ ### function tracer option
563
+ #### func_stack_trace
564
+ * 如果说设置` function_graph tracer ` +` set_graph_function ` 可以跟踪到一个函数往下的调用路径,那么` function tracer ` +` set_ftrace_filter ` +` func_stack_trace ` 则可以跟踪到它往上的调用路径
565
+ * 需使能` CONFIG_STACKTRACE ` 内核选项
566
+ * 只有当` current_tracer ` 设置为 ** function tracer** 时才会出现
567
+ * 当设置该 option 时,每个函数被记录的时候,它的栈跟踪也会被记录
568
+ * ** NOTE:** 在使能该选项时,务必同时设置` set_ftrace_filter ` ,否则系统性能会严重下降。并且在清除过滤函数的时候记得关闭该选项。
569
+ * Example:
570
+ ```
571
+ $ echo rtc_timer_enqueue > /sys/kernel/debug/tracing/set_ftrace_filter
572
+ $ echo function > /sys/kernel/debug/tracing/current_tracer
573
+ $ echo 1 > /sys/kernel/debug/tracing/options/func_stack_trace
574
+ $ echo 1 > /sys/kernel/debug/tracing/tracing_on
575
+ $ cat /sys/kernel/debug/tracing/trace_pipe
576
+ rtc_test.2029-2902 [001] .... 7694.641987: rtc_timer_enqueue <-rtc_update_irq_enable
577
+ rtc_test.2029-2902 [001] .... 7694.642015: <stack trace>
578
+ => rtc_timer_enqueue
579
+ => rtc_update_irq_enable
580
+ => rtc_dev_ioctl
581
+ => do_vfs_ioctl
582
+ => SyS_ioctl
583
+ => system_call_fastpath
584
+ ```
518
585
519
586
# Reference
520
587
0 commit comments