协程框架的堆栈大小陷阱

转载 2015年11月20日 18:27:34

昨晚和同事联调我们的开放平台,由于基于协程框架的网关服务器总是在接受两个消息后发生段错误,Core Dump掉,让我们百思不得其解。

 

查看Dump文件,没有任何有效的调试信息。gdb设置断点调试,程序总是在接受到第二条消息之前,没到断点就崩溃。而日志信息却可以打到在断点之后。搞了一个多小时,真的让我们很崩溃。

 

最后,到晚上一点多后,我们决定改大一下协程的栈空间大小试试。结果让我们兴奋不已,连续发送了几百条消息,都不会出现任何问题。

优化栈空间后,改回原来的栈空间,也可以正常收发,转发消息。

 

由此,我们得出结论:

对于协程框架,区别于线程框架,应当尽量使用堆而非栈。这是因为每个协程都会有其自己的栈空间上下文,一旦栈空间上下文不足,使用了过多的栈空间,就会篡改其他协程的栈空间,当其他协程读写被篡改的位置时,就会发生错误。而这种错误,很难被发现。调试很难定位到问题所在。

相关文章推荐

【Linux系统编程】线程堆栈大小的使用介绍

先来讲说线程内存相关的东西,主要有下面几条: 进程中的所有的线程共享相同的地址空间。任何声明为 static/extern 的变量或者堆变量可以被进程内所有的线程读写。一个线程真正拥有的唯一私有...

线程堆栈大小的使用介绍

先来讲说线程内存相关的东西,主要有下面几条: 进程中的所有的线程共享相同的地址空间。任何声明为 static/extern 的变量或者堆变量可以被进程内所有的线程读写。一个线程真正拥有的...

设置线程堆栈大小-----一台电脑最多能开启多少个线程

//http://www.cnblogs.com/nsnow/archive/2010/08/06/1794490.html //http://blog.csdn.net/nokianasty/art...

关于线程堆栈大小的注意事项

在单元测试时,发现了比较多的线程堆栈空间不够导致 COREDUMP 的问题,这个问题的原因是由于线程独立拥有一个可配置大小的堆栈,一个线程内所有函数使用到的堆栈都依赖于这个栈,如果太多的变量、参数需要...
  • xhhjin
  • xhhjin
  • 2012年05月18日 09:45
  • 8033

如何使用 Editbin 调整 SQL Server 线程的堆栈大小(dump)

Microsoft 的二进制文件编辑器 (Editbin.exe) 可用于调整 SQL Server 大内存配置允许在具有 2 GB 或更多的物理 RAM 的计算机上的 SQL Server 线程的堆...
  • ljz9425
  • ljz9425
  • 2011年09月07日 13:30
  • 683

【妙用协程】 - 诡异的web框架

在史前的web开发时代(我说的是AngularJS工程师开始变得价值不菲之前的黑暗岁月),web开发的一个痛点在于HTTP是一个无状态的协议,浏览器是一个无状态的展示表单提交工具。当然现在的web开发...

Java协程框架--Kilim工作原理

Kilim协程框架中最核心需要解决的问题: 如何暂停处理当前任务,转而处理其他任务? 如何恢复任务继续执行? 也即如何实现协程本身的 yield / resume的语义特性。...

Java协程框架-Kilim字节码剖析

前面几篇文章从代码层面介绍了Kilim的基本原理,但是对于其中的一些细节,比如Task的执行状态如何管理等问题从代码上依然得不到答案,本文即再深入到字节码层面来解答。 1.  Kilim字节码改写前后...

Java协程框架--Kilim常见问题解答

1.Kilim中的Task,即用户线程如何调度和切换? 在多任务的调度上操作系统存在抢占式和协作式两种方式,相比传统的Thread多线程间抢占式调度,Kilim中的Task采用的是协作式调度,即由Ta...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:协程框架的堆栈大小陷阱
举报原因:
原因补充:

(最多只允许输入30个字)