如何访问Android文件夹 /data/anr/traces.txt 和 /data/tombstones/tombstones?

57

我正在编写一个用于报告崩溃和相关日志的应用程序。因此,我正在尝试从我的应用程序中访问 traces.txt 和 tombstones 文件,但是我得到了一个错误:

03-25 09:48:46.220 W/System.err(10250): java.io.FileNotFoundException: /data/tombstone/tombstone_00 (Permission denied)

我可以访问 traces.txt ,但无法访问墓碑。


你是否使用了READ_LOGS权限? - amccormack
8个回答

40

您可以使用位于您的sd根目录下的tools文件夹中的adb工具。使用方法如下:

./adb pull path_to_file location_to_save

3
谢谢你,Mojo,但我希望能够通过我的安卓应用程序实现它。 - learner
38
使用这种方法,我无法提取 /data/tombstones 的内容。ADB 显示权限被拒绝。 - vivek.m
这只能在模拟器中运行,对吧? - CQM
它应该可以作为root工作。 - NoBugs

30

您可以在开发者选项中捕获完整的错误报告(请参见Android文档)。在错误报告的ZIP文件中,您可以在/FS/data文件夹中找到tombstonesanr文件夹。

此方法适用于已经root和未root的设备。


4
最终未经root的设备可以通过 adb bugreport 获取 /data/tombstones/目录。// 适用于Android 10。 // 另外,adb pull或者adb shell需要权限。 - yurenchen
3
adb bugreport是在未root的Android 10+版本手机上工作的唯一方法。当使用adb pull或cp到/sdcard/文件夹时,它将显示权限拒绝。 - StoneLam

26

如果你收到 "permission denied" 的错误提示,你可以这样做:

adb shell "cp /data/anr/traces.txt /storage/extSdCard/" 
adb pull /storage/extSdCard/traces.txt

2
当我执行 adb shell "cp /data/anr/traces.txt /storage/extSdCard/" 时,我会收到“没有这样的文件或目录”的错误提示。而在 adb shell 中执行 "cp /data/tombstones/traces.txt /storage/extSdCard/" 则会提示权限被拒绝。 - Coder
3
找一个适合你的中间目录,我使用/sdcard/,并将文件重新命名,这样我的脚本看起来像是这样:adb shell "cp /data/anr/traces.txt /sdcard/anr_trace.txt" ; adb pull /sdcard/anr_trace.txt - benkc
13
我遇到了一个错误:权限被拒绝 - IgorGanapolsky
1
仍然收到权限被拒绝的错误。 - JPM

14

注意:此方法仅适用于安卓模拟器和已经root的安卓设备。

你可以先检查文件是否被创建。你可以通过以下方式进行检查:

DDMS -> 文件浏览器 -> data -> data -> (你的包名) -> files -> (你的文件名)

DDMS在eclipse右上角。如果文件不存在于上述路径中,则未正确创建,但如果它仍然存在,则在访问时相应更改你的文件路径,例如:/data/data/(你的包名)/traces.txt

你还可以将traces.txt文件拉到桌面上。在DDMS下方的顶部菜单栏上提供了拉取选项。


这里有几张图片展示了同样的内容.. http://sree.cc/google/file-explorer-for-android-in-eclipse-ide - Anoop Chandrika HarisudhanNair
你能在上述位置看到traces.txt吗?如果你能看到它,那我建议你纠正你访问它的路径。 - Harshad
3
嗨Harshad,traces.txt的权限为-rw-rw-rw,所以我能够访问该文件 :) ,但我现在如何访问/data/tombstones/? - learner
太棒了!从adb中提取数据有点麻烦。 - asgs
2
我在logcat中看到一条消息:堆栈跟踪已写入:/data/anr/traces.txt,但是在文件浏览器视图中,/data目录本身似乎是空的。有什么想法吗? - Jasper
显示剩余5条评论

12

这是解决问题的方法:使用adb pull命令将"/data/anr/traces.txt"文件拉取到本地。


已确认在S8+上无需root即可正常工作。谢谢! - Pär Nils Amsen

8
adb shell "cd /data/anr && cat traces.txt" > anr.txt

这将在当前所设目录下复制traces.txt到anr.txt。

这非常有用。 - Billy
1
仍然收到“权限被拒绝”的错误信息。 - thundertrick
有没有人能帮我解决这个相关的问题?因为目前所有可用的答案都无法解决。问题链接:https://stackoverflow.com/questions/62008671/how-to-get-anr-stack-trace-file-from-non-rooted-device-on-android-q - MrinmoyMk

1

使用 Adb shell data/system/Dropbox 命令,然后使用 ls 命令查看在 Dropbox 内生成的文件,其中包括 crashes、anr 和 traces 文件。

如果您想要访问这些文件,请创建一个文件夹并打开该文件夹内的 adb,然后使用以下命令:adb pull data/system/dropbox。


谢谢你的建议,我之前看到logcat打印关于DropBox在生成tombstone时被更新,但从未意识到我们可以在应用程序中使用它。效果很好,省了我很多头疼的事情,我本来要处理se-policies的问题! - undefined

1

在 getNextEntry 中,为了获取 /data/anr/traces.txt 的内容,tag 和 msec 的值应该是多少? - Stephan Steiner
数值将类似于 getNextEntry("SYSTEM_TOMBSTONE", before)。不幸的是,除非您使用系统密钥进行签名,否则这会抛出异常。 - Jo Jo

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