web-dev-qa-db-ja.com

セグメントオーバーフローを報告するValgrind

Valgrind/callgrindでプログラムを実行すると、次のメッセージが頻繁に表示されます。

==21734== brk segment overflow in thread #1: can't grow to 0x4a39000(異なるアドレスで)

スタックオーバーフローメッセージが先行していないことに注意してください。

このメッセージに関するドキュメントを見つけることができず、何が正確にあふれているのかわかりません。

誰が問題が何であるかを理解するのを助けることができますか?これはvalgrindの問題ですか、それとも私のプログラムの問題ですか?

43
Tim Kuipers

valgrind source code の1327行目はユーザーマニュアルを指します。「ユーザーマニュアルの制限事項を参照してください」:

制限項目の項目1:

Linuxでは、ValgrindはRLIMIT_DATA rlim_curを使用して、最小1 MB、最大8 MBの「brkセグメント」のサイズを起動時に決定します。 Valgrindは、プログラムが起動時に決定されたサイズを超えてbrkセグメントを拡張しようとするたびにメッセージを出力します。通常、より多くのメモリを取得するためにmmapの使用に切り替えることにより、ほとんどのプログラムはこの制限で適切に動作します。プログラムに大きなbrkセグメントが本当に必要な場合は、8 MBのハードコードされた制限を変更し、Valgrindを再コンパイルする必要があります。

20
Piwi

Valgrindはbrkセグメントに8MBのみを割り当てますが、これはなくなります。 libcが valgrindバグレポート でmmapベースのメモリ割り当てに切り替えていると報告しています。

9
sylvain.joyeux

これは実際には答えではありませんが、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
iksemyonov

Piwiの答えに加えて、プログラムでCallgrindに大きなbrkセグメント(実装に応じてGBまで)を使用するよう要求する場合があります。

ハードコードされた制限を変更するには、_coregrind/m_initimg/initimg-linux.c_の関数VG_(ii_create_image)(1000行目付近)に移動し、必要に応じて次の行を変更します

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

valgrindを再構築します。

_m8_は、callgrindが割り当てようとする最大brkセグメントサイズです。

3
Fimbres

これはvalgrindの問題ですか、それとも私のプログラムの問題ですか?

理由は定かではありませんが、無視してもかまいません。少なくとも、合法的なプログラムでそれを引き起こすことは可能だと思われます。私はここに例を挙げて同様の/公言に答えました:

Valgrindレポート "スレッド#1でのセグメントオーバーフローのブロック"

1