2016-02-01 176 views
32

當使用的valgrind/callgrind運行我的程序,我得到以下消息很多:Valgrind的報告段溢出

==21734== brk segment overflow in thread #1: can't grow to 0x4a39000 (使用不同的地址)

注意,它不是由一個堆棧溢出消息之前。

我找不到關於此消息的任何文檔,我不知道什麼是完全溢出。

任何人都可以幫我找出問題所在嗎?這是valgrind還是我的程序問題?

+2

[BRK](http://man7.org/linux/man-pages/man2/brk.2.html)是一個系統調用通過改變數據段的大小爲進程分配內存。如果不能增長數據段,那麼對我而言,這個錯誤與內存耗盡有關。但我不確定。 – user2079303

+0

這是否會導致程序失敗? – Archimaredes

+0

@Archimaredes如果我是正確的程序正常執行 - 雖然callgrind使它緩慢。 –

回答

4

雖然這不是一個真正的答案,但它仍然滿足OP的 「找不到任何文檔」 的要求:

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

包含行討論的消息1322

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

是引入該功能的提交,並提交相應的提交消息

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

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

從那裏我們可以進一步轉達這個問題,那些誰可以給出一個合格的答案「究竟是什麼」brk段溢出「在這種情況下意味着」!

6

Valgrind的只分配8MB的BRK段,其耗盡。一個報告說,libc然後切換到討論這個valgrind bugreport中基於mmap的內存分配。

16

1327線從valgrind source code點用戶手冊「中看到的用戶手冊中部分限制」:

Limits section item 1:

在Linux中,Valgrind的判斷啓動時的「BRK段」的尺寸使用RLIMIT_DATA rlim_cur,最小爲1 MB,最大爲8 MB。 Valgrind每次程序嘗試擴展超過啓動時確定的大小的brk段時都會輸出一條消息。大多數程序都可以正常工作,通常通過切換到使用mmap來獲得更多內存。如果你的程序真的需要一個大brk段,你必須改變8 MB硬編碼限制並重新編譯Valgrind。

+2

有沒有人發現在哪裏更改此硬編碼限制以重新編譯?還有什麼合理的價值來改變它? – Plazgoth

2

添加到Piwi的答案中,有時您的程序需要Callgrind使用更大的brk段(取決於您的實現,最高爲GB)。

要根據自己的需要

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

和重建的valgrind修改硬編碼限制,去功能VG_(ii_create_image)coregrind/m_initimg/initimg-linux.c(約1000線),更改以下行。

m8是最大BRK段大小callgrind將嘗試分配

+0

我遇到了同樣的錯誤。上述方法不起作用。它要麼segfaults要麼報告brk段錯誤。 – Sandeep

相關問題