Как узнать, к какому файлу пытается получить доступ программа?

У меня есть программа, которую я пытаюсь запустить, однако, когда я ее запускаю; он просто жалуется, что не может найти конкретный файл.

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

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

Я использую файловую систему Ext4, если это помогает.

Благодаря

6
задан 23 September 2012 в 08:24

2 ответа

(Я впервые поместил свой ответ на этот askubuntu question, но удалил его оттуда и поместил здесь, так как он более актуален. )

Есть несколько способов узнать, какие файлы и библиотечные процессы открылись; основными инструментами являются lsof, strace и ltrace. Иногда их необходимо запускать с sudo, поэтому программа имеет доступ ко всему, что ей необходимо для получения точного снимка того, что вызывает программа.

1) С помощью lsof нужно найти идентификатор запрашиваемого процесса, поэтому используйте, например:

lsof -c firefox

, который перечислит все файлы firefox, которые открыты, и все ее обращения к системным разделяемым библиотекам. (В настоящее время Firefox имеет пид 3310 на моей системе, так что вы также можете использовать lsof -p 3310, но сначала вам пришлось бы искать идентификатор процесса с помощью ps aux | grep [f]irefox. ). Более подробная информация о lsof подробно изложена в этой полезной IBM статье .

2) ltrace и strace имеют очень похожие функции и опции, и очень полезны для получения подробной информации о том, что вызывает процесс. Основное отличие заключается в том, что ltrace обычно отслеживает только вызовы библиотеки (хотя она может отследить системные вызовы с опцией -S), в то время как strace отслеживает как вызовы библиотеки , так и другие вызовы системы . Более подробная информация о процессах трассировки доступна в данной статье IBM. Lsof, вероятно, более полезен для вас, если вы хотите изучить уже запущенный процесс, но strace также может сделать это и следить за вызовами в реальном времени, когда дается pid процесса (sudo всегда используется при подключении к процессу):

sudo strace -p 3310

, но гораздо полезнее запустить программу с strace и посмотреть, что было вызвано, как в следующем примере:

strace -f -e trace=open /usr/bin/firefox

Можно просто запустить strace с целевым процессом и без опций, но переключатели здесь означают, что отслеживаются дочерние процессы (-f) и что отслеживаются все открытые системные вызовы (-e trace=open). Если вы хотите сохранить вывод в файл, вы можете указать -o ~/firefox.trace перед указанием /usr/bin/firefox.

Если вам нужен сводный список вызовов библиотек, например, вы можете использовать

ltrace -c /usr/bin/leafpad

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

Результаты strace и ltrace могут быть не очень полезны для вас, так как их трудно расшифровать, если вы не знаете, что вы ищете, но lsof должен предоставить некоторую основную полезную информацию.

11
ответ дан 23 September 2012 в 08:24

Самый простой способ сделать это - это запустить программу через strace и наблюдать за вызовами stat64() (которые получают информацию о файле) или open() вызовами, которые открывают файлы.

Итак, вы делаете:

strace -e stat64 -e open [program name]

И в результирующем выходе ищете:

(Нет такого файла или директории)

Путь, который он пытался открыть, должен быть слева от этой ошибки.

3
ответ дан 23 September 2012 в 08:24

Другие вопросы по тегам:

Похожие вопросы: