Не удается открыть файл трассировки стека ‘/data/anr/traces.txt ‘: В разрешении отказано

#android

#Android

Вопрос:

Я новичок в мире Android.

Я подал заявку на регистрацию пользователя. Все работало нормально. но когда я попытался добавить счетчик в свой файл activity, он показывал ошибку в avd, например,

Регистрация приложения (процесс com.students) неожиданно остановлена. Попробуйте еще раз

.

и мой журнал cat показывает ошибку

«11-12 10:42:06.816: E/dalvikvm(313): не удается открыть файл трассировки стека ‘/data/anr/traces.txt ‘: В разрешении отказано»

Что на самом деле представляет собой эта ошибка? Как я могу избавиться от этого?

Комментарии:

1. Покажите код, который вы используете, а также полную трассировку стека.

2. Ваше приложение завершило работу по какой-либо другой причине (возможно, ошибка в коде). Вы можете игнорировать ошибку «Не удается открыть трассировку стека ..», это не причина сбоя вашего приложения. Пожалуйста, опубликуйте полную трассировку стека и соответствующую часть кода вашего приложения.

3. Вы также можете получить эту ошибку, если не настроите SD-карту на своем эмуляторе.

Ответ №1:

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

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

Комментарии:

1. Похоже, это не устраняет ошибку разрешения на запись для одного из моих тестовых устройств, Android 2.3.6

2. Этот ответ совершенно неверен и является довольно плохим советом . Во-первых, проблема в самом Android, а не в прикладной программе. Но даже если бы это была пишущаяся программа, этот ответ явно неверен, поскольку / data не является путем к внешнему хранилищу .

Ответ №2:

Эта ошибка не имеет ничего общего с вашим приложением. На него ссылается файл трассировки стека, который генерируется при сбое вашего приложения, чтобы пользователь мог сообщить об этом издателю. Причина, по которой вы видите эту ошибку, заключается в том, что ваше приложение не было установлено через Android Market, поэтому у него нет разрешения на запись в этот файл. Ошибки, которые ваше приложение генерирует во время отладки, можно увидеть в LogCat, и туда будет сброшена трассировка стека с описанием ошибки.

Комментарии:

1. Этот ответ в основном верен в том смысле, что конкретное сообщение указывает на проблему в механизме сообщения об ошибках, но не на фактическую причину, по которой что-то произошло с ошибкой . Причина сбоя (если это действительно сбой разрабатываемого приложения, а не сбой чего-то другого по совпадению) должна быть определена с помощью logcat и / или других средств отладки и исправлена. Я менее уверен в предложенном объяснении, связывающем отсутствие разрешения с отсутствием установки на рынке (а не с простой неправильной настройкой установленной сборки Android) — какие-либо ссылки на эту теорию?

2. В частности, на текущих устройствах этот файл доступен для записи по всему миру.

3. @ChrisStratton Я голосую за этот ответ, поскольку сам только что столкнулся с этой проблемой и после некоторого расследования выяснил, что причиной сбоя действительно было то, что приложение было ненадежным (не из Play Store). Это политика, применяемая на уровне ядра. Мне пришлось просмотреть журналы ядра, чтобы увидеть это. Итак, ответ Сани довольно точен, хотя и не подкреплен каким-либо источником / доказательством, как вы упомянули 🙂

4. Это не имеет никакого отношения к рыночным или нерыночным приложениям. Это касается только установки — после установки они идентичны.

Ответ №3:

Эта проблема возникла у меня, когда я был новичком в Android. Затем я узнал, что сообщение о невозможности записи в traces.txt на самом деле проблема заключалась не в программе.

Таким образом, решение этой проблемы заключается в поиске и исправлении фактической (не связанной с этим сообщением) причины сбоя программы. Тогда это сообщение (которое отражает проблему конфигурации в системе отчетов о сбоях) больше не будет появляться.

Комментарии:

1. Это должен быть комментарий. I не показывает, как вы исправили свою ошибку.

2. Это действительно правильный ответ — однако мне несколько неудобно из-за того факта, что после редактирования модератором то, что в данный момент отображается, является моей ранее полностью раскрытой перезаписью, без оригинального текста (от самих задавших вопрос), который я тщательно сохранил при его редактировании.

Ответ №4:

Операция на /data/anr/traces.txt требуется chmod пользователя root или системы.
Ref ActivityManagerService#dumpStackTraces код:

 public static File dumpStackTraces(boolean clearTraces, ArrayList<Integer> firstPids,
        ProcessCpuTracker processCpuTracker, SparseArray<Boolean> lastPids, String[] nativeProcs) {
    String tracesPath = SystemProperties.get("dalvik.vm.stack-trace-file", null);
    if (tracesPath == null || tracesPath.length() == 0) {
        return null;
    }

    File tracesFile = new File(tracesPath);
    try {
        if (clearTraces amp;amp; tracesFile.exists()) tracesFile.delete();
        tracesFile.createNewFile();
        FileUtils.setPermissions(tracesFile.getPath(), 0666, -1, -1); // -rw-rw-rw-
    } catch (IOException e) {
        Slog.w(TAG, "Unable to prepare ANR traces file: "   tracesPath, e);
        return null;
    }

    dumpStackTraces(tracesPath, firstPids, processCpuTracker, lastPids, nativeProcs);
    return tracesFile;
}
  

И я решаю проблему в командной строке следующим образом.
adb root
adb shell touch /data/anr/traces.txt
adb shell kill -3 ${APP_PID}