2010-06-23 25 views
22

Đôi khi ứng dụng của tôi đôi khi và chủ yếu trong malloc() và malloc_consolidate() khi tôi nhìn vào backtrace trong gdb.Segfaults trong malloc() và malloc_consolidate()

Tôi đã xác minh rằng máy có đủ bộ nhớ, thậm chí nó không bắt đầu hoán đổi. Tôi đã kiểm tra các gợi ý cho phân đoạn dữ liệu và kích thước bộ nhớ tối đa và cả hai được đặt thành 'không giới hạn'. Tôi cũng chạy ứng dụng dưới valgrind và không tìm thấy bất kỳ lỗi bộ nhớ nào.

Bây giờ, tôi không còn ý tưởng về những thứ khác có thể gây ra các segfaults này. Bất kỳ ý tưởng?

Cập nhật: Kể từ khi tôi không tìm thấy bất cứ điều gì với valgrind (hoặc ptrcheck), nó có thể là một ứng dụng khác đang làm dơ bẩn cấu trúc bộ nhớ libc hoặc là có một cấu trúc riêng biệt cho mỗi quá trình?

+2

Bạn đã gặp sự cố trong valgrind chưa? –

+0

Không, nó không bị hỏng. Một ứng dụng thời gian thực của nó và dưới valgrind tôi chỉ có thể đặt một tải rất nhẹ vào nó và nó thường chỉ bị treo dưới một tải nặng hơn. –

+0

Hệ điều hành nào? Đánh giá bằng toolchain, có vẻ như nó có thể là Linux. Trong trường hợp này, không, các ứng dụng khác không thể phá hủy heap của bạn; đó là một cái gì đó trong ứng dụng của bạn. Nếu điều này chỉ xảy ra khi tải, điều đó làm cho tất cả trở nên khó khăn hơn ... Tất nhiên là gì dưới tải trọng? Làm thế nào điều này có thể được làm cho bạn để thùng rác đống? Hãy thử "tra tấn" ứng dụng của bạn tốt nhất bạn có thể trong khi nó chạy dưới Valgrind ... làm sao bạn có thể tái tạo tốt nhất các điều kiện tồn tại dưới tải? Có lẽ phân bổ bộ nhớ một cách vô cớ, một cái gì đó như thế? –

Trả lời

12

Rất có thể, bạn đang băm đống - nghĩa là bạn đang viết vượt quá giới hạn của một phần bộ nhớ mà bạn đã phân bổ và điều này sẽ ghi đè cấu trúc dữ liệu mà malloc() sử dụng để quản lý heap. Điều này làm cho malloc() truy cập địa chỉ không hợp lệ và ứng dụng của bạn gặp sự cố.

Hết bộ nhớ sẽ không làm cho malloc() bị lỗi - chỉ đơn giản là trả lại NULL. Điều đó có thể khiến mã của bạn bị lỗi nếu bạn không kiểm tra NULL, nhưng trang web sự cố sẽ không nằm trong số malloc().

Hơi lạ khi Valgrind không báo cáo bất kỳ lỗi nào - nhưng có một số lỗi mà công cụ "Memcheck" mặc định có thể bỏ qua. Hãy thử chạy Valgrid với số "Ptrcheck" tool để thay thế.

+0

Nhưng không nên điều này đã hiển thị dưới valgrind? (Giả sử phạm vi kiểm tra của tôi là đủ tốt.) –

+1

Nhận xét của bạn dường như đã chồng chéo với bản chỉnh sửa của tôi - như được đề xuất ở đó, hãy thử chạy Valgrind bằng công cụ "Ptrcheck". Nếu malloc() bị treo, gần như chắc chắn bạn đang tấn công đống dữ liệu theo một cách nào đó. –

+1

Kể từ khi Valgrind Release 3.7.0 (ngày 5 tháng 11 năm 2011), công cụ ** exp-ptrcheck ** đã được đổi tên và thu nhỏ trong chức năng để _kiểm tra các overruns cho stack và mảng toàn cục_. Nó bây giờ được gọi là ** exp-sgcheck ** ("Stack và Global Array Checking"). [link] (http://valgrind.org/docs/manual/dist.news.html) – Amar

21

Từ http://www.gnu.org/s/libc/manual/html_node/Heap-Consistency-Checking.html#Heap-Consistency-Checking:

Một khả năng khác để kiểm tra và bảo vệ chống lại các lỗi trong việc sử dụng malloc, realloc và miễn phí là để thiết lập các biến môi trường MALLOC_CHECK_. Khi MALLOC_CHECK_ được thiết lập, việc triển khai thực hiện đặc biệt (kém hiệu quả) được thiết kế để có thể chịu được các lỗi đơn giản, chẳng hạn như các cuộc gọi đôi miễn phí với cùng một đối số hoặc tràn ngập một byte đơn (off-by-one) lỗi). Tuy nhiên, không phải tất cả các lỗi như vậy đều có thể bảo vệ được và rò rỉ bộ nhớ. Nếu MALLOC_CHECK_ được đặt thành 0, mọi tham chiếu heap được phát hiện âm thầm bị bỏ qua; nếu được đặt thành 1, chẩn đoán được in trên tiêu bản; nếu được đặt thành 2, hủy bỏ được gọi ngay lập tức. Điều này có thể hữu ích bởi vì nếu không, vụ tai nạn có thể xảy ra sau đó và nguyên nhân thực sự của sự cố là thì rất khó để theo dõi.