调试Crash
- -g 保留了源码级别的调试信息(变量名称、函数名称、代码行的映射),可以通过strip或者objcopy删去调试信息。
- 根据core dump产生时的调用栈和代码行号信息去看源代码。
- 利用gdb调试core文件,查看堆栈以及变量。
- 内存被破坏,一般情况下core的时候已经不是内存破坏的第一现场了(早就被破坏了)
- SEGV_MAPPER => 没有被映射(空指针、低地址指针)
- SEGV_ACCERR => 没有权限(试图修改只读区域)
64位系统中,0x0000000007fffffffffffff 以下为user,0xfffffffffffff8000000以上为kernel。
- 低地址、空指针问题
- 虚函数调用问题:越界、溢出导致this被写坏,虚指针指向错误,导致运行时错误。
- 野指针、空悬指针
无栈协程
无栈协程不会进行寄存器级别的上下文保存和恢复,只是将函数执行到的位置记录在协程对象的成员变量中,协程函数通过switch case 和 跳转宏,在恢复执行时跳转到指定位置执行。并非没有stack,而是在当前的stack上面创建协程栈帧,不会为协程指定独立的stack空间。
有栈协程可以在嵌套的栈帧中暂停(随时随地挂起),无栈协程只能在顶层栈帧暂停,在协程中调用的函数不能被暂停。
无栈协程使用宿主栈,没有单独协程栈。
对称协程 vs 非对称协程
对称协程提供 pass control 语义(交出控制权),非对称协程提供 yield、resume语义,由控制协程进行调度。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。