2016-03-19 90 views
1

如何才能找出哪個數組/對象/ etc是堆棧內存中最貪吃的用戶?找出哪個對象/數組使用最多堆棧內存


注意:下面是問題的原始上下文。從那以後,我意識到我對堆棧的工作原理有着嚴重的誤解。

我有一個錯誤的程序,以segfault結束。 segfault是由一個變量被藍色以外的非感性數據覆蓋而引起的......該變量在堆棧內存中。

因此,我的理解是,在程序的某個其他位置溢出了堆棧內存,這會在下一個堆棧內存緩衝區的開始處破壞變量的值。

但是,在遇到段錯誤之前,valgrind不顯示任何錯誤/警告(當使用--leak-checks = yes啓動時)。

因此,一個解決方案是找到哪些對象/數組/ etc使用大部分堆棧內存並將它們移動到堆內存。

+4

如果這個問題是一個堆棧溢出,這會有所幫助,但聽起來並不像這裏發生了什麼。問題描述表明一個錯誤的指針或一個數組索引超出範圍。 –

+0

如果您在Mac上,則可以使用樂器。否則,你可以嘗試使用[Massif](http://stackoverflow.com/questions/2473438/how-can-i-use-valgrind-for-memory-profile) – Claudiu

+0

在我看來,它聽起來不像一個堆棧溢出,而是寫入一個超出範圍的數組,覆蓋堆棧中的相鄰值。 –

回答

1

如果你在Mac上開發,那麼你可以使用Instruments,其中有一個內存分析器,它告訴你在哪裏內存被分配並聚集基於那。

否則,如果您使用的是Mac,你可以使用儀器可以使用的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

嘗試使用觀察點發現時內存寫入

+0

這至少在我看來應該是一個評論。 –

+0

@mksteve,我已經試過了,但我不認爲先溢出的變量是問題的根源。我相信我的程序中有一個變量會消耗太多的堆棧內存,但不會直接導致堆棧溢出。相反,它會將可用的堆棧內存限制到其他變量剩餘量過少的程度。現在,我如何找到導致問題的變量? –

+0

@GLorieul如果可用的堆棧內存受到限制,以至於其他變量的剩餘數量太少,它們最終會嘗試使用比可用堆棧更多的空間,這會導致堆棧溢出,而不是覆蓋變量。 –

相關問題