打开跟踪文件时出错:没有这个文件或目录(2)

65

我遇到了上述错误:

error opening trace file: No such file or directory (2)

当我在模拟器上运行我的Android应用程序时。请问可能的原因是什么?

我正在使用android-sdk-20,以下内容已添加到AndroidManifest.xml文件中。

<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="15" />

我还添加了这行代码:

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

因为我认为可能存在写入SD卡的问题。


1
我在设备上遇到了同样的问题 - 不是模拟器。 - B T
16
发布的答案全部错误。 "error opening trace file" 是一个微不足道的配置问题,出现在错误报告系统中,但只有当其他故障导致程序崩溃时,错误报告系统才尝试运行。解决方案是从logcat中跟随此消息后面的行中识别出真正的问题,并进行更正。下面的所有猜测都毫无帮助。 - Chris Stratton
如果记录任何内容作为错误(即使已处理或不会导致应用程序崩溃),则显然会记录此消息。有没有办法修复“漏洞报告系统中的琐碎配置问题”,以尽可能保持日志的干净? - scottt
2
你的解决方案并不全面,Chris。在我的情况下,没有任何后续行!在Logcat中,我只得到了“error opening trace file: No such file or directory (2)”这个错误信息。 - Chris Nevill
我同意Nevil的观点,没有其他错误。 - user1010160
7个回答

11

这是因为您的计算机中没有安装minSdkVersion或targetSdkVersion。我刚刚测试过。

例如,如果你在你的Manifest.xml文件中有这些行:

<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />

如果您在计算机上仅安装了API17,它会向您报告错误。如果您想进行测试,请尝试安装其他API版本(在这种情况下,是API 8)。

即便如此,这不是一个重要的错误。这并不意味着您的应用有问题。

对我表达不清感到抱歉,英语不是我的母语。 再见!


4
不,这不是问题所在。 - Chris Stratton

8

我认为这是问题所在。

一些背景信息

Traceview是一个图形化查看器,用于查看您使用Debug类记录代码中跟踪信息而创建的执行日志。Traceview可以帮助您调试应用程序并分析其性能。启用它会在sdcard根文件夹中创建一个.trace文件,该文件可以通过ADB提取并由traceview批处理文件进行处理。它也可以被DDMS添加。

它是日志记录器内部使用的系统。通常情况下,除非您正在使用traceview提取跟踪文件,否则此错误不应影响您。您应该查看与您的应用程序直接相关的错误/日志。

如何启用它:

有两种方法可以生成跟踪日志:
  1. 在代码中包含Debug类并调用其方法,如startMethodTracing()stopMethodTracing(),以开始和停止将跟踪信息记录到磁盘。此选项非常精确,因为您可以指定确切的位置开始和停止记录跟踪数据。
  2. 使用DDMS的方法分析功能生成跟踪日志。此选项不太精确,因为您不修改代码,而是使用DDMS指定何时开始和停止记录。虽然您对记录开始和停止的位置没有更多控制,但如果您无法访问应用程序的代码,或者不需要精确的日志记录时间,则此选项很有用。

但是上述内容存在以下限制:

如果您正在使用Debug类,则应用程序必须具有写入外部存储器的权限(WRITE_EXTERNAL_STORAGE)。
如果您正在使用DDMS:Android 2.1及更早版本的设备必须存在SD卡,并且您的应用程序必须具有写入SD卡的权限。 Android 2.2及更高版本的设备不需要SD卡。跟踪日志文件直接流式传输到开发计算机。
因此,追踪文件访问需要两个条件:
1.) 写入跟踪日志文件的权限,即WRITE_EXTERNAL_STORAGEREAD_EXTERNAL_STORAGE
2.) 带有足够空间的附加SD卡的模拟器。文档没有说明这仅适用于DDMS还是也适用于调试,因此我假设这对通过应用程序进行调试也是正确的。 我该如何处理这个错误: 现在的错误基本上是由于没有SD卡路径来创建跟踪文件或没有访问权限而导致的。这是一个旧的线程,但是赏金背后的开发人员要检查是否满足这两个先决条件。然后,您可以在模拟器的sdcard文件夹中搜索.trace文件。如果存在,它不应该给您带来问题,如果不存在,请尝试通过将startMethodTracing添加到您的应用程序来创建它。
我不确定为什么它在记录器启动时自动查找此文件。我认为当出现错误/日志事件时,记录器在内部尝试写入跟踪文件并未找到它,在这种情况下,它会抛出错误。经过查阅文档,我没有找到太多关于为什么会自动打开的参考。 但总的来说,这不会直接影响您,您应该检查直接应用程序日志/错误。 另外,Android 2.2及更高版本的设备不需要SD卡进行DDMS跟踪记录。跟踪日志文件直接流式传输到您的开发计算机。
Traceview的其他信息:

