Найти тему
BASH DAYS | Linux Factory

Strace на практике #1

Оглавление

Сегодня начнем тыкать полезную утилиту strace. Многим она кажется очень страшной, но на самом деле всё обстоит иначе. Если научишься с ней правильно работать и понимать, сможешь отдебажить любую ошибку и сразу станешь тимлидом, а может быть и техническим директором.

strace — это утилита, отслеживающая системные вызовы, которые представляют собой механизм трансляции, обеспечивающий интерфейс между процессом и операционной системой/ядром


Ну а если по русски: это полезный инструмент диагностики и отладки.

Начнем с простого. Для экспериментов нам понадобится файл test.txt, давай создадим его командой:

echo '12345' > test.txt

Опыты проводим над утилитой sed. Исследовать будем команду:

sed -i.tmp 's/1/2/' test.txt

Ключ -i означает редактирование файла на месте, принимает необязательный суффикс tmp. Если суффикс задан, то будет создана копия файла с предыдущим содержанием.

Команда s/// это команда замены, одного на другое. То есть в примере мы меняем (1) на (2) в файле test.txt

Погнали ковыряться

strace -ye '/^open',read,write,rename,close sed -i.tmp 's/1/2/' test.txt

Выведет много всего, но ты не бойся, тебе нужно посмотреть только последние несколько строчек. Всё остальное не достойно твоего внимания.

Посмотрим вывод с момента открытия файла test.txt

-2

Теперь разберем построчно, что же произошло:

1. Открывается файл test.txt
2. Открывается временный файл sedvKFsXv
3. Из файла test.txt читаются 6 байт 12345\n
4. Пробует прочитать еще раз test.txt, вернулось 0 байт, найден конец строки
5. Закрывается файл test.txt
6. Записывается 6 байт 22345\n во временный файл sedvKFsXv
7. Закрывается временный файл sedvKFsXv
8. Переименовывается файл test.txt в test.txt.tmp
9. Переименовывается временный файл sedvKFsXv в test.txt
10. Что-то там где-то опять закрывается

Подпишись на BashDays в телеграм

Если подытожить, получилось такое:

- Считывается исходный файл test.txt
- Во временный файл sedvKFsXv записывается обработанный текст
- Исходный файл test.txt становится резервной копией test.txt.tmp
- Временный файл sedvKFsXv становится текущим test.txt

Что нам дал этот эксперимент?

А дал он нам то, что всё работает. И теперь у нас есть понимание как это работает.

Допустим столкнулся ты с проблемой, что sed не смог что-то записать и ты не понимаешь почему. Запускаешь strace и смотришь почему:

write(4</tmp/sedvKFsXv>, "strace: exec: Permission denied\n", 6) = 6

Опа, а прав на запись в папку /tmp нет, возможно какой-то лось запретил туда запись. Отдебажили, фиксим: выставляем 3 топора (chmod 777) на папку /tmp и радуемся какие мы молодцы.

Этот способ отладки ты можешь применить не только для sed, но и для своих скриптов, программ, сервисов и т.п. Как нибудь в будущем поэкспериментируем с php и Битриксом.

Как-то так. Ничего же сложного? Ну вот и я про тоже. Главное не бояться и знать куда смотреть. Ну а я покажу куда смотреть и проведу тебя протоптанными дорожками.

Рекомендую почитать