Posted on 2014-04-17 16:21
S.l.e!ep.¢% 閱讀(1720)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
C++
最近的程序莫名奇妙的coredump,? 掛的方式和地方都不一樣, 后來(lái)懷疑是 協(xié)程的堆棧溢出了.
makecontext() 傳入的第一個(gè)參數(shù) ucontext_t* 其中的成員 uc_stack.ss_size 需要指定堆棧的大小, 改了下大小, 就不會(huì)掛了
谷歌了下,發(fā)現(xiàn)也有人遇到同樣的坑,解決方法也是
1. 避免使用棧
2. 增大協(xié)程棧的大小
原文: 協(xié)程框架的堆棧大小陷阱
檢查下了unix下的線程堆棧大小
linux-7r0r:~ # ulimit -a | grep stack
stack size????????????? (kbytes, -s) 8192
發(fā)現(xiàn)只有8M?
谷歌了半天,沒(méi)有找到答案的兩個(gè)問(wèn)題
1. 協(xié)程堆棧現(xiàn)在我定義了20M, 但隨著程序邏輯的復(fù)雜性增加, 可能也會(huì)溢出, 只是早晚的問(wèn)題
2. 如何去保護(hù)這個(gè)協(xié)程堆棧, 發(fā)現(xiàn)異常時(shí), 可以及時(shí)發(fā)現(xiàn), 甚至可以 try - catch?
???-- 網(wǎng)上已經(jīng)有人用mprotect做了堆棧保護(hù), http://www.gaccob.com/?p=1254?
看到 GNU有個(gè) pth 也封裝了協(xié)程 http://www.gnu.org/software/pth/
.. but 代碼沒(méi)看懂它是如何調(diào)用 makecontext 的, 先 make down