无法打开堆栈跟踪文件'/data/anr/traces.txt':权限被拒绝。

7
我是新手,正在学习 Android 技术。
我已经制作了一个用户注册应用程序,并且它一直运行正常。但当我尝试在我的活动文件中添加一个下拉框时,模拟器出现了错误,如下所示:
“应用程序注册 (进程 com.students) 已意外停止,请重试。”
同时我的日志记录显示以下错误:
“11-12 10:42:06.816: E/dalvikvm(313): Unable to open stack trace file '/data/anr/traces.txt': Permission denied”
这个错误是什么意思?我该如何解决它?

2
请展示你正在使用的代码以及完整的堆栈跟踪。 - Lalit Poptani
1
你的应用程序由于某些其他原因(可能是代码中的错误)而崩溃了。你可以忽略“无法打开堆栈跟踪…”的错误,它不是你的应用程序崩溃的原因。请发布完整的堆栈跟踪和相关部分的应用程序代码。 - Karthik
如果您没有在模拟器上设置SD卡,也可能会出现此错误。 - user1097175
4个回答

8

您正在尝试访问外部存储。请确保在清单文件中定义了必要的权限。可以通过添加以下内容来完成:

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

2
这似乎无法解决我其中一个测试设备(Android 2.3.6)的写入权限错误。 - nmr
11
这个回答完全不正确且提供了糟糕的建议。首先,问题出在 Android 系统本身而不是应用程序上。即使问题出在应用程序上,这个回答也显然是错误的,因为**/data 不是外部存储路径**。 - Chris Stratton

4

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


1
这个答案基本上是正确的,因为特定的消息表明了故障报告机制存在问题,但并没有说明某个东西崩溃的原因。如果确实是正在开发的应用程序崩溃,而不是其他东西巧合地崩溃,那么应该使用logcat和/或其他调试工具确定崩溃的原因,并进行修复。我对所提供的解释将缺少权限与不是市场安装(而不是已安装的Android构建的简单配置错误)之间的联系并不确定 - 有关该理论的任何参考资料吗? - Chris Stratton
特别是在当前设备上,此文件是可全局写入的。 - Chris Stratton
@ChrisStratton 我会投票支持这个答案,因为我自己也遇到了这个问题,并经过一些调查发现,失败的原因确实是应用程序不可信(不来自Play Store)。这是在内核层面强制执行的策略。我必须查看内核日志才能看到它。所以,Sani的答案基本正确,尽管没有像你提到的那样有任何来源/证据 :) - Amokrane Chentir
这与市场或非市场应用程序无关。这只涉及安装 - 一旦安装,它们是相同的。 - Chris Stratton

2

当我刚开始接触Android时,遇到了这个问题。后来我发现,关于无法写入traces.txt的消息并不是程序的实际问题。

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


4
这应该是一个评论。它没有展示你如何修复错误。 - Buhake Sindi
这确实是正确的答案 - 但我对于在管理员编辑后,当前显示的是我之前完全披露的重写版本,而没有原始文本(来自问题提问者自己)感到有些不舒服,当时我在编辑时仔细保留了它。 - Chris Stratton

1

/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}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接