我发现我的问题在互联网上已经报告了很多次,但我没有找到任何正确的解释。
在我的 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。我会再次检查。


