2009-04-22 36 views
9

Đôi khi khi tôi chạy mã của mình, tệp kết xuất lõi được tạo khi tôi chấm dứt chương trình theo Ctrl + \. Tên tệp có dạng core.*. Chương trình không chấm dứt đột ngột và không có lỗi phân đoạn. Tôi tin rằng đó là SIGQUIT và không phải SIGABRT hoặc SIGSEGV. Nếu tôi thử Ctrl + C hoặc Ctrl + Z, sau đó nó không được tạo.Tại sao tệp kết xuất lõi được tạo ra?

Mọi người có thể cho biết lý do chỉ tạo ra khi Ctrl + \ được nhấn? Làm thế nào tôi có thể tránh tập tin kết xuất lõi này được tạo ra? Có sử dụng cho các tập tin đổ cốt lõi?

+0

Khi bạn nói "chạy mã của tôi", bạn có đang nói về khi bạn chạy không? Hoặc khi bạn chạy nhị phân biên dịch? – harto

Trả lời

17

Một quá trình đổ lõi khi nó bị hệ điều hành chấm dứt do lỗi trong chương trình. Lý do điển hình nhất xảy ra là vì chương trình đã truy cập một giá trị con trỏ không hợp lệ. Cho rằng bạn có một bãi chứa rời rạc, có thể bạn đang sử dụng một con trỏ chưa được khởi tạo.

Bạn có thể đăng mã gây ra lỗi không? Khác với khái quát hóa mơ hồ, thật khó để đoán những gì sai mà không thực sự nhìn thấy mã.

Đối với những gì một bãi chứa lõi thực sự là, kiểm tra bài viết Wikipedia này:

+5

Trong Linux, Ctrl + \ gây ra một kết xuất lõi, ngay cả khi chương trình không có lỗi và đang chạy tốt tại thời điểm chấm dứt. – ely

5

Đó là một công cụ để hỗ trợ trong gỡ lỗi một ứng dụng đó là hành vi xấu. Nó lớn vì nó chứa nội dung của tất cả các ứng dụng bộ nhớ vật lý tại thời điểm nó chết cũng như các trạng thái đăng ký và ngăn xếp của tất cả các chủ đề của nó.

Chúng được tạo khi hạt nhân giết ứng dụng để làm điều gì đó xấu xa, như tạo vi phạm phân đoạn hoặc lỗi xe buýt.

+0

Hum ... Nó chỉ chứa một bãi chứa của bộ nhớ processus, nhưng vẫn còn, nó có thể được khá nhiều bộ nhớ. – Ben

7

Vết lõi được tạo khi quá trình nhận các tín hiệu nhất định, chẳng hạn như SIGSEGV, hạt nhân gửi nó khi nó truy cập bộ nhớ ngoài vùng địa chỉ của nó. Thông thường điều đó xảy ra do lỗi trong cách sử dụng con trỏ. Điều đó có nghĩa là có lỗi trong chương trình.

Kết xuất lõi rất hữu ích để tìm lỗi. Nó là một hình ảnh của bộ nhớ của quá trình tại thời điểm của vấn đề, do đó, một trình gỡ rối như gdb có thể được sử dụng để xem những gì chương trình đã làm sau đó. Trình gỡ rối thậm chí có thể truy cập (đôi khi) các giá trị của các biến trong chương trình.

Bạn có thể ngăn chặn các vùng lõi xảy ra bằng lệnh ulimit.

10

Như đã nói bởi những người khác trước khi kết xuất lõi là kết quả của lỗi trong chương trình.

Bạn có thể định cấu hình để tạo kết xuất lõi bằng lệnh ulimit. Nhập

ulimit -c 0 

vô hiệu hóa tạo tệp lõi trong vỏ đang hoạt động.

Nếu chương trình đã tạo ra cốt lõi được xây dựng với các thông tin biểu tượng bạn có thể làm một post mortem debugging session như thế này:

gdb <pathto/executable> --core <corefilename> 
2

Bạn có thể tránh việc tạo ra một tập tin dump lõi bằng cách viết code mà không sụp đổ :)

Nghiêm túc, các bãi lõi hữu ích vì bạn có thể thấy trạng thái của chương trình khi nó bị lỗi, để gỡ lỗi "đăng bài". Bạn có thể mở chúng trong gdb và kiểm tra trạng thái chương trình của bạn (đặc biệt nếu nó được xây dựng với gỡ lỗi).

Vết lõi thường được thực hiện nếu chương trình có SIGSEGV (thường do dereferencing con trỏ không hợp lệ), SIGABRT (sẽ xảy ra nếu bạn gọi abort() hoặc trong C++ bằng trình xử lý kết thúc mặc định() cho ngoại lệ trong trình phá hủy vv) hoặc một số lỗi khác. Bạn cũng có thể kích hoạt chúng một cách rõ ràng với trình gỡ lỗi hoặc lập trình.

Nếu bạn đã sửa tất cả các lỗi và nó hoàn hảo, bạn có thể xóa chúng. Ngoài ra, nếu bạn đã thay đổi chương trình của mình theo bất kỳ cách nào (và biên dịch lại) thì chúng sẽ trở nên vô ích vì thông tin gỡ lỗi hiện không khớp với những gì trong vùng lõi, vì vậy bạn có thể xóa chúng sau đó.

6

ctrl + \ gửi tín hiệu SIGQUIT đến quy trình. Theo tiêu chuẩn POSIX.1, hành động mặc định cho tín hiệu này là tạo ra một lõi.

SIGILL, SIGABRT, SIGFPE, SIGSEGV là các trường hợp khác khi hệ thống sẽ tạo lõi.

Vui lòng tham khảo "man 7 signal" trên hệ thống của bạn để biết thêm chi tiết.

1

Điểm Ctrl + \ là tạo ra kết xuất lõi. Đó là những gì SIGQUIT thực hiện. Nếu bạn không muốn nó được tạo, thay vào đó hãy sử dụng Ctrl + C (SIGINT). Nếu chương trình được đề cập không phản hồi SIGINT nhưng bạn cần phải xóa chương trình đó khỏi thiết bị đầu cuối, hoặc bạn hoặc nhà phát triển đang làm điều gì đó sai.

Chương Trình thiết kế không bị giết từ nhà ga với Ctrl +C vẫn nên đáp ứng một cách duyên dáng để SIGTERM, có thể được kích hoạt trong thiết bị đầu cuối khác thông qua kill -TERM .... Nếu tất cả đều thất bại, SIGKILL sẽ buộc chấm dứt ngay lập tức.

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