【问题标题】:Unable to open stack trace file '/data/anr/traces.txt': Permission denied无法打开堆栈跟踪文件“/data/anr/traces.txt”:权限被拒绝
【发布时间】:2017-08-11 14:24:46
【问题描述】:

我是安卓世界的新手。

我已经申请了用户注册。它工作正常。但是当我尝试将微调器添加到我的活动文件时,它在 avd 中显示错误,例如,

应用程序注册(进程 com.students)已停止 不料。请再试一次

来了。

我的日志猫显示错误

"11-12 10:42:06.816: E/dalvikvm(313): 无法打开堆栈跟踪文件 '/data/anr/traces.txt': 权限被拒绝"

这个错误实际上是什么?我怎样才能摆脱它?

【问题讨论】:

  • 显示您正在使用的代码以及完整的堆栈跟踪。
  • 您的应用程序由于其他原因而崩溃(可能是代码中的错误)。您可以忽略“无法打开堆栈跟踪..”错误,这不是您的应用程序崩溃的原因。请发布您的应用程序代码的完整堆栈跟踪和相关部分。
  • 如果您没有在模拟器上设置 SDCard,您也可能会收到此错误。

标签: android


【解决方案1】:

您正在尝试访问外部存储。确保您在 Manifest 文件中定义了必要的权限。这可以通过添加来完成

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

【讨论】:

  • 这似乎无法解决我的一台测试设备 Android 2.3.6 的写入权限错误
  • 这个答案是完全不正确且非常糟糕的建议。首先,问题出在android本身,而不是应用程序。但即使是正在编写的程序,这个答案显然是错误的,因为 /data 不是外部存储路径
【解决方案2】:

此错误与您的应用无关。它的引用堆栈跟踪文件会在您的应用程序崩溃时生成,以便用户可以将其报告给发布者。您看到该错误的原因是您的应用程序没有通过 android 市场安装,因此它没有写入该文件的权限。您的应用在调试期间生成的错误可以在 LogCat 中看到,并且会在此处转储描述错误的堆栈跟踪。

【讨论】:

  • 这个答案基本上是正确的,因为特定消息表明故障报告机制中存在问题,但不是实际的崩溃的原因。崩溃的原因(如果它确实是正在开发的应用程序的崩溃,而不是巧合的其他东西的崩溃)应该使用 logcat 和/或其他调试工具确定并修复。我不太确定所提供的解释链接缺少不是市场安装的许可(而不是对已安装的 Android 版本的简单错误配置) - 关于该理论的任何参考?
  • 特别是在当前的设备上,这个文件是全球可写的。
  • @ChrisStratton 我正在投票赞成这个答案,因为我自己也遇到了这个问题,经过一番调查后发现失败的原因确实是因为应用程序不受信任(不是来自 Play 商店)。这是在内核级别强制执行的策略。我必须查看内核日志才能看到它。所以 Sani 的回答非常准确,尽管没有你提到的任何来源/证据的支持:)
  • 这与市场或非市场应用无关。这只涉及安装 - 一旦安装它们是相同的。
【解决方案3】:

这是我刚接触 Android 时遇到的问题。然后我了解到有关无法写入 traces.txt 的消息并不是程序的实际问题。

因此,此问题的解决方案是找到并纠正程序崩溃的实际(与此消息无关)原因。则此消息(反映崩溃报告系统中的配置问题)将不再出现。

【讨论】:

  • 这应该是一条评论。我没有说明你是如何修复错误的。
  • 这确实是正确的答案 - 但是我有点不舒服的是,在版主的编辑之后,当前显示的是我之前完全公开的重写它,没有原始文本(来自我在编辑时仔细保留的问题。
【解决方案4】:

对/data/anr/traces.txt的操作需要root或者系统用户chmod。
参考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 && 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;
}

我在 shell 中处理问题如下。
adb root
adb shell touch /data/anr/traces.txt
adb shell kill -3 ${APP_PID}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 2019-10-23
    • 2013-01-22
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    相关资源
    最近更新 更多