ошибка при открытии файла трассировки: нет такого файла или каталога (2)

Я получаю вышеуказанную ошибку:

ошибка при открытии файла трассировки: нет такого файла или каталога (2)

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

Я использую android-sdk-20, и в AndroidManifest.xml добавляются следующие строки.

<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="15" />

Я также добавил строку:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

так как я думал, что могут быть проблемы с записью на SD-карту.


person Ankit Jain    schedule 12.07.2012    source источник
comment
У меня такая же проблема на самом устройстве - не эмулятор   -  person B T    schedule 30.08.2013
comment
Опубликованные ответы ВСЕ неверны. ошибка при открытии файла трассировки является тривиальной проблемой конфигурации в системе сообщений об ошибках, но система сообщений об ошибках пытается запуститься только тогда, когда какая-то другая ошибка вызывает сбой программы. Решение состоит в том, чтобы определить реальную проблему по строкам, которые следуют за этим сообщением в logcat, и исправить это. Все дикие спекуляции, приведенные ниже, совсем не полезны.   -  person Chris Stratton    schedule 31.03.2014
comment
Это сообщение, по-видимому, регистрируется, если что-либо регистрируется как ошибка, даже если оно обрабатывается или иным образом не вызывает сбой приложения. Есть ли способ исправить тривиальную проблему конфигурации в системе сообщений об ошибках, чтобы журнал оставался как можно более чистым?   -  person scottt    schedule 05.04.2014
comment
Ваше решение не охватывает Криса. В моем случае нет строк, которые следуют! Все, что я получаю в Logcat, это ошибка при открытии файла трассировки: нет такого файла или каталога (2)   -  person Chris Nevill    schedule 11.08.2014
comment
Согласен с Невилом, других ошибок нет.   -  person user1010160    schedule 02.06.2015


Ответы (7)


Это происходит потому, что вы не установили minSdkVersion или targetSdkVersion на свой компьютер. Я протестировал это прямо сейчас.

Например, если в вашем файле Manifest.xml есть следующие строки:

<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />

И вы установили на свой компьютер только API17, он сообщит вам об ошибке. Если вы хотите протестировать его, попробуйте установить другую версию API (в данном случае API 8).

Тем не менее, это не важная ошибка. Это не значит, что ваше приложение неправильное.

Извините за мое выражение. Английский не мой язык. До свидания!

person Aurumque    schedule 06.08.2013
comment
Нет, это не проблема. - person Chris Stratton; 01.04.2014

я думаю в этом проблема

Небольшая предыстория

Traceview — это графическое средство просмотра журналов выполнения, которые вы создаете с помощью класса Debug для регистрации информации трассировки в своем коде. Traceview может помочь вам отладить ваше приложение и профилировать его производительность. При его включении создается файл .trace в корневой папке SD-карты, который затем может быть извлечен ADB и обработан файлом bat для обработки traceview. Он также может быть добавлен DDMS.

Это система, используемая внутри регистратора. В общем, если вы не используете traceview для извлечения файла трассировки, эта ошибка не должна вас беспокоить. Вам следует просмотреть ошибки/журналы, непосредственно связанные с вашим приложением.

Как его включить:

Существует два способа создания журналов трассировки:

  1. Включите класс Debug в свой код и вызовите его методы, такие как startMethodTracing() и stopMethodTracing(), чтобы запустить и остановить запись информации трассировки на диск. Этот параметр очень точен, потому что вы можете указать, где именно начинать и останавливать регистрацию данных трассировки в вашем коде.

  2. Используйте функцию профилирования методов DDMS для создания журналов трассировки. Этот вариант менее точен, поскольку вы не изменяете код, а указываете, когда начинать и останавливать регистрацию с помощью DDMS. Хотя у вас меньше контроля над тем, где именно начинается и где останавливается ведение журнала, этот параметр полезен, если у вас нет доступа к коду приложения или если вам не требуется точное время ведения журнала.

Но для вышеуказанного существуют следующие ограничения

Если вы используете класс Debug, ваше приложение должно иметь разрешение на запись во внешнее хранилище (WRITE_EXTERNAL_STORAGE).

