打开跟踪文件时出错:没有这样的文件或目录 (2)
Posted
技术标签:
【中文标题】打开跟踪文件时出错:没有这样的文件或目录 (2)【英文标题】:error opening trace file: No such file or directory (2) 【发布时间】:2012-07-11 20:40:58 【问题描述】:我收到上述错误:
当我在模拟器上运行我的 android 应用程序时。谁能告诉我这可能是什么原因?
我正在使用 android-sdk-20 并将以下行添加到 AndroidManifest.xml
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="15" />
我也加了一行:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
因为我认为写入 sd 卡可能有问题。
【问题讨论】:
我在设备上遇到了同样的问题 - 不是模拟器 发布的答案全部不正确。 “错误打开跟踪文件”是错误报告系统中的一个微不足道的配置问题,但错误报告系统只有在其他一些错误导致程序崩溃时才会尝试运行。 解决方案是从 logcat 中这条消息后面的行中找出真正的问题,然后纠正它。下面所有的疯狂猜测都没有帮助。 如果有任何内容被记录为错误,则显然会记录此消息——即使它已被处理或不会导致应用程序崩溃。有没有办法修复“错误报告系统中的琐碎配置问题”以保持日志尽可能干净? 您的解决方案并不包括克里斯。在我的情况下,没有以下线路!我在 Logcat 中得到的只是“” 我同意 Nevil,没有其他错误。 【参考方案1】:这是因为您的计算机中没有安装 minSdkVersion 或 targetSdkVersion。我已经测试过了。
例如,如果您的 Manifest.xml 中有这些行:
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
而你的电脑只安装了API17,它会报错。如果您想对其进行测试,请尝试安装其他 API 版本(在本例中为 API 8)。
即便如此,这也不是一个重要的错误。这并不意味着您的应用有问题。
对不起我的表情。英语不是我的语言。 再见!
【讨论】:
不,这不是问题。【参考方案2】:我认为这是问题
一点背景
Traceview 是一个执行日志的图形查看器,您可以使用 Debug 类在代码中记录跟踪信息。 Traceview 可以帮助您调试应用程序并分析其性能。启用它会在 sdcard 根文件夹中创建一个.trace
文件,然后该文件可由 ADB 提取并由 traceview bat 文件处理以进行处理。它也可以由 DDMS 添加。
这是记录器内部使用的系统。 一般来说,除非您使用 traceview 提取跟踪文件,否则此错误不会打扰您。您应该查看与您的应用程序直接相关的错误/日志
如何启用它:
生成跟踪日志有两种方式:
在代码中包含Debug类并调用其方法如
startMethodTracing()
和stopMethodTracing()
来启动和停止 将跟踪信息记录到磁盘。这个选项非常精确 因为您可以准确指定开始和停止记录跟踪的位置 代码中的数据。使用 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.) 带有足够空间的 SDCard 的模拟器。文档没有说这是否仅适用于 DDMS 也适用于调试,所以我假设这对于通过应用程序进行调试也是如此。
我该如何处理这个错误:
现在该错误本质上是由于没有 sdcard 路径来创建跟踪文件或没有访问它的权限。这是一个旧线程,但赏金背后的开发人员检查是否满足两个先决条件。然后,您可以在模拟器的 sdcard 文件夹中搜索 .trace
文件。如果它存在,它不应该给你这个问题,如果它没有尝试通过将startMethodTracing
添加到你的应用程序来创建它。
我不确定为什么当记录器启动时它会自动查找此文件。我认为当发生错误/日志事件时,记录器在内部尝试写入跟踪文件但没有找到它,在这种情况下它会抛出错误.浏览了文档后,我没有找到太多关于为什么会自动打开的参考资料。
但通常这不会直接影响您,您应该检查直接应用程序日志/错误。
另外,Android 2.2 和更高版本的设备不需要 SD 卡来进行 DDMS 跟踪记录。跟踪日志文件直接流式传输到您的开发机器。
关于 Traceview 的其他信息:
将跟踪文件复制到主机
在您的应用程序运行之后 并且系统已经创建了您的跟踪文件 .trace on 设备或模拟器,您必须将这些文件复制到您的开发中 计算机。您可以使用 adb pull 来复制文件。这是一个例子 这显示了如何从默认值复制示例文件 calc.trace 模拟器上的位置到模拟器主机上的 /tmp 目录 机器:
adb pull /sdcard/calc.trace /tmp 在 Traceview 中查看跟踪文件 运行 Traceview 并查看跟踪文件,进入 traceview .例如,在示例文件上运行 Traceview 复制上一节,使用:
traceview /tmp/calc 注意:如果您尝试查看跟踪日志 启用 ProGuard 构建的应用程序(发布模式 build),某些方法和成员名称可能会被混淆。您可以使用 Proguard mapping.txt 文件找出原始未混淆 名字。有关此文件的更多信息,请参阅 Proguard 文档。
我认为任何其他关于定位oncreate
语句或删除uses-sdk
的答案都没有关系,但这是Android,我可能错了。将此问题重定向给android工程师或将其作为错误发布会很有用
更多内容请关注docs
【讨论】:
【参考方案3】:尝试删除uses-sdk
部分表单AndroidManifest.xml
文件。它对我有用!
不要使用配置太低的 Android 虚拟设备。让它成为中等。
【讨论】:
关于配置的“中等”是什么意思? SDK版本?我在使用 minSdkVersion="14", targetSdk="17" 时也遇到了这个问题,并且我的模拟器运行的是版本 17。 @ahmad 我有同样的问题,我的配置虚拟设备比它解决的最小...... 这不是答案。【参考方案4】:在这两行下面写下你所有的代码:-
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
它对我有用,无需重新安装。
【讨论】:
这纯属巧合。标题中的错误信息是崩溃报告系统中的配置问题,并没有给出程序崩溃原因的任何提示。当然,在尝试调用其中的 View 对象的方法之前未能设置内容视图是崩溃的常见来源。但是提供这个作为答案是随机猜测程序为什么会崩溃。【参考方案5】:我不想重新安装所有东西,因为我安装了很多 SDK 版本,而且我的开发环境设置得恰到好处。重新设置它需要很长时间。
对我有用的是删除,然后重新创建 Android 虚拟设备,确保输入 SD 卡大小的值(我使用 200 MiB)。
附加信息:
虽然上述确实暂时解决了问题,但它会反复出现。我刚刚在 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 卡。
【讨论】:
这与问题完全无关。 其实是的。确实如此。据我了解,跟踪文件存储在 SD 卡上。如果无法挂载SD卡,则无法读取跟踪文件。 不,它没有。 Logcat 不会从 sdcard 中提取,而是从内存中的日志缓冲区中提取。甚至您也注意到这并不能解决问题。真正的解决方法是忽略崩溃报告系统的这个配置问题,而是首先诊断并修复程序崩溃的原因 - 应该在立即以下日志中指出的原因消息。【参考方案6】:您将无法在模拟器中访问您的真实 SD 卡。您必须按照此tutorial 中的步骤将您的模拟器定向到您的开发环境中充当 SD 卡的目录。
【讨论】:
请发布一些代码并指出您在哪一行收到错误。 这与问题无关。【参考方案7】:实际上,问题在于/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);
日志消息肯定会提供更多信息。
【讨论】:
以上是关于打开跟踪文件时出错:没有这样的文件或目录 (2)的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows 中编译 ZBar 示例时出错:无法打开包含文件:'Magick++.h':没有这样的文件或目录
加载共享库时出错,无法打开共享对象文件:没有这样的文件或目录(hiredis)
加载共享库时出错:libgmock.so:无法打开共享对象文件:没有这样的文件或目录
加载共享库时出错:libgfortran.so.1:无法打开共享对象文件:没有这样的文件或目录