Назад | Перейти на главную страницу

Использование strace для отладки доступа к файлам

Я пытаюсь выяснить полный путь к файлу, который запущенная программа пытается (и не может) открыть. Мне дано понять это strace могу это сделать, но я, видимо, неправильно использую. Запущенная программа - это служба, поэтому я не вижу простого способа запустить ее под strace прямо. Из примеров, которые я видел, кажется, что

$ sudo strace -p <process id> -e open,access

- правильное заклинание для присоединения к запущенному процессу, но когда я запускаю его, я не вижу вывода, даже если рассматриваемая программа регистрирует свою неудачную попытку открыть файл. Я даже не вижу вывода с

$ sudo strace -p 24249
Process 24249 attached - interrupt to quit
futex(0x7f650fe159d0, FUTEX_WAIT, 24250, NULL

Это похоже на то, что какой-либо фьютекс по какой-то причине отключают? Или это нормальный вывод для ситуации?

В любом случае, что я делаю не так?

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

strace -ffttTo /tmp/strace.out service <foo> start

И вставьте сгенерированный файл.

РЕДАКТИРОВАТЬ: поскольку не удается открыть файл, можете ли вы выполнить поиск по ключевому слову ENOENT или grep в строке No such file or directory.

EDIT2: я снова увидел вывод и проверил страницу руководства futex. Итак, похоже, что что-то, обращающееся к ячейке памяти 0x7f650fe159d0, удерживает блокировку, возможно, общую блокировку и не снимает ее. Pid 24250 тоже аргумент. Вы можете проверить, что делает этот pid.

Также вы можете проверить, с какой функцией ядра связана pid 24249. Это можно показать с помощью опции wchan в ps -eo wchan <pid> команда. Я не помню полный подробный список Wchan, но я получу это для вас завтра. (здесь довольно ночь).