Tôi có một ứng dụng dòng lệnh mà khi chạy không làm những gì nó phải làm và tại một thời điểm nhất định để lại thông báo:
Segmentation fault
Điều đó có nghĩa là gì? Tôi nên làm gì?
Tôi có một ứng dụng dòng lệnh mà khi chạy không làm những gì nó phải làm và tại một thời điểm nhất định để lại thông báo:
Segmentation fault
Điều đó có nghĩa là gì? Tôi nên làm gì?
Câu trả lời:
Một lỗi phân khúc là kết quả của một sự vi phạm truy cập bộ nhớ. Chương trình đã đề cập đến một địa chỉ bộ nhớ bên ngoài những gì được phân bổ cho nó và nhân hệ điều hành đáp ứng bằng cách hủy chương trình bằng SIGSEGV.
Đây là một sai lầm, vì không có điểm nào trong việc cố gắng truy cập bộ nhớ không thể truy cập (không thể thực hiện được). Tuy nhiên, những sai lầm thuộc loại này rất dễ mắc phải, đặc biệt là trong các ngôn ngữ như C và C ++ (chiếm rất nhiều ứng dụng phổ biến). Nó chỉ ra một lỗi trong chính chương trình hoặc thư viện mà nó liên kết đến. Nếu bạn muốn báo cáo lỗi (do - điều này có ích), bạn nên bao gồm một backtrace của các sự kiện dẫn đến lỗi seg.
Để làm điều này, bạn có thể chạy chương trình bên trong gdb
(trình gỡ lỗi GNU), chương trình này nên có sẵn từ bất kỳ bản phân phối linux nào nếu nó chưa được cài đặt (gói sẽ chỉ được gọi là "gdb"). Nếu ứng dụng bị hỏng được gọi là "brokenapp":
gdb brokenapp
Một đoạn về bản quyền và cấp phép sẽ xuất hiện và ở cuối một dấu nhắc với con trỏ:
(gdb) _
Nhập run
và nhấn enter. Nếu bạn cần cung cấp các đối số (ví dụ -x --foo=bar whatever
) nối thêm các ( run -x --foo=bar whatever
). Chương trình sẽ làm những gì nó làm, bạn sẽ thấy đầu ra và nếu bạn cần tương tác bạn có thể (lưu ý bạn có thể chạy bất kỳ loại chương trình nào, bao gồm cả GUI, bên trong gdb). Tại điểm mà nó thường phân tách bạn sẽ thấy:
Program received signal SIGSEGV, Segmentation fault.
0x00000000006031c9 in ?? ()
(gdb) _
Dòng đầu ra thứ hai ở đây chỉ là một ví dụ. Bây giờ gõ bt
(cho "backtrace") và nhấn enter. Bạn sẽ thấy một cái gì đó như thế này, mặc dù nó có thể dài hơn nhiều:
(gdb) bt
#0 0x00000000006031c9 in ?? ()
#1 0x000000000040157f in mishap::what() const ()
#2 0x0000000000401377 in main ()
Nếu nó dài hơn, bạn sẽ chỉ nhận được một màn hình tại một thời điểm và sẽ có một --More--
tin nhắn. Tiếp tục nhấn enter cho đến khi hoàn thành. Bây giờ bạn có thể quit
, đầu ra sẽ vẫn ở trong thiết bị đầu cuối của bạn. Sao chép mọi thứ từ Program received signal SIGSEGV
trở đi vào tệp văn bản và gửi báo cáo lỗi với trình theo dõi lỗi của ứng dụng; bạn có thể tìm thấy chúng trực tuyến bằng cách tìm kiếm, ví dụ: "báo cáo lỗi hỏng" - bạn có thể sẽ phải đăng ký để có thể gửi thư trả lời cho bạn qua email. Bao gồm mô tả của bạn về vấn đề, bất kỳ đối số nào bạn cung cấp run
, v.v. và bản sao của backtrace (nếu quá dài, có thể có một cách để đính kèm tệp văn bản trong giao diện theo dõi lỗi). Cũng bao gồm phiên bản, nếu bạn biết nó là gì ( brokenapp --version
có thể hoạt động hoặc trang man có thể chỉ ra cách lấy cái này),
Ai đó sẽ hy vọng lấy lại cho bạn trong không quá lâu. Bọ xít là một thường được đánh giá cao.
gdb
làm rất nhiều thứ . Bạn muốn nhấp qua phần 5.1
Điều này có nghĩa là ứng dụng có lỗi.
Nếu bạn là người dùng cuối, bạn nên liên hệ với nhà cung cấp ứng dụng.
Nếu đó là ứng dụng của riêng bạn, bạn có thể:
$ ulimit -c unlimited
$ ./yourapp
$ gdb ./yourapp core
Các tệp cốt lõi cũng sẽ rất hữu ích cho các nhà phát triển ngoài chính bạn - chúng chứa toàn bộ trạng thái của chương trình tại thời điểm xảy ra sự cố; nếu bạn định nộp báo cáo lỗi, hãy đính kèm chúng và trong một số trường hợp ứng dụng của bạn là nhị phân. Xin lưu ý rằng có rất ít khả năng dữ liệu cá nhân của bạn như số tài khoản, mật khẩu và tương tự có thể vẫn còn trong bộ nhớ của chương trình tại thời điểm xảy ra sự cố. Trong nhiều trường hợp, báo cáo chỉ cần quay lại chủ đề bị lỗi là trợ giúp lớn cho các nhà phát triển để tìm ra vấn đề. Để lấy backtrace, bạn có thể tải tập tin lõi bằng trình gỡ lỗi (như gdb executable corefile
).