У меня есть программа, которую я пытаюсь запустить, однако, когда я запускаю ее; он просто жалуется, что не может найти конкретный файл.
Однако я понятия не имею, в какую папку он пытается найти этот конкретный файл. У меня есть копия требуемого файла, мне просто нужно знаете, какая папка тоже его копирует.
Есть ли способ показать в реальном времени, к каким файлам обращаются или какие файлы пытаются и не удается получить доступ?
Я использую Ext4, если это помогает.
Спасибо
(я сначала отправил свой ответ на этот вопрос askubuntu, но удалил его оттуда и разместил его здесь, поскольку это более актуально.)
Существует несколько способов выяснить, какие процессы файлов и библиотек открылись; основными инструментами являются lsof, strace и ltrace. Иногда необходимо запускать их с помощью sudo, поэтому программа имеет доступ ко всему, что ему нужно, чтобы получить точный снимок того, что вызывает программа.
1) С помощью lsof вам нужно найти идентификатор процесса, который вы хотите запросить, поэтому используйте, например:
lsof -c firefox
, в котором будут перечислены все файлы firefox, которые открыты и все его вызовы для системных разделяемых библиотек. (Firefox в настоящее время имеет pid 3310 в моей системе, поэтому вы также можете использовать lsof -p 3310, но вам сначала пришлось бы искать идентификатор процесса с помощью ps aux | grep [f]irefox). Более подробная информация о lsof подробно описана в этом полезном вопросе askubuntu .
2) ltrace и strace имеют очень похожие функции и варианты и очень полезны для поиска подробная информация о том, что вызывает процесс. Основное отличие состоит в том, что ltrace обычно отслеживает только вызовы library (хотя он может отслеживать системные вызовы с опцией -S), а strace отслеживает как library, так и другие вызовы system. Более подробная информация о процессах отслеживания доступна в этой статье 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 должны предоставить некоторую базовую полезную информацию ,
(я сначала отправил свой ответ на этот вопрос askubuntu, но удалил его оттуда и разместил его здесь, поскольку это более актуально.)
Существует несколько способов выяснить, какие процессы файлов и библиотек открылись; основными инструментами являются lsof, strace и ltrace. Иногда необходимо запускать их с помощью sudo, поэтому программа имеет доступ ко всему, что ему нужно, чтобы получить точный снимок того, что вызывает программа.
1) С помощью lsof вам нужно найти идентификатор процесса, который вы хотите запросить, поэтому используйте, например:
lsof -c firefox
, в котором будут перечислены все файлы firefox, которые открыты и все его вызовы для системных разделяемых библиотек. (Firefox в настоящее время имеет pid 3310 в моей системе, поэтому вы также можете использовать lsof -p 3310, но вам сначала пришлось бы искать идентификатор процесса с помощью ps aux | grep [f]irefox). Более подробная информация о lsof подробно описана в этом полезном вопросе askubuntu .
2) ltrace и strace имеют очень похожие функции и варианты и очень полезны для поиска подробная информация о том, что вызывает процесс. Основное отличие состоит в том, что ltrace обычно отслеживает только вызовы library (хотя он может отслеживать системные вызовы с опцией -S), а strace отслеживает как library, так и другие вызовы system. Более подробная информация о процессах отслеживания доступна в этой статье 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 должны предоставить некоторую базовую полезную информацию ,
Самый простой способ сделать это - запустить программу через strace и посмотреть вызовы stat64 (), которые получают информацию о файлах, или открыть () вызовы, открывающие файлы.
Итак, вы do:
strace -e stat64 -e open [program name]
И в результирующем выходе найдите:
(Нет такого файла или каталога)
Путь, который он пытался открыть, должен быть слева от этой ошибки.
Самый простой способ сделать это - запустить программу через strace и посмотреть вызовы stat64 (), которые получают информацию о файлах, или открыть () вызовы, открывающие файлы.
Итак, вы do:
strace -e stat64 -e open [program name]
И в результирующем выходе найдите:
(Нет такого файла или каталога)
Путь, который он пытался открыть, должен быть слева от этой ошибки.