Một lỗi phân khúc là gì?


27

Trong Ubuntu tôi đã phải đối mặt với lỗi phân đoạn nhiều lần. Một lỗi phân khúc là gì và khi nào nó xảy ra?


1
Chỉ để che đậy nó: Tôi đã có một vấn đề tương tự, trong khi các lỗi của tôi không thể tái tạo một cách đáng tin cậy và chúng đến từ (gần như) các ứng dụng ngẫu nhiên. Phát hiện ra rằng rất có thể bộ nhớ của tôi bị hỏng. Vì vậy, nếu bất kỳ chương trình nào gây ra lỗi phân tách, người ta có thể xem xét kỹ hơn về RAM.

Câu trả lời:


25

Lỗi nói lỗi phân đoạn (hoặc segfault hoặc SIGSEGV ) trong Ubuntu và các hệ điều hành khác giống Unix hoặc nói lỗi bảo vệ chung trong Windows là khi chương trình cố gắng truy cập vào một phần bộ nhớ không thể truy cập hoặc chương trình bị cấm truy cập. Lỗi phân đoạn là một loại sự cố chương trình, nghĩa là chấm dứt bất thường của chương trình. Xem các bài viết Wikipedia về tai nạn , bảo vệ bộ nhớ , lỗi phân khúc , lỗi bảo vệ tổng quát , và SIGSEGV để biết thêm thông tin (và một sự hiểu biết kết cấu hơn về chủ đề hơn được trình bày ở đây).

Một lỗi phân đoạn hầu như luôn luôn là do lỗi trong chương trình xảy ra. Tôi đoán hầu hết hoặc tất cả các lỗi phân khúc của bạn đang xảy ra từ cùng một ứng dụng. Vui lòng cung cấp thêm chi tiết về các trường hợp xảy ra lỗi phân đoạn trên máy của bạn và chương trình nào bị lỗi. Ngoài ra, vui lòng cung cấp văn bản đầy đủ và chính xác của thông báo lỗi bạn đang nhận và bất kỳ thông báo nào khác xuất hiện trước nó. Điều này sẽ giúp chúng tôi có thể cung cấp lời khuyên chi tiết cụ thể cho vấn đề của bạn (thay vì chỉ là thông tin chung về lỗi phân khúc là gì).

Cách tốt nhất để bạn cung cấp thông tin này là bạn chỉnh sửa câu hỏi của mình để đưa nó vào . Ngoài ra, nếu bạn muốn câu hỏi này chỉ nói về lỗi phân khúc nói chung, bạn có thể đăng câu hỏi mới để hỏi về nguyên nhân cụ thể gây ra lỗi phân khúc của bạn (nếu bạn làm điều này, hãy đảm bảo cung cấp tất cả các chi tiết này trong câu hỏi mới của bạn) .


may mắn thay, tất cả các lỗi phân đoạn được sửa chữa bằng cách nâng cấp os :). Câu hỏi của tôi là về lỗi phân khúc nói chung. Không cho một ứng dụng cụ thể.
Tachyons

@ Tôi không biết tôi đã chỉnh sửa câu trả lời của mình cho phù hợp. (Tôi đang giữ hướng dẫn để cung cấp thêm thông tin, vì lợi ích của những người dùng khác gặp phải lỗi phân khúc, mặc dù tôi biết rằng bạn không cần hỗ trợ cụ thể với họ ngay bây giờ.)
Eliah Kagan

Vâng, đây là về một lỗi phân khúc trong một ứng dụng. Tôi muốn hỏi về việc nó xảy ra trong một chương trình C ++ vì cùng một chương trình chạy hoàn toàn tốt trong Windows hoặc Turbo C ++ (trong rượu vang) (tôi sử dụng anjuta trong Linux). Và đây chỉ là những chương trình cơ bản chứ không phải ứng dụng (Chương trình như TREES , GRAPHS, v.v.)
Nirmik

Cảm ơn. Nhưng tôi e ngại trong hầu hết các trường hợp đặt câu hỏi về lỗi phân đoạn trong ứng dụng là không chính thức ở đây. :)
Tachyons

@Nirmik: có lẽ đó là chủ đề cho stackoverflow :)
Tachyons

4

Lỗi phân đoạn là do lỗi trong ứng dụng. Về mặt kỹ thuật, điều đó có nghĩa là ứng dụng cố gắng đọc hoặc ghi vào một phần bộ nhớ không thuộc về nó (hoặc không tồn tại). Tất nhiên, không được phép đọc hoặc ghi vào bộ nhớ của người khác và khi hệ thống (kernel) phát hiện ra điều này, nó sẽ buộc ứng dụng thoát.


0

Đã qua rồi cái thời mà mọi người thường theo dõi thông qua mã lắp ráp và gỡ lỗi một vấn đề. Abends, Dr Watson, Phân đoạn lỗi. Những ngày xanh đã qua.

Một trong những lý do cho lỗi phân đoạn là khi mã có quyền truy cập trực tiếp vào bộ nhớ bị lỗi. Khi một đoạn mã cố gắng truy cập vào đoạn bộ nhớ của một ứng dụng khác, sẽ xảy ra lỗi phân đoạn. Phân bổ bộ nhớ là một số lần di chuyển xung quanh để cho phép các khối bộ nhớ liền kề lớn hơn được phân bổ. Trong khi nó cố gắng khôi phục, kernel cố gắng lưu tất cả thông tin bộ nhớ của nó vào một tệp, trạng thái hiện tại của tất cả các ứng dụng đang chạy trên cpu và trạng thái của chúng (lệnh chạy lần cuối) vào một tệp và chỉ chết. Nó cũng sẽ cố gắng lưu trữ càng nhiều thông tin phục hồi và đóng càng nhiều tệp càng tốt, để hdd không bị hỏng liên kết.

Gỡ lỗi và sửa nó nếu bạn có thể sao chép nó thường xuyên. Nếu bạn không thể tái tạo nó, chỉ cần chắp tay, quỳ xuống và cầu nguyện như địa ngục mà bạn không thấy nó "thường xuyên".


Segfaults có thể được kích hoạt trong bất kỳ chương trình nào được viết bằng ngôn ngữ cho phép truy cập bộ nhớ trực tiếp. Họ thường sẽ không sụp đổ kernel.
Alex L.

@AlexL. đó là chính xác Tôi sẽ chỉnh sửa câu trả lời của tôi.
Siddharth

Tôi hy vọng tôi đã đại diện cho suy nghĩ của tôi một cách chính xác.
Siddharth

@AlexL. Bạn có thể vui lòng xem lại một lần nữa Tôi sẽ xóa nó, nếu nó vẫn không chính xác.
Siddharth

Thế này tốt hơn. Tuy nhiên, (1) mặc dù có thể rất hiếm khi một chương trình đặt SIGSEGVtrình xử lý thành bất kỳ thứ gì khác ngoài SIG_DFL(đó là đổ lõi và thoát cho a SIGSEGV) vì nếu bạn đang truy cập vào bộ nhớ thì bạn không nên truy cập bộ nhớ. sai và phục hồi có lẽ là không thể. (2) Lõi sẽ chỉ bị đổ khi quá trình đã bị dừng. (3) Kết xuất lõi chỉ bao gồm bộ nhớ và các thanh ghi của quá trình được kết xuất. (4) Các quy trình khác, CPU và nhân không bị ảnh hưởng bởi một segfault của quy trình khác.
Alex L.
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.