Часто используемые инструменты

ftrace

ftrace — инструмент отладки для пространства ядра Linux. Ядро предоставляет события для трассировки. ftrace позволяет захватывать события, чтобы можно было просмотреть эти интуитивно понятные события и осуществить трассировку функций ядра.

Чтобы использовать ftrace, нужно скомпилировать его зависимости в ядро. По умолчанию openEuler выполняет компиляцию средства ftrace. Если средство ftrace не включено, его можно включить, выбрав в menuconfig Kernel hacking  Tracers  Trace syscalls (Доработка ядра  Трассировщики  Трассировка системных вызовов).

Кроме того, нужно скомпилировать debugfs, выбрав Kernel hacking  Generic Kernel Debugging Instruments  Debug Filesystem (Доработка ядра  Универсальные инструмент отладки ядра  Отладка файловой системы).

Настройка функции ftrace

ftrace предоставляет интерфейсы доступа для пользовательского пространства через debugfs. После настройки debugfs в ядре создается каталог /sys/kernel/debug. debugfs подключается к этому каталогу.

Если ядро поддерживает элементы конфигурации, связанные с ftrace, каталог tracing создается в debugfs. debugfs подключается к этому каталогу.

Пример части содержимого каталога /sys/kernel/debug/tracing/:

-r--r-----.   1 root root 0 Jan  1  1970 available_events
-r--r-----.   1 root root 0 Jan  1  1970 available_filter_functions
-r--r-----.   1 root root 0 Jan  1  1970 available_tracers
-r--r-----.   1 root root 0 Jan  1  1970 buffer_percent
-rw-r-----.   1 root root 0 Jan  1  1970 buffer_size_kb
-r--r-----.   1 root root 0 Jan  1  1970 buffer_total_size_kb
-rw-r-----.   1 root root 0 Jan  1  1970 current_tracer
-rw-r-----.   1 root root 0 Jan  1  1970 dynamic_events
...

Знакомство с интерфейсом debugfs для ftrace

Вы можете просматривать некоторые управляющие и выходные файлы, предоставляемые ftrace, через debugfs. Распространенные файлы описаны ниже:

available_tracers: available tracers
current_tracer: running tracer
available_events: lists all available trace events in the OS
events: This directory differentiates events by module.
set_event: lists the events to be traced.
tracing_on: enables or disables tracing. echo 0 > tracing_on indicates that tracing is disabled, and 1 indicates that tracing is enabled.
trace: queries trace data.
  • Доступные трассировщики:

    cat available_tracers

    Пример вывода:

    timerlat osnoise hwlat blk function_graph wakeup_dl wakeup_rt wakeup function nop
  • События трассировки

    # Specify the arm_event of the RAS to be traced.
    echo ras:arm_event > /sys/kernel/debug/tracing/set_event
    
    # This file contains the event format and fields to be printed.
    cat /sys/kernel/debug/tracing/events/ras/arm_event/format
    
    # Start tracing.
    echo 1 > /sys/kernel/debug/tracing/tracing_on
    
    #  Observe the trace output.
    tail -f /sys/kernel/debug/tracing/trace

    Пример вывода:

    # tracer: nop
    #
    # etries-in-buffer/entries-written: 1/1   #P:96
    #
    #                                  _-----=> irqs-off
    #                                 / _----=> need resched
    #                                | / _---=> hardirq/sofirq
    #                                || / _--=> preempt-depth
    #                                ||| /    delay
    #               TASK-PID   CPU#  ||||   TIMESTAMP  FUNCTION
    #                  | |       |   ||||      |         |
             kworker/0:0-5     [000] d... 242677.832248: arm_event: cpu: 73;
  • Трассировка входных параметров функций ядра

    Выполните трассировку mmap, соответствующего системному вызову do_mmap.

    unsigned long do_mmap(struct file *file, unsigned long addr,
    			unsigned long len, unsigned long prot,
    			unsigned long flags, unsigned long pgoff,
    			unsigned long *populate, struct list_head *uf)

    Выведите входной параметр addr.

    # Trace through the kprobe.
    echo 'p:probe1 do_mmap addr=%x1' > kprobe_events
    
    # Enable kprobe.
    echo 1 > events/kprobes/probe1/enable
    
    # Start tracing.
    echo 1 > tracing_on
    
    # View trace data.

    Пример вывода:

    cat-595914 [019] d... 3018798.114650: probe1: (do_mmap+0x0/0x1f0) addr=0xaaaadf820000
    cat-595914 [019] d... 3018798.114662: probe1: (do_mmap+0x0/0x1f0) addr=0xaaaadf83f000
    cat-595914 [019] d... 3018798.114674: probe1: (do_mmap+0x0/0x1f0) addr=0x0
    cat-595914 [019] d... 3018798.114680: probe1: (do_mmap+0x0/0x1f0) addr=0xffffbe621000
  • Трассировка вызовов функций

    # Select a tracing type.
    echo function_graph > current_tracer
    
    # Set the PID of the process to be filtered.
    echo <pid> set_ftrace_pid
    
    # Start tracing.
    echo 1 > tracing_on
    
    # View trace data.

    Пример вывода:

    # tracer: function graph
    #
    # CPU  DURATION                 FUNCTION CALLS
    # |     |   |                    |   |   |   |
     65)   ==========> |
     65)               | gic_handle_irq() {
     65)               |   do_read_iar() {
     65)   0.460 us    |     gic_read_iar();
     65)   1.550 us    |   }
     65)               |   __handle_domain_irq() {
     65)               |     irq_enter() {
     65)               |       irq_enter_rcu() {
     65)               |         tick_irq_enter() {
     65)   0.380 us    |           tick_check_oneshot_broadcase_this_cpu();
     65)               |           ktime_get() {
     65)   0.570 us    |             arch_counter_read();
     65)   1.250 us    |           }

