链式展开信息结构
如果设置了 UNW_FLAG_CHAININFO 标志,则下一个将设置展开信息结构,共享异常处理程序/链式信息地址字段中包含主展开信息。 下面的代码检索主展开信息,假定 unwindInfo 是设置了 UNW_FLAG_CHAININFO 标志的结构。
PRUNTIME_FUNCTION primaryUwindInfo = (PRUNTIME_FUNCTION)&(unwindInfo->UnwindCode[( unwindInfo->CountOfCodes + 1 ) & ~1]);
在两种情况下链式信息十分有用。 首先,它可用于非连续代码段。 由于不需要重复主展开信息中的展开代码数组,因此使用链式信息可减小所需的展开信息的大小。
还可以使用链接的信息将易失寄存器保存内容分组。 编译器可以延迟保存一些易失寄存器,直到超出函数项 Prolog。 通过在分组代码之前提供函数部分的主展开信息,可对此进行记录,然后通过 Prolog(长度不为零)设置链式信息,其中链式信息中的展开代码反映了非易失寄存器的保存内容。 在这种情况下,展开代码是 UWOP_SAVE_NONVOL 的所有实例。 不支持使用 PUSH 保存非易失寄存器或使用其他固定的堆栈分配修改 MSBuild.rsp 文件的分组。
具有 UNW_FLAG_CHAININFO 集的 UNWIND_INFO 项可以包含 RUNTIME_FUNCTION 项,而 RUNTIME_FUNCTION 项的 UNWIND_INFO 项也具有 UNW_FLAG_CHAININFO 集(多次紧缩套装)。 最后,链式展开信息指针将到达 UNWIND_INFO 项(清除了 UNW_FLAG_CHAININFO),该项是指向实际过程入口点的主 UNWIND_INFO 项。