Android 安卓信号11(SIGSEGV)

Android 安卓信号11(SIGSEGV),android,android-asynctask,runnable,threadpoolexecutor,Android,Android Asynctask,Runnable,Threadpoolexecutor,我在这里和其他网站上读了很多帖子,但没有发现产生错误的问题: 我使用AsyncTask是因为我想在执行前后轻松地操纵UI线程。 在doInBackground中,我创建了一个ThreadPoolExecutor并执行Runnables。 如果我只使用执行器执行1个Runnable,则没有问题,但如果我执行另一个Runnable,则会出现以下错误: 06-26 18:00:42.288: A/libc(25073): Fatal signal 11 (SIGSEGV) at 0x7f486162

我在这里和其他网站上读了很多帖子,但没有发现产生错误的问题:
我使用AsyncTask是因为我想在执行前后轻松地操纵UI线程。
在doInBackground中,我创建了一个ThreadPoolExecutor并执行Runnables。
如果我只使用执行器执行1个Runnable,则没有问题,但如果我执行另一个Runnable,则会出现以下错误:

06-26 18:00:42.288: A/libc(25073): Fatal signal 11 (SIGSEGV) at 0x7f486162 (code=1), thread 25106 (pool-1-thread-2)
06-26 18:00:42.304: D/dalvikvm(25073): GC_CONCURRENT freed 119K, 2% free 8908K/9056K, paused 4ms+4ms, total 45ms
06-26 18:00:42.327: I/System.out(25073): In Check All with Prefix: a and Length: 4
06-26 18:00:42.390: I/DEBUG(126): *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***  ***
06-26 18:00:42.390: I/DEBUG(126): Build fingerprint: 'google/yakju/maguro:4.2.2/JDQ39/573038:user/release-keys'
06-26 18:00:42.390: I/DEBUG(126): Revision: '9'
06-26 18:00:42.390: I/DEBUG(126): pid: 25073, tid: 25106, name: pool-1-thread-2  >>>     de.uni_duesseldorf.cn.distributed_computing2 <<<
06-26 18:00:42.390: I/DEBUG(126): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 7f486162

...

06-26 18:00:42.538: I/DEBUG(126): memory map around fault addr 7f486162:
06-26 18:00:42.538: I/DEBUG(126):     60292000-60391000 
06-26 18:00:42.538: I/DEBUG(126):     (no map for address)
06-26 18:00:42.538: I/DEBUG(126):     bed14000-bed35000 [stack]
我不知道为什么在启动第二个线程时失败。
也许是内存泄漏

感谢您的帮助。

提前感谢

如果您没有执行自己的任何本机代码(或从您添加的第三方库中执行),那么您将在该设备上的Android副本中遇到一些错误。虽然本机代码中的bug可能会导致SIGSEGV


如果您可以在多个制造商的多个设备/模拟器上复制,那么问题可能出在Android本身。如果问题只出现在单个设备上,则可能是该设备特有的错误。

RejectionExecutionHandler处理它,
只需将另一个参数(
new ThreadPoolExecutor.DiscardPolicy()
)添加到
ThreadPoolExecutor
的实例化中,如下所示

executor = new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveTime, TimeUnit.SECONDS, workingQueue,new ThreadPoolExecutor.DiscardPolicy());

我找到了这个问题的原因

我在
initializeThreadPoolExecutor()
中将工作队列创建为局部变量。 退出该方法后,工作队列似乎已被Java垃圾收集器删除,因此当我想向队列中添加另一个
任务时,无法访问该队列

为了解决这个问题,我创建了一个全局变量
workingQueue
,并在初始化我的
ThreadPoolExecutor
时使用了它


谢谢你的帮助。

我也有同样的错误,但我发现崩溃是因为我在对象中存储位图,而Android无法很好地处理位图。通过将位图转换为Base64字符串,我将数据类型从位图更改为字符串,从而解决了致命问题。这可能对某人有所帮助。

您是否使用NDK执行任何本机代码?否。我没有通过NDK使用任何本机代码。我只是试着列出给定长度的特定字符的所有排列。谢谢。但这也没用。你是如何找到问题的?我在想是什么导致了我的SIGV。谢谢
executor = new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveTime, TimeUnit.SECONDS, workingQueue,new ThreadPoolExecutor.DiscardPolicy());