Если вы используете DDMS: устройства Android 2.1 и более ранних версий должны иметь SD-карту, и ваше приложение должно иметь разрешение на запись на SD-карту. Для устройств Android 2.2 и более поздних версий SD-карта не требуется. Файлы журнала трассировки передаются непосредственно на ваш компьютер для разработки.

Таким образом, доступ к traceFile требует двух вещей:

1.) Разрешение на запись файла журнала трассировки, т.е. WRITE_EXTERNAL_STORAGE и READ_EXTERNAL_STORAGE на всякий случай

2.) Эмулятор с прикрепленной SD-картой с достаточным пространством. В документе не сказано, предназначено ли это только для DDMS, но также и для отладки, поэтому я предполагаю, что это верно и для отладки через приложение.

Что делать с этой ошибкой:

Теперь ошибка, по сути, связана с отсутствием пути к SD-карте для создания файла трассировки или отсутствием разрешения на доступ к нему. Это старая ветка, но разработчик, стоящий за наградой, проверьте, соблюдаются ли два предварительных условия. Затем вы можете найти файл .trace в папке SD-карты вашего эмулятора. Если он существует, он не должен доставлять вам этой проблемы, если он не пытается создать его, добавляя startMethodTracing в ваше приложение.
Я не уверен, почему он автоматически ищет этот файл, когда срабатывает регистратор. Я думаю когда происходит событие ошибки/журнала, регистратор внутренне пытается записать в файл трассировки и не находит его, и в этом случае он выдает ошибку. Просматривая документы, я не нашел слишком много ссылок на то, почему это происходит автоматически на. Но в целом это не влияет на вас напрямую, вы должны проверять логи/ошибки приложений напрямую. Кроме того, для устройств Android 2.2 и более поздних версий не требуется SD-карта для ведения журнала трассировки DDMS. Файлы журнала трассировки передаются непосредственно на ваш компьютер для разработки.

Дополнительная информация о Traceview:

Копирование файлов трассировки на хост-компьютер

После запуска приложения и создания системой файлов трассировки .trace на устройстве или эмуляторе вы должны скопировать эти файлы на компьютер для разработки. Вы можете использовать adb pull для копирования файлов. Вот пример, показывающий, как скопировать пример файла calc.trace из расположения по умолчанию на эмуляторе в каталог /tmp на хост-компьютере эмулятора:

adb pull /sdcard/calc.trace /tmp Просмотр файлов трассировки в Traceview Чтобы запустить Traceview и просмотреть файлы трассировки, введите traceview . Например, чтобы запустить Traceview для файлов примеров, скопированных в предыдущем разделе, используйте:

traceview /tmp/calc Примечание. Если вы пытаетесь просмотреть журналы трассировки приложения, созданного с включенным ProGuard (сборка в режиме выпуска), имена некоторых методов и членов могут быть запутаны. Вы можете использовать файл Mapping.txt Proguard, чтобы выяснить исходные незашифрованные имена. Дополнительные сведения об этом файле см. в документации Proguard.

Я думаю, что любой другой ответ относительно позиционирования операторов oncreate или удаления uses-sdk не имеет отношения, но это Android, и я могу ошибаться. Было бы полезно перенаправить этот вопрос инженеру Android или опубликовать его как ошибку.

Дополнительные сведения см. в документах.

person Vrashabh Irde    schedule 21.04.2015

Попробуйте удалить часть uses-sdk из файла AndroidManifest.xml. это сработало для меня!

Не используйте виртуальное устройство Android со слишком низкой конфигурацией. Пусть будет средним.

person ANemati    schedule 02.11.2012
comment
Что вы подразумеваете под средой в отношении конфигурации? версия SDK? Я также сталкиваюсь с этой проблемой, используя minSdkVersion=14, targetSdk=17, и мой эмулятор работает в версии 17. - person Kyle Falconer; 09.07.2013
comment
@ahmad у меня такая же проблема, у меня минимальное конфигурационное виртуальное устройство, чем то, как это решается ...... - person Amitsharma; 21.02.2014
comment
Это не ответ. - person Chris Stratton; 01.04.2014

Напишите весь свой код ниже этих двух строк: -

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

У меня сработало без переустановки.