strace

Команда strace представляет собой инструмент диагностики и отладки. Вы можете использовать команду strace для анализа системных вызовов и передачи сигналов приложений в целях решения проблем или изучения процесса выполнения приложений.

Можно выполнить команду strace -h, чтобы просмотреть функции, предоставляемые strace.

Чаще всего она используется для трассировки команды xx, трассировки вилок, отображения времени и вывода результата в файл output.

strace -f -tt -o output xx

kdump

Принципы crash/kdump

kdump — это моментальный снимок состояния памяти ОС в определенный момент времени. Он помогает специалистам по эксплуатации и сопровождению выполнять отладку и анализировать причину сбоя системы. kdump обычно используется, когда возникает сбой системы и сигнал тревоги ядра.

Процедура имеет следующий вид.

process

  1. Установка и настройка связанных инструментов:

    yum install kernel-debuginfo-$(uname -r) kexec-tools crash -y
  2. В параметры загрузки ядра добавьте параметр crashkernel со значением 1024M. Для этого:

    1. В конфигурационном файле /etc/default/grub в значение параметра GRUB_CMDLINE_LINUX добавьте строку crashkernel=1024M.

    2. Обновите настройки GRUB:

      grub2-mkconfig -o /boot/efi/EFI/openEuler/grub.cfg
  3. Включите автоматический запуск службы kdump:

    systemctl enable kdump
  4. Перезагрузите компьютер.

Запуск crash

Операция 1

Сохраните настройки ядра по умолчанию.

sysctl -a | grep panic

Когда происходит жесткая блокировка или ошибка, срабатывает сигнал тревоги:

Операция 2

Измените настройки. Следующие команды позволяют применить настройки лишь однократно и сделать их недействительными после перезапуска системы.

# Set a soft lock to trigger a panic.
echo 1 > /proc/sys/kernel/softlockup_panic

# Trigger a kernel panic when an out of memory (OOM) error occurs.
echo 1 > /proc/sys/vm/panic_on_oom

# A panic occurs when a process is hung.
echo 1 > /proc/sys/kernel/hung_task_panic

# Set the timeout interval of the hung task mechanism.
echo 60 > /proc/sys/kernel/kernel.hung_task_timeout_secs

Операция 3

Чтобы конфигурация действовала постоянно:

  1. Измените значения параметров в /etc/sysctl.conf:

    kernel.hung_task_panic=1
    kernel.hung_task_timeout_secs=60
    kernel.softlockup_panic=1
    vm.panic_on_oom=1
  2. Выполните команду:

    sysctl -p

Анализ сбоя

  1. Включите отладку crash.

  2. Найдите файл vmcore, созданный в каталоге /var/crash.

  3. Выполните следующую команду, чтобы запустить отладку crash:

    crash {vmcore file} {debug kernel vmlinux}

Команда отладки crash имеет формат command args.

command указывает команду, которую нужно выполнить, а args — параметры, необходимые для некоторых команд отладки.

help

Выводит справочную информацию о команде.

Вы можете просмотреть поддерживаемые команды или справочную информацию о конкретной команде. Например, выполните команду:

help bt
bt

Выводит информацию о стеке вызовов функций.

log

Отображает буфер системных сообщений.

Можно добавлять параметры, например log.

ps

Отображает состояние процесса. > указывает, что процесс активен.

dis

Дизассемблирует указанную функцию или адрес.

Пример:

dis -l [func | addr]
mount

Отображает информацию о текущей файловой системе.