2016-03-19 3 views
1

どのような配列/オブジェクト/ etcがスタックメモリの最も貪欲なユーザーであるかを知るにはどうすればよいですか?どのオブジェクト/アレイが大部分のスタックメモリを使用しているかを調べる


注:以下は、元の質問です。それ以来、私はスタックの仕組みに深刻な誤解があったことに気付きました。

私はsegfaultで終了するバグのあるプログラムを持っています。 segfaultは、青色のうちの非理想的な値で上書きされる変数によって引き起こされます。その変数はスタックメモリ内にあります。

私の理解は、次のスタックメモリバッファの先頭にある変数の値を破壊するプログラムの別の場所でスタックメモリのオーバーフローが発生していることです。

しかし、valgrindは、segfaultに遭遇する前に、エラー/警告(--leak-checks = yesで起動したとき)を表示しません。

したがって、解決策は、どのオブジェクト/配列/ etcがスタックメモリのほとんどを使用してヒープメモリに移動するのかを見つけることです。

+4

問題は、スタックオーバーフローした場合のは役立つだろうが、それはここで何が起こっているかのような音はありません。問題の説明では、範囲外の不良ポインタまたは配列インデックスが示唆されています。 –

+0

Macを使用している場合は、Instrumentsを使用できます。そうでなければ[Massif](http://stackoverflow.com/questions/2473438/how-can-i-use-valgrind-for-memory-profile)を試すことができます – Claudiu

+0

私の意見では、スタックのようには聞こえませんオーバーフローするのではなく、その範囲外の配列に書き込んで、隣接する値を上書きしてスタックに配置します。 –

答えて

1

を書かされたときに見つけるために、ウォッチポイントを使用してみてくださいそれ。

そうしないと、あなたはマックを使っている場合は、インスツルメントを使用することができますvalgrindののMassifツール

を使用することができます。それ以外の場合はMassifを試してみてください。 Massif manualからの出力例:

-------------------------------------------------------------------------------- 
    n  time(B)   total(B) useful-heap(B) extra-heap(B) stacks(B) 
-------------------------------------------------------------------------------- 
10   10,080   10,080   10,000   80   0 
11   12,088   12,088   12,000   88   0 
12   16,096   16,096   16,000   96   0 
13   20,104   20,104   20,000   104   0 
14   20,104   20,104   20,000   104   0 
99.48% (20,000B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc. 
->49.74% (10,000B) 0x804841A: main (example.c:20) 
| 
->39.79% (8,000B) 0x80483C2: g (example.c:5) 
| ->19.90% (4,000B) 0x80483E2: f (example.c:11) 
| | ->19.90% (4,000B) 0x8048431: main (example.c:23) 
| | 
| ->19.90% (4,000B) 0x8048436: main (example.c:25) 
| 
->09.95% (2,000B) 0x80483DA: f (example.c:10) 
    ->09.95% (2,000B) 0x8048431: main (example.c:23) 
0

メモリは、それに基づいて集計を割り当てましたがわかりますメモリプロファイラを持っている、あなたがMac上で開発している場合、あなたはInstrumentsを使用することができ、メモリが

+0

これは、少なくとも私の意見では、コメントだったはずです。 –

+0

@mksteve、私はすでにそれを試みましたが、最初にオーバーフローする変数が問題の根源だとは思われません。スタックのメモリをあまりにも多く消費するが、スタックのオーバーフローを直接引き起こさないプログラムのどこかに変数があると私は信じています。代わりに、使用可能なスタックメモリを、他の変数の残量が少なすぎる程度に制限します。さて、問題の原因となる変数はどうやって見つけられますか? –

+0

@GLorieul利用可能なスタックメモリが制限されて_ _他の変数のleft_があまりにも小さすぎると、最終的に使用可能なものよりも多くのスタック領域を使用しようとしますが、変数の上書きではなくスタックオーバーフローが発生します。 –

関連する問題