【问题标题】:Android crash sometime on exit退出时Android有时会崩溃
【发布时间】:2011-12-13 10:18:03
【问题描述】:

我发现我的问题在网上被举报了很多次,但我没有找到任何正确的解释。

在我的 Galaxy Note 上,当我退出程序时,我有一段时间会在 le logcat 中看到这种消息。

threadid=3: reacting to signal 3
Wrote stack traces to '/data/anr/traces.txt'

我无法访问该文件。 DDMS 视图在资源管理器中没有显示任何内容。

我在 Internet 上读到 ANR(应用程序无响应)是由于 Activity 长过程造成的。 但就我而言,我的活动并没有做任何特殊的事情。

我正在使用启动 3 个线程的 SurfaceView。 其中一个在应用程序开始时可能需要很长时间(1 或 2 秒)(它从 sdcard 读取大数据文件),但在我退出时它最后什么都不做。

我可以在 DDMS 视图中看到 10 个进程,但我不知道 #3 是什么线程! 所以我不知道这是我启动的线程之一还是Android线程。

除了发现问题之外,我还想了解什么是信号 3。 当这个问题之王发生时。仅仅是因为某个进程没有响应还是由于另一个问题? 我在 linux (beagleboard) 下测试了我的本机代码。没有内存泄漏,也没有分段错误。 为什么这个问题只在我退出我的应用程序时发生(并且只是有时)。是不是说明我的线程销毁不正确?

我正在使用此代码

public void surfaceDestroyed(SurfaceHolder holder) {
    boolean retry = true;
    while (retry) {
        try {
            thread.join();
            retry = false;
        } catch (InterruptedException e) {
            // try again shutting down the thread
        }
    }
}

我的 Activity 的 onDestroy 也有一个特殊代码。

此代码使一些本机代码免费。 因为它是 c++ 代码,所以它调用了我的对象的所有析构函数。 我不知道这个破坏是否很长,但我想它不会超过 1 毫秒。

嗯。我已经在这个问题上工作了 1 周。 如果我不明白这个问题,下一步对我来说是重新启动一个新项目并导入我的代码,部分地检查问题何时真正发生。

【问题讨论】:

标签: android crash android-ndk


【解决方案1】:

嗯。我开始了一个新项目,我找到了一些信息! 线程#3 可能是垃圾收集器线程。 当 GC 对我在本机代码中制作的 malloc 执行某些操作时,似乎是在退出时出现了问题。

我更改了所有代码,并在活动的 OnCreate 中创建了一个大型 C++ malloc (20Mo)。并免费进入 OnDestroy。 退出并重新启动后,我遇到了问题。 我不知道 CG 和原生 C malloc 之间的联系是什么,但我猜想在一些启动后 malloc 失败了,因为 GC 进程没有足够的时间来清理原生缓冲区...

实际上没有崩溃。 有时应用程序需要几秒钟才能启动,但手机不会崩溃。

这可能是我没有在每个地方测试 malloc 调用的结果,所以我的问题可能来自失败的 malloc。我会再次检查。

【讨论】:

    猜你喜欢
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    相关资源
    最近更新 更多