Segmentation Fault (Core Dumped) Là Gì

Một trong số các vấn đề làm đau đầu các developer khi lập trình trên Linux là điều tra các lỗi chết chương trình bất thình lình – crash. Rất nhiều anh em dev tỏ ra khá hoảng loạn và lúng túng khi bỗng dưng chương trình lăn ra chết với thông báo kiểu như thế này.

Bạn đang xem: Segmentation fault (core dumped) là gì

Segmentation faulthoặcAborted (core dumped)

Trong bài này mình muốn chia sẻ với anh em một số kỹ năng debug để đối mặt với các lỗi chết chương trình như thế này. Bình tĩnh, tự tin và “giết bug”.

 “Segmentation fault” là gì ?

Khi chương trình của chúng ta chạy, nó truy cập đến các phần khác nhau của bộ nhớ. Đầu tiên, chúng ta có các biến local nằm trong “stack”. Thứ hai, chúng ta cũng có thể có các vùng nhớ được cấp phát trong quá trình chạy (runtime) sử dụng malloc/calloc/realloc (trong C), new (trong C++) và nằm trong “heap”. Chương trình chỉ được phép truy cập đến vùng nhớ thuộc quyền quản lý của nó mà thôi. Bất cứ truy cập vào vùng nhớ nào nằm phạm vi cho phép của chương trình sẽ dẫn đến lỗi “Segmentation fault”.

Xem thêm: Cây Đinh Lăng Lá Nhỏ, Lá Kim

Có 5 lỗi phổ biến dẫn đến lỗi “segmentation fault” đó là

Dereferencing con trỏ NULL Dereferencing con trỏ chưa được khởi tạo Dereferencing con trỏ đã bị free hoặc delete Ghi giá trị vượt quá giới hạn của mảng Hàm đệ quy sử dụng hết vùng bộ dành cho stack – còn gọi là “stack overflow”

“Core dump” là gì ?

Bất cứ khi nào một ứng dụng gặp sự cố gây ra crash (gọi nôm nà là chết chương trình), hệ điều hành sẽ lưu trữ (hoặc gửi) báo cáo về lỗi đó. Trên Windows, chúng ta sẽ nhận được một hộp thoại thông báo lỗi và chúng ta có thể click vào button để debug lỗi (với điều kiện có source code và app được biên dịch ở chế độ debug).

*

Trên Linux, bất cứ khi nào một ứng dụng bị crash (thông thường nhất là gây ra bởi “Segmentation fault”), nó có tùy chọn tạo ra một file lưu vết lỗi gọi là “core dump” (trong hầu hết các trường hợp, cài đặt mặc định của Linux sẽ tắt tính năng này). Core dump là một file lưu lại trạng thái của chương trình tại thời điểm mà nó chết. Nó cũng là bản sao lưu lại tất cả các vùng bộ nhớ ảo đã được truy cập bởi chương trình.

Làm thế nào bật tính năng tạo file “core dump” khi app crash, và file này nằm ở đâu ?

Việc này phụ thuộc vào bản phân phối và cấu hình con Linux của bạn. Để cho đơn giản thì ở đây mình lấy ví dụ trên Ubuntu desktop. Các phiên bản khác của Linux cũng tương tự thôi, anh em có thể search thêm trên google. Để bật tính năng tự động tạo file core dump, chúng ta cần phải cho Linux biết kích thước cho phép của file core dump là bao nhiêu. Sử dụng lệnh ulimit để thiết lập: