setjmp() 应该将包括“返回地址”和“堆栈指针”在内的寄存器保存到“jmp_buf”中。当我使用 glibc 编译(gcc 和 clang)并在 x86_64 下调试以下程序时,我无法理解“jmp_buf”中的内容以及“返回地址”和“堆栈指针”在“jmp_buf”中的位置。
#include <stdio.h>
#include <setjmp.h>
int main()
{
int i;
jmp_buf env;
i = setjmp(env);
printf("i = %d\n", i);
if (i != 0) return;
longjmp(env, 2);
printf("Does this line get printed?\n");
}
当程序在 "printf("i = %d\n", i);" 之前的断点处停止时,我尝试了 gdb 功能:"p/x env"; 但是我在包含 __jmpbuf 和 __saved_mask 的结构 (env) 中找不到“返回 RIP”和“以前的 RSP”。任何人都知道这两个函数究竟是如何工作的,以及它们在 x86_64 下使用 glibc(我使用 ubuntu 14.04)究竟保存了什么?