乐趣区

关于c++:读书笔记

调试 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 语义,由管制协程进行调度。

退出移动版