2016-02-01 15 views
32

Khi chạy chương trình của tôi với valgrind/callgrind tôi nhận được thông báo sau rất nhiều:Valgrind báo cáo một đoạn tràn

==21734== brk segment overflow in thread #1: can't grow to 0x4a39000 (với địa chỉ khác nhau)

Lưu ý rằng nó không được đi trước bởi một thông điệp stack overflow .

Tôi không thể tìm thấy bất kỳ tài liệu nào về thư này và tôi không biết chính xác những gì đang tràn chính xác.

Ai đó có thể giúp tôi tìm ra vấn đề là gì không? Đây có phải là vấn đề về valgrind hay chương trình của tôi không?

+2

[brk] (http://man7.org/linux/man-pages/man2/brk.2.html) là một cuộc gọi hệ thống phân bổ bộ nhớ cho một quá trình bằng cách thay đổi kích thước của phân đoạn dữ liệu. Việc không phát triển phân đoạn dữ liệu có ý nghĩa với tôi, rằng lỗi này là do bộ nhớ sắp hết. Nhưng tôi không chắc chắn. – user2079303

+0

Điều này có khiến chương trình của bạn thất bại không? – Archimaredes

+0

@Archimaredes Nếu tôi đúng chương trình thực hiện bình thường - mặc dù callgrind làm cho nó awefully chậm. –

Trả lời

4

Trong khi điều này là không thực sự là một câu trả lời, nó vẫn đáp ứng OP của "không thể tìm thấy bất kỳ tài liệu" Yêu cầu:

1) http://repo.or.cz/valgrind.git/blob/HEAD:/coregrind/m_syswrap/syswrap-generic.c

chứa thông điệp được thảo luận tại dòng 1322

2) http://sourceforge.net/p/valgrind/mailman/message/34068401/

là cam kết giới thiệu đối tượng địa lý và thông báo cam kết tương ứng đọc

Author: florian 
Date: Wed Apr 29 13:59:16 2015 
New Revision: 15155 

Log: Issue an error message if then brk segment overflows. 

từ đó chúng tôi có thể tiếp tục chuyển tiếp câu hỏi này cho những người có thể đưa ra câu trả lời đủ điều kiện cho "chính xác", một phân đoạn brk tràn "có nghĩa là trong ngữ cảnh này"!

1

Đây có phải là vấn đề về valgrind hoặc chương trình của tôi không?

Tôi không chắc chắn lý do, nhưng tôi nghĩ bạn có thể bỏ qua nó. Ít nhất nó dường như có thể kích hoạt nó với các chương trình pháp lý. Tôi đã trả lời tương tự/dublicate với một ví dụ ở đây:

Valgrind reporting "brk segment overflow in thread #1"

6

Valgrind chỉ phân bổ 8MB đối với phân khúc brk, mà chạy ra ngoài. Một báo cáo rằng libc sau đó chuyển sang cấp phát bộ nhớ dựa trên mmap trong số valgrind bugreport thảo luận về điều này.

16

Dòng 1327 từ valgrind source code điểm để hướng dẫn sử dụng, "nhìn thấy Hạn chế phần trong hướng dẫn sử dụng":

Limits section item 1:

Trên Linux, Valgrind xác định lúc khởi động kích thước của 'phân khúc brk' sử dụng RLIMIT_DATA rlim_cur, tối thiểu là 1 MB và tối đa là 8 MB. Valgrind xuất ra một thông điệp mỗi khi một chương trình cố gắng mở rộng phân đoạn brk ngoài kích thước được xác định khi khởi động. Hầu hết các chương trình sẽ hoạt động đúng với giới hạn này, thường bằng cách chuyển sang sử dụng mmap để có thêm bộ nhớ. Nếu chương trình của bạn thực sự cần một phân đoạn brk lớn, bạn phải thay đổi giới hạn hardcoded 8 MB và biên dịch lại Valgrind.

+2

Có ai tìm thấy nơi thay đổi giới hạn mã hóa này để biên dịch lại không? Ngoài ra những giá trị hợp lý để thay đổi nó là gì? – Plazgoth

2

Thêm vào câu trả lời của Piwi, đôi khi chương trình của bạn sẽ yêu cầu Callgrind sử dụng phân đoạn brk lớn hơn (tối đa GB, tùy thuộc vào việc triển khai của bạn).

Để sửa đổi giới hạn mã hóa cứng, hãy để chức năng VG_(ii_create_image) trong coregrind/m_initimg/initimg-linux.c (khoảng dòng 1000), thay đổi dòng sau theo yêu cầu của bạn

SizeT m1 = 1024 * 1024; 
SizeT m8 = 8 * m1; 

và xây dựng lại valgrind.

m8 là max brk kích thước phân khúc callgrind sẽ cố gắng phân bổ

+0

Tôi đã gặp lỗi tương tự. Cách tiếp cận trên không hoạt động. Nó hoặc là segfaults hoặc báo cáo lỗi phân đoạn brk. – Sandeep

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