Skip to main content
 首页 » 编程设计

退出时Android有时会崩溃

2026年03月30日64emanlee

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

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

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

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

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

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

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

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

我正在使用此代码
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 中还有一个特殊代码。

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

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

请您参考如下方法:

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

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

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

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