调试Crash

  1. -g 保留了源码级别的调试信息(变量名称、函数名称、代码行的映射),可以通过strip或者objcopy删去调试信息。
    1. 根据core dump产生时的调用栈和代码行号信息去看源代码。
    2. 利用gdb调试core文件,查看堆栈以及变量。
    3. 内存被破坏,一般情况下core的时候已经不是内存破坏的第一现场了(早就被破坏了)
    1. SEGV_MAPPER => 没有被映射(空指针、低地址指针)
    2. SEGV_ACCERR => 没有权限(试图修改只读区域)
    3. 64位系统中,0x0000000007fffffffffffff 以下为user,0xfffffffffffff8000000以上为kernel。

    4. 低地址、空指针问题
    5. 虚函数调用问题:越界、溢出导致this被写坏,虚指针指向错误,导致运行时错误。
    6. 野指针、空悬指针

无栈协程

无栈协程不会进行寄存器级别的上下文保存和恢复,只是将函数执行到的位置记录在协程对象的成员变量中,协程函数通过switch case 和 跳转宏,在恢复执行时跳转到指定位置执行。并非没有stack,而是在当前的stack上面创建协程栈帧,不会为协程指定独立的stack空间。

有栈协程可以在嵌套的栈帧中暂停(随时随地挂起),无栈协程只能在顶层栈帧暂停,在协程中调用的函数不能被暂停。

无栈协程使用宿主栈,没有单独协程栈。

对称协程 vs 非对称协程

对称协程提供 pass control 语义(交出控制权),非对称协程提供 yield、resume语义,由控制协程进行调度。


七月流火
1 声望1 粉丝