打开跟踪文件时出错:没有这样的文件或目录 (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_STORAGEREAD_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:无法打开共享对象文件:没有这样的文件或目录

clang:加载共享库时出错:libtinfo.so.5:无法打开共享对象文件:没有这样的文件或目录

psql:加载共享库时出错:libpq.so.5:无法打开共享对象文件:没有这样的文件或目录