Tôi đã đặt breakpoint về xuất cảnh, _exit và chương trình của tôi (ứng dụng đa luồng, chạy trên linux 2.6.16.46-0.12 SLES10), là bằng cách nào đó vẫn thoát trong một cách mà tôi không thể xác định vị tríthiết lập điểm ngắt thoát gdb không hoạt động?
(gdb) c ... [New Thread 47513671297344 (LWP 15279)] [New Thread 47513667103040 (LWP 15280)] [New Thread 47513662908736 (LWP 15281)] Program exited with code 0177. (gdb)
lối ra các hàm nằm trong libc do đó không có vấn đề về thư viện được tải xuống bị trì hoãn. Bất kỳ ai biết về một số kích hoạt bí ẩn khác cho lối ra mà không thể bị bắt?
CHỈNH SỬA: sự cố hiện chỉ mang tính chất học thuật. Tôi đã thử gỡ lỗi tìm kiếm nhị phân, sao lưu một tập hợp con các thay đổi của tôi (sự cố đã biến mất). Sau khi tôi áp dụng chúng một lần nữa theo thứ tự, tôi không còn có thể repro vấn đề, ngay cả với những thứ khôi phục lại trạng thái ban đầu.
EDIT2: Gần đây, tôi đã tìm thấy một lý do cho loại lỗi này, đây có thể là nguồn gốc cho vấn đề này. Vì lý do lịch sử, sản phẩm của chúng tôi sử dụng cờ liên kết độc ác -Bymymbolic. Trong số các tác dụng phụ của điều này là khi một biểu tượng không xác định nhưng được gọi, trình liên kết thời gian chạy GLIBC sẽ ném bom theo cách này, và bạn thấy nó trong trình gỡ lỗi như một quá trình đã thoát với 0177. Khi trình liên kết thời gian chạy hủy theo cách này, tôi 'd đoán nó làm cho syscall để _exit trực tiếp (thay vì sử dụng thư viện thời gian chạy C exit() hoặc _exit()). Điều đó sẽ phù hợp với thực tế là tôi không thể bắt được điều này với các điểm ngắt xuất cảnh trong trình gỡ rối.
Tôi sẽ cố gắng xây dựng gdb 7 và xem những gì nó hiển thị. các * & cung cấp cho các địa chỉ hướng dẫn tương tự:
(Trông giống như một syscall khá chuẩn). Tôi nghĩ rằng tôi đã ít nhất là cô lập sự thay đổi mã dẫn đến lối ra bí ẩn này, chỉ cần không hiểu các chi tiết được nêu ra. –Sẽ tốt hơn nếu sử dụng 'catch syscall exit' và' catch syscall exit_group' thay vì giá trị số. Trên hệ thống của tôi, ví dụ, 'thoát' là' [1] 'không' [60] '. – Ruslan
Ngoài ra, bạn có thể đặt cả hai cùng lúc với 'catch syscall exit exit_group'. Trong thực tế, chỉnh sửa nó ngay bây giờ ... –