setjmp() là nghĩa vụ phải lưu sổ đăng ký bao gồm "địa chỉ trả về" và "con trỏ ngăn xếp" vào "jmp_buf". Khi tôi biên dịch (cả gcc và clang) và gỡ lỗi chương trình sau dưới x86_64 với glibc, tôi không thể hiểu được cái gì nằm trong "jmp_buf" và "địa chỉ trả về" và "con trỏ ngăn xếp" nằm trong "jmp_buf".Công cụ thực tế trong jmp_buf khi sử dụng setjmp và longjmp là gì?
#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");
}
Khi chương trình dừng tại điểm dừng trước "printf (" i =% d \ n ", i);", tôi đã thử chức năng gdb: "p/x env"; tuy nhiên tôi không thể tìm thấy "RIP trả về" và "RSP trước đó" trong cấu trúc này (env) chứa __jmpbuf và __saved_mask. Bất cứ ai biết chính xác hai chức năng này hoạt động như thế nào và chính xác những gì chúng tiết kiệm dưới x86_64 với glibc (tôi sử dụng ubuntu 14.04)?
Tôi thấy một số câu hỏi như thế này trong stackoverflow.com, nhưng câu trả lời thường là "Nó phụ thuộc vào kiến trúc, hệ điều hành, thư viện và ABI ..." hoặc dán tiêu chuẩn. Họ không phải là điều tôi muốn biết. – WindChaser
Tại sao bạn không xem triển khai trên nền tảng của mình? Đó là mã nguồn mở. Ví dụ: https://github.com/lattera/glibc/blob/master/sysdeps/sh/____longjmp_chk.S - đó là những gì longjmp gọi vào trong glibc. –