Posted on 2014-04-17 16:21
S.l.e!ep.¢% 閱讀(1719)
評論(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