昨晚和同事联调我们的开放平台,由于基于协程框架的网关服务器总是在接受两个消息后发生段错误,Core Dump掉,让我们百思不得其解。
查看Dump文件,没有任何有效的调试信息。gdb设置断点调试,程序总是在接受到第二条消息之前,没到断点就崩溃。而日志信息却可以打到在断点之后。搞了一个多小时,真的让我们很崩溃。
最后,到晚上一点多后,我们决定改大一下协程的栈空间大小试试。结果让我们兴奋不已,连续发送了几百条消息,都不会出现任何问题。
优化栈空间后,改回原来的栈空间,也可以正常收发,转发消息。
由此,我们得出结论:
对于协程框架,区别于线程框架,应当尽量使用堆而非栈。这是因为每个协程都会有其自己的栈空间上下文,一旦栈空间上下文不足,使用了过多的栈空间,就会篡改其他协程的栈空间,当其他协程读写被篡改的位置时,就会发生错误。而这种错误,很难被发现。调试很难定位到问题所在。