person Sudip    schedule 12.07.2013
comment
Это было бы решением только по чистой случайности. Сообщение об ошибке в заголовке является проблемой конфигурации в системе отчетов о сбоях и не дает никаких подсказок относительно того, почему программа дает сбой. Конечно, неспособность установить представление содержимого перед попыткой вызова методов объектов представления в нем является распространенным источником сбоев. Но предоставить это в качестве ответа означает случайно предположить, почему программа может дать сбой. - person Chris Stratton; 01.04.2014

Я не хотел переустанавливать все, потому что у меня установлено очень много версий SDK, и моя среда разработки настроена правильно. Повторная настройка занимает слишком много времени.

Что сработало для меня, так это удаление, а затем повторное создание виртуального устройства Android, обязательно введя значение для размера SD-карты (я использовал 200 МБ).

скриншот экрана создания AVD

Дополнительная информация:

хотя описанное выше временно устраняет проблему, она повторяется. Я только что попробовал свое приложение в Android Studio и увидел это в журнале вывода, которого раньше не замечал в Eclipse:

"/Applications/Android Studio.app/sdk/tools/emulator" -avd AVD_for_Nexus_S_by_Google -netspeed full -netdelay none

WARNING: Data partition already in use. Changes will not persist!
WARNING: SD Card image already in use: /Users/[user]/.android/avd/AVD_for_Nexus_S_by_Google.avd/sdcard.img
ko:Snapshot storage already in use: /Users/[user]/.android/avd/AVD_for_Nexus_S_by_Google.avd/snapshots.img

Я подозреваю, что изменения в журнале не сохраняются на SD-карту, поэтому, когда LogCat пытается получить доступ к журналам, их там нет, что вызывает сообщение об ошибке. Действие удаления AVD и его повторного создания удаляет файлы, а следующий запуск — это новый запуск, позволяющий LogCat получить доступ к виртуальной SD-карте.

person Kyle Falconer    schedule 09.07.2013
comment
Это не имеет абсолютно никакого отношения к делу. - person Chris Stratton; 01.04.2014
comment
На самом деле да. Оно делает. Насколько я понимаю, файл трассировки хранится на SD-карте. Если SD-карта не может быть подключена, файл трассировки не может быть прочитан. - person Kyle Falconer; 01.04.2014
comment
Нет, это не так. Logcat извлекает данные не из SD-карты, а из буфера журнала в памяти. И даже вы заметили, что это не решает проблему. Реальное решение состоит в том, чтобы игнорировать эту проблему конфигурации с системой отчетов о сбоях, а вместо этого диагностировать и устранять причину сбоя программы в первую очередь - причину, которая должна быть указана в последующем журнале. Сообщения. - person Chris Stratton; 01.04.2014

У вас не будет доступа к вашей реальной SD-карте в эмуляторе. Вам нужно будет выполнить шаги из этого учебника, чтобы направить ваш эмулятор на каталог в вашей среде разработки, действующий как ваша SD-карта.

person Erol    schedule 12.07.2012
comment
Пожалуйста, опубликуйте код и укажите, в какой строке вы получаете ошибку. - person Erol; 12.07.2012
comment
Это не имеет отношения к вопросу. - person Chris Stratton; 01.04.2014

На самом деле проблема в том, что либо /sys/kernel/debug не смонтирован, либо в работающем ядре нет скомпилированных трассировщиков ftrace, так что /sys/kernel/debug/tracing недоступен. Это код, выдающий ошибку (platform_frameworks_native/libs/utils/Trace.cpp):

void Tracer::init() {
    Mutex::Autolock lock(sMutex);

    if (!sIsReady) {
        add_sysprop_change_callback(changeCallback, 0);

        const char* const traceFileName =
                "/sys/kernel/debug/tracing/trace_marker";
        sTraceFD = open(traceFileName, O_WRONLY);
        if (sTraceFD == -1) {
            ALOGE("error opening trace file: %s (%d)", strerror(errno), errno);
            sEnabledTags = 0;   // no tracing can occur
        } else {
            loadSystemProperty();
        }

        android_atomic_release_store(1, &sIsReady);
    }
}

Сообщение журнала определенно может быть немного более информативным.

person eMPee584    schedule 25.08.2015