【问题标题】:Android Signal 11 (SIGSEGV)安卓信号 11 (SIGSEGV)
【发布时间】:2013-06-26 16:13:02
【问题描述】:

我在这里和其他网站上阅读了很多帖子,但找不到创建错误的问题:
我使用 AsyncTask 是因为我想在执行前后轻松操作 UI 线程。
在 doInBackground 中,我创建了一个 ThreadPoolExecutor 并执行 Runnables。
如果我只使用 Executor 执行 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]

我这样设置 ThreadPoolExecutor:

// numberOfPackages: Number of Runnables to be executed
public void initializeThreadPoolExecutor (int numberOfPackages)
{
    int corePoolSize = Runtime.getRuntime().availableProcessors();
    int maxPoolSize = numberOfPackages;
    long keepAliveTime = 60;
    final BlockingQueue workingQueue = new LinkedBlockingQueue();
    executor = new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveTime, TimeUnit.SECONDS, workingQueue);
}

我不知道为什么在启动第二个线程时它会失败。
也许内存泄漏?

任何帮助表示赞赏。
提前致谢

【问题讨论】:

  • 您是否使用 NDK 执行任何本机代码?
  • 没有。我没有通过 NDK 使用任何本机代码。我只是尝试列出给定长度的特定字符的所有排列。

标签: android android-asynctask runnable threadpoolexecutor


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果您没有执行任何自己的本机代码(或来自您添加的第三方库),那么您在此设备上的 Android 副本中遇到了一些错误。虽然本机代码中的错误可能导致 SIGSEGV,但您在 Java 中所做的任何事情都不应该发生。

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 谢谢。但这也无济于事。
      【解决方案4】:

      我找到了这个问题的原因。

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

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

      感谢您的帮助。

      【讨论】:

      • 您是如何找到问题的?我试图找出导致我自己的 SIGSEGV 的原因。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-25
      • 2020-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多