2012-06-22 69 views
14

Bạn có thể cho tôi biết điều gì có thể gây ra lỗi SIGABRT trong C++?Điều gì gây ra lỗi SIGABRT?

+2

Điểm tốt !! :) Tôi đã thử tìm kiếm nó nói rằng tín hiệu được gửi để hủy bỏ quá trình từ trình biên dịch sang hệ thống, nhưng trình biên dịch của tôi không nói phần nào gây ra điều này bất thường hành vi, Để n mũi tên xuống trên này, tôi hỏi cho lý do có thể.Mã của tôi là 500 dòng dài. – user1444426

+0

@ user1444426 - Biên dịch nó trong chế độ gỡ lỗi (-g với g ++), sử dụng dbx và nó sẽ tìm ra vấn đề. –

+1

@Ecatmur, trang Wikipedia không thực sự hữu ích. Tất cả những gì nó nói là 'abort' làm tăng tín hiệu đó, nhưng nó không vượt quá điều đó. Đôi khi tôi nhận được tín hiệu 'SIGABRT' trong các chương trình của mình, nhưng tôi đã * không bao giờ * gọi trực tiếp là 'hủy bỏ'. –

Trả lời

8

Điều này thường xảy ra khi các thư viện gặp phải lỗi nội bộ, vì vậy chúng gọi là hủy bỏ(), vì chúng không thể tiếp tục. Điều này có thể xảy ra khi bạn ghi đè lên một trong các cấu trúc dữ liệu của nó (ví dụ, một cấu trúc thuộc về hàm từ libc). Vì vậy, điều này có thể là v.d. libc gọi bởi vì bạn đã ghi đè lên một cái gì đó. Và sau đó ứng dụng phải chấm dứt vì không thể tiếp tục hoặc xử lý nó, được gọi là xác nhận không thành công.

10

mỗi Wikipedia,

SIGABRT được gửi bởi quá trình này với chính nó khi nó gọi là abort chức năng libc, quy định tại stdlib.h. Tín hiệu SIGABRT có thể bị bắt, nhưng nó không thể bị chặn; nếu trình xử lý tín hiệu trả về thì tất cả các luồng đang mở đều được đóng và xả và chương trình chấm dứt (bán phá giá lõi nếu thích hợp). Điều này có nghĩa là cuộc gọi abort không bao giờ trở lại. Do đặc điểm này, nó thường được sử dụng để báo hiệu các điều kiện chết người trong các thư viện hỗ trợ, các tình huống mà hoạt động hiện tại không thể hoàn thành được nhưng chương trình chính có thể thực hiện dọn dẹp trước khi thoát. Nó được sử dụng khi một xác nhận không thành công.

Điều đó có nghĩa rằng không nếu mã của bạn là gọi abort trực tiếp hay gửi bản thân tín hiệu SIGABRT qua raise, và bạn không có bất kỳ khẳng định thất bại, nguyên nhân phải có một thư viện hỗ trợ (mà có thể là libc) đã gặp lỗi nội bộ. Nếu bạn cung cấp chi tiết về chương trình của mình, chúng tôi có thể đề xuất các nguyên nhân có thể xảy ra. Thậm chí tốt hơn, nếu bạn kiểm tra một lõi hoặc chạy chương trình của bạn trong một trình gỡ lỗi, bạn sẽ có thể thu thập một dấu vết ngăn xếp, sẽ hiển thị thư viện nào khiến chương trình của bạn bị hủy bỏ.

(Nó cũng có thể là một chương trình khác trên hệ thống của bạn đang gửi chương trình của bạn SIGABRT, nhưng đây là trong nhiều trường hợp vanishingly khó xảy ra.)

3

Trên thực tế điều này thường được kích hoạt bởi các vĩ mô khẳng định:

char* foo = NULL; 
assert(foo != NULL); 

sẽ dẫn đến SIGABRT

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