setjmp() soll Register speichern, die "Rückkehradresse" und "Stapelzeiger" in "jmp_buf" enthalten. Wenn ich (sowohl gcc und clang) kompiliere und das folgende Programm unter x86_64 mit glibc debugge, kann ich nicht verstehen, was in "jmp_buf" ist und wo "return address" und "stack pointer" sich in "jmp_buf" befinden.Was sind die tatsächlichen Sachen im jmp_buf, wenn setjmp und longjmp verwendet werden?
#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");
}
Wenn das Programm an einem Haltepunkt stoppt, bevor "printf (" i =% d \ n "i);" habe ich versucht, GDB Funktionalität: "p/x env"; Allerdings kann ich in dieser Struktur (env), die __jmpbuf und __saved_mask enthält, nicht den "return RIP" und den "vorherigen RSP" finden. Jeder weiß, wie genau diese beiden Funktionen funktionieren und was genau sie unter x86_64 mit glibc speichern (ich benutze ubuntu 14.04)?
Ich sah mehrere Fragen wie diese in stackoverflow.com, aber die Antworten sind in der Regel "Es hängt von der Architektur, Betriebssystem, Bibliothek und ABI ..." oder fügen Sie den Standard. Sie sind nicht das, was ich gerne wissen würde. – WindChaser
Warum sehen Sie sich die Implementierung auf Ihrer Plattform nicht an? Es ist Open Source. Zum Beispiel: https://github.com/lattera/glibc/blob/master/sysdeps/sh/____longjmp_chk.S - so ruft longjmp in glibc auf. –