Chạy ứng dụng kết thúc với phân đoạn Fault hung


Câu trả lời:


63

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 runvà 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 SIGSEGVtrở đ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 --versioncó 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.


1
Lỗi phân đoạn cũng có thể xảy ra trong các ngôn ngữ thông dịch viên (thông qua đó chủ yếu là do lỗi trong chính trình thông dịch),
Braiam

Điều này là siêu hữu ích! Có khả năng bước vào trong không? đặt dấu dừng và cố gắng tìm hiểu thêm?
Zloy Smiertniy

1
@ZloySmiertniy gdblàm rất nhiều thứ . Bạn muốn nhấp qua phần 5.1
goldilocks

11

Đ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 nó đi kèm với bản phân phối Linux, bạn nên tạo một báo cáo lỗi cho bản phân phối đó.
    • Đối với các ứng dụng phi thương mại của bên thứ ba, bạn nên báo cáo lỗi cho tác giả hoặc trình theo dõi lỗi ứng dụng cụ thể này. Thông thường bạn có thể tìm vị trí bằng cách duyệt trang web ứng dụng hoặc gói nhị phân / nguồn đã tải xuống.
    • Đối với các ứng dụng thương mại, bạn nên liên hệ với bộ phận hỗ trợ.
  • Nếu đó là ứng dụng của riêng bạn, bạn có thể:

    1. kích hoạt các tập tin cốt lõi: $ ulimit -c unlimited
    2. tái tạo sự cố: $ ./yourapp
    3. gỡ lỗi với gdb: $ 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).


Theo hộp thoại của Microsoft, bạn chỉ nên liên hệ với nhà cung cấp của mình "nếu vấn đề vẫn còn", nếu không thì đừng bận tâm. Sự cố hiếm gặp không phải là lỗi thực sự, chỉ là những lỗi có thể tái tạo.
Kaz

4
Quan sát của tôi là chất lượng phần mềm của Microsoft rất thấp trong nhiều trường hợp so với phần mềm UNIX và thật tuyệt khi trong thế giới UNIX mọi người thường không tham khảo hướng dẫn của họ.
gena2x
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.