Android退出时会崩溃

时间:2011-12-13 10:18:03

标签: android crash android-ndk

我发现我的问题已在互联网上多次报道,但我没有找到任何正确的解释。

在我的Galaxy Note上,当我退出程序时,我有时间将这种消息发送到le logcat。

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

我无法访问该文件。 DDMS视图不会向我显示任何内容。

我在互联网上看到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
        }
    }
}

我的活动onDestroy中也有一个特殊的代码。

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

好。我现在已经解决了这个问题一周了。 如果我不理解这个问题,下一步就是重新启动一个新项目并导入我的代码,逐个检查问题何时发生。

1 个答案:

答案 0 :(得分:0)

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

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

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

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