2011-09-29 24 views
5

Khi tôi nhận được tín hiệu gây ra coredump, tôi muốn chạy trình xử lý riêng của mình để sao chép cấu trúc siginfo_t và ucontext_t vào các biến toàn cầu, để chúng có thể được truy cập trong kết xuất lõi. Hiện tại vào cuối xử lý của tôi, tôi gán lại trình xử lý mặc định và gọi lệnh nâng cao (thesig). Vấn đề với việc đó là đổ lõi "thông tin đăng ký" cho thấy trạng thái của sổ đăng ký trong trình xử lý của tôi, và không phải tại thời điểm tín hiệu ban đầu. Tôi nhận ra rằng kể từ khi tôi đã lưu ucontext_t, tôi có thể nhìn vào đó cho các giá trị đăng ký ban đầu, nhưng kiến ​​thức đó có khả năng bị mất/quên khi các bãi lõi được truyền xung quanh nhóm.Linux: Snoop một tín hiệu mà không có trashing đăng ký cho các bãi chứa lõi tiếp theo?

Vì vậy, câu hỏi của tôi là: là có một cách để reraise một tín hiệu, và đảm bảo các tập tin dump cốt lõi giữ trạng thái đăng ký của tín hiệu ban đầu? Tôi nghĩ có lẽ tôi có thể sử dụng một số asm nội tuyến để khôi phục lại tất cả các reg ở cuối của trình xử lý, sau đó quay lại lệnh đã gây ra tín hiệu thay vì gọi lệnh raise(), nhưng tôi không chắc liệu chúng ta có thể đảm bảo rằng -attempting hướng dẫn sẽ gây ra cùng một hành vi báo hiệu như là nỗ lực đầu tiên.

Trả lời

3

bản sao các siginfo_t và ucontext_t cấu trúc cho các biến toàn cầu, do đó họ có thể được truy cập trong lõi đổ

Nếu bạn tái huy động các tín hiệu trong xử lý của bạn, sau đó không cần phải sao chép bất cứ điều gì - các giá trị sẽ được trên stack và có thể truy cập trong dump cốt lõi.

"thanh ghi thông tin" hiển thị trạng thái của thanh ghi trong trình xử lý của tôi chứ không phải tại thời điểm tín hiệu gốc.

Chỉ cần up 5 (hoặc nhiều cấp độ bạn cần phải đẩy mạnh để đến điểm cố định) và info reg một lần nữa.

có cách nào để khôi phục tín hiệu và đảm bảo tệp kết xuất lõi giữ trạng thái đăng ký của tín hiệu gốc không?

Có: đặt bố cục tín hiệu thành SIG_DFL sử dụng signal(signum, SIG_DFL); và trả lại từ trình xử lý của bạn. Hướng dẫn gây ra SIGSEGV sẽ được khởi động lại, và bây giờ sẽ gây ra kết xuất lõi ngay lập tức.

+0

@ER, Điểm kết thúc chính xác đến vị trí sai. :( – sree

Các vấn đề liên quan