Posted on 2014-04-17 16:21
S.l.e!ep.¢% 阅读(1709)
评论(0) 编辑 收藏 引用 所属分类:
C++
最近的程序莫名奇妙的coredump, 挂的方式和地方都不一样, 后来怀疑是 协程的堆栈溢出了.
makecontext() 传入的第一个参数 ucontext_t* 其中的成员 uc_stack.ss_size 需要指定堆栈的大小, 改了下大小, 就不会挂了
谷歌了下,发现也有人遇到同样的坑,解决方法也是
1. 避免使用栈
2. 增大协程栈的大小
原文: 协程框架的堆栈大小陷阱
检查下了unix下的线程堆栈大小
linux-7r0r:~ # ulimit -a | grep stack
stack size (kbytes, -s) 8192
发现只有8M?
谷歌了半天,没有找到答案的两个问题
1. 协程堆栈现在我定义了20M, 但随着程序逻辑的复杂性增加, 可能也会溢出, 只是早晚的问题
2. 如何去保护这个协程堆栈, 发现异常时, 可以及时发现, 甚至可以 try - catch
-- 网上已经有人用mprotect做了堆栈保护, http://www.gaccob.com/?p=1254
看到 GNU有个 pth 也封装了协程 http://www.gnu.org/software/pth/
.. but 代码没看懂它是如何调用 makecontext 的, 先 make down