當使用的valgrind/callgrind運行我的程序,我得到以下消息很多:Valgrind的報告段溢出
==21734== brk segment overflow in thread #1: can't grow to 0x4a39000
(使用不同的地址)
注意,它不是由一個堆棧溢出消息之前。
我找不到關於此消息的任何文檔,我不知道什麼是完全溢出。
任何人都可以幫我找出問題所在嗎?這是valgrind還是我的程序問題?
當使用的valgrind/callgrind運行我的程序,我得到以下消息很多:Valgrind的報告段溢出
==21734== brk segment overflow in thread #1: can't grow to 0x4a39000
(使用不同的地址)
注意,它不是由一個堆棧溢出消息之前。
我找不到關於此消息的任何文檔,我不知道什麼是完全溢出。
任何人都可以幫我找出問題所在嗎?這是valgrind還是我的程序問題?
雖然這不是一個真正的答案,但它仍然滿足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段溢出「在這種情況下意味着」!
這是valgrind還是我的程序問題?
我不確定原因,但我認爲你可以忽略它。至少似乎有可能通過合法計劃觸發它。我回答在這裏的例子類似/ dublicate:
Valgrind的只分配8MB的BRK段,其耗盡。一個報告說,libc然後切換到討論這個valgrind bugreport中基於mmap的內存分配。
1327線從valgrind source code點用戶手冊「中看到的用戶手冊中部分限制」:
在Linux中,Valgrind的判斷啓動時的「BRK段」的尺寸使用RLIMIT_DATA rlim_cur,最小爲1 MB,最大爲8 MB。 Valgrind每次程序嘗試擴展超過啓動時確定的大小的brk段時都會輸出一條消息。大多數程序都可以正常工作,通常通過切換到使用mmap來獲得更多內存。如果你的程序真的需要一個大brk段,你必須改變8 MB硬編碼限制並重新編譯Valgrind。
有沒有人發現在哪裏更改此硬編碼限制以重新編譯?還有什麼合理的價值來改變它? – Plazgoth
添加到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將嘗試分配
我遇到了同樣的錯誤。上述方法不起作用。它要麼segfaults要麼報告brk段錯誤。 – Sandeep
[BRK](http://man7.org/linux/man-pages/man2/brk.2.html)是一個系統調用通過改變數據段的大小爲進程分配內存。如果不能增長數據段,那麼對我而言,這個錯誤與內存耗盡有關。但我不確定。 – user2079303
這是否會導致程序失敗? – Archimaredes
@Archimaredes如果我是正確的程序正常執行 - 雖然callgrind使它緩慢。 –