将跟踪文件复制到主机

在应用程序运行并且系统在设备或模拟器上创建了.trace跟踪文件之后,您必须将这些文件复制到开发计算机。您可以使用adb pull来复制文件。以下是一个示例,显示如何从模拟器上的默认位置将示例文件calc.trace复制到模拟器主机上的/tmp目录:

adb pull /sdcard/calc.trace /tmp

在Traceview中查看跟踪文件

要运行Traceview并查看跟踪文件,请输入traceview。例如,要在前一节中复制的示例文件上运行Traceview,请使用:

traceview /tmp/calc

注意:如果您试图查看启用ProGuard(发布模式构建)的应用程序的跟踪日志,则某些方法和成员名称可能会被混淆。您可以使用Proguard mapping.txt文件来找出原始的未混淆名称。有关此文件的更多信息,请参阅Proguard文档。

我认为关于oncreate语句的定位或删除uses-sdk的任何其他答案都不相关,但这是Android,我可能错了。将此问题重定向到Android工程师或将其发布为错误可能会有用。
更多信息请参见文档

6

尝试从AndroidManifest.xml文件中删除uses-sdk部分。对我有用!

不要使用配置过低的Android虚拟设备,让它保持中等配置。


1
在配置方面,“中间件”是什么意思?指的是SDK版本吗?我也遇到了这个问题,使用minSdkVersion="14",targetSdk="17",我的模拟器运行在版本17上。 - Kyle Falconer
@ahmad 我有同样的问题,我使用的是最低配置的虚拟设备,那么该怎么解决呢...... - Amitsharma
4
这不是答案。 - Chris Stratton

5
请将所有代码写在这两行代码下方:-
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

我不需要重新安装就可以成功。


这只是纯属巧合的解决方案。标题中的错误信息是崩溃报告系统中的配置问题,并没有提供任何关于程序崩溃原因的提示。当然,在尝试调用其中视图对象的方法之前未能设置内容视图是导致崩溃的常见原因。但是,将此作为答案提供就是随机猜测程序可能崩溃的原因。 - Chris Stratton

4
我不想重新安装所有东西,因为我安装了很多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卡。


1
这与问题毫无关系。 - Chris Stratton
实际上,是的。据我所知,跟踪文件存储在SD卡上。如果无法挂载SD卡,则无法读取跟踪文件。 - Kyle Falconer
1
不,它并不会。Logcat不是从SD卡中提取日志,而是从内存日志缓冲区中提取。即使您注意到这并不能解决问题。真正的解决方法是忽略崩溃报告系统中的此配置问题,而是诊断和修复程序首次崩溃的原因 - 这个原因应该在紧随其后的日志消息中指示。 - Chris Stratton

3
您在模拟器中无法访问您的真实SD卡。您需要按照这个教程中的步骤,将模拟器引导到作为SD卡的开发环境上的目录。请注意,不要删除HTML标记。

请发布一些代码并指出您在哪一行遇到了错误。 - Erol
这与问题无关。 - Chris Stratton

2
实际上,问题在于 /sys/kernel/debug 没有挂载,或者运行的内核没有编译 ftrace tracers,因此 /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);
    }
}

这个日志信息可以更加详细。


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