使用 setjmp 和 longjmp 时 jmp_buf 中的实际内容是什么?
What are the actual stuff in the jmp_buf when using setjmp and longjmp?
setjmp() 应该将 "return address" 和 "stack pointer" 等寄存器保存到 "jmp_buf" 中。当我使用 glibc 在 x86_64 下编译(gcc 和 clang)和调试以下程序时,我无法理解 "jmp_buf" 中的内容以及 "return address" 和 "stack pointer" 所在的位置在 "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) 中找不到 "return RIP" 和 "previous RSP"。任何人都知道这两个函数究竟是如何工作的,以及它们在 x86_64 和 glibc 下到底保存了什么(我使用 ubuntu 14.04)?
信不信由你,jmp_buf
的内容 故意 毫无意义。如果您查看 the source to the x86_64 setjmp()
,您会注意到对 PTR_MANGLE
的多次引用。这是一个内部 glibc 宏,它针对寄存器对线程局部值进行异或运算。这在很大程度上用于确保开发人员不依赖 jmpbuf
的布局——它被认为是一个实现细节,并且可能会在 libc 的版本之间发生变化。
如果您想要可读的内容,请查看 the ucontext interface。
setjmp() 应该将 "return address" 和 "stack pointer" 等寄存器保存到 "jmp_buf" 中。当我使用 glibc 在 x86_64 下编译(gcc 和 clang)和调试以下程序时,我无法理解 "jmp_buf" 中的内容以及 "return address" 和 "stack pointer" 所在的位置在 "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) 中找不到 "return RIP" 和 "previous RSP"。任何人都知道这两个函数究竟是如何工作的,以及它们在 x86_64 和 glibc 下到底保存了什么(我使用 ubuntu 14.04)?
信不信由你,jmp_buf
的内容 故意 毫无意义。如果您查看 the source to the x86_64 setjmp()
,您会注意到对 PTR_MANGLE
的多次引用。这是一个内部 glibc 宏,它针对寄存器对线程局部值进行异或运算。这在很大程度上用于确保开发人员不依赖 jmpbuf
的布局——它被认为是一个实现细节,并且可能会在 libc 的版本之间发生变化。
如果您想要可读的内容,请查看 the ucontext